@roomi-fields/notebooklm-mcp 1.3.6 → 1.5.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 +22 -22
- package/README.md +71 -34
- package/deployment/INDEX.md +292 -0
- package/deployment/PACKAGE-FILES.txt +180 -0
- package/deployment/QUICK-START.md +100 -0
- package/deployment/docs/01-INSTALL.md +611 -0
- package/deployment/docs/02-CONFIGURATION.md +404 -0
- package/deployment/docs/03-API.md +1691 -0
- package/deployment/docs/04-N8N-INTEGRATION.md +373 -0
- package/deployment/docs/05-TROUBLESHOOTING.md +429 -0
- package/deployment/docs/06-NOTEBOOK-LIBRARY.md +692 -0
- package/deployment/docs/07-AUTO-DISCOVERY.md +236 -0
- package/deployment/docs/08-WSL-USAGE.md +363 -0
- package/deployment/docs/09-MULTI-INTERFACE.md +293 -0
- package/deployment/docs/10-CONTENT-MANAGEMENT.md +421 -0
- package/deployment/docs/11-MULTI-ACCOUNT.md +295 -0
- package/deployment/docs/README.md +207 -0
- package/deployment/scripts/README.md +564 -0
- package/deployment/scripts/install.ps1 +114 -0
- package/deployment/scripts/setup-auth.ps1 +217 -0
- package/deployment/scripts/start-server.ps1 +72 -0
- package/deployment/scripts/stop-server.ps1 +51 -0
- package/deployment/scripts/test-api.ps1 +651 -0
- package/deployment/scripts/test-auth.ps1 +323 -0
- package/deployment/scripts/test-auto-discovery.ps1 +295 -0
- package/deployment/scripts/test-cors.ps1 +398 -0
- package/deployment/scripts/test-errors.ps1 +581 -0
- package/deployment/scripts/test-server.ps1 +140 -0
- package/deployment/scripts/test-sessions.ps1 +426 -0
- package/deployment/scripts/test-validation.ps1 +299 -0
- package/dist/accounts/account-manager.d.ts +163 -0
- package/dist/accounts/account-manager.d.ts.map +1 -0
- package/dist/accounts/account-manager.js +614 -0
- package/dist/accounts/account-manager.js.map +1 -0
- package/dist/accounts/auto-login-manager.d.ts +62 -0
- package/dist/accounts/auto-login-manager.d.ts.map +1 -0
- package/dist/accounts/auto-login-manager.js +537 -0
- package/dist/accounts/auto-login-manager.js.map +1 -0
- package/dist/accounts/crypto.d.ts +45 -0
- package/dist/accounts/crypto.d.ts.map +1 -0
- package/dist/accounts/crypto.js +138 -0
- package/dist/accounts/crypto.js.map +1 -0
- package/dist/accounts/index.d.ts +14 -0
- package/dist/accounts/index.d.ts.map +1 -0
- package/dist/accounts/index.js +14 -0
- package/dist/accounts/index.js.map +1 -0
- package/dist/accounts/types.d.ts +103 -0
- package/dist/accounts/types.d.ts.map +1 -0
- package/dist/accounts/types.js +7 -0
- package/dist/accounts/types.js.map +1 -0
- package/dist/auth/auth-manager.d.ts +9 -2
- package/dist/auth/auth-manager.d.ts.map +1 -1
- package/dist/auth/auth-manager.js +60 -6
- package/dist/auth/auth-manager.js.map +1 -1
- package/dist/auto-discovery/auto-discovery.d.ts.map +1 -1
- package/dist/auto-discovery/auto-discovery.js +2 -1
- package/dist/auto-discovery/auto-discovery.js.map +1 -1
- package/dist/cli/accounts.d.ts +13 -0
- package/dist/cli/accounts.d.ts.map +1 -0
- package/dist/cli/accounts.js +195 -0
- package/dist/cli/accounts.js.map +1 -0
- package/dist/config.d.ts +1 -0
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +24 -0
- package/dist/config.js.map +1 -1
- package/dist/content/content-generator.d.ts +153 -0
- package/dist/content/content-generator.d.ts.map +1 -0
- package/dist/content/content-generator.js +637 -0
- package/dist/content/content-generator.js.map +1 -0
- package/dist/content/content-manager.d.ts +364 -0
- package/dist/content/content-manager.d.ts.map +1 -0
- package/dist/content/content-manager.js +3841 -0
- package/dist/content/content-manager.js.map +1 -0
- package/dist/content/content-templates.d.ts +183 -0
- package/dist/content/content-templates.d.ts.map +1 -0
- package/dist/content/content-templates.js +719 -0
- package/dist/content/content-templates.js.map +1 -0
- package/dist/content/index.d.ts +14 -0
- package/dist/content/index.d.ts.map +1 -0
- package/dist/content/index.js +14 -0
- package/dist/content/index.js.map +1 -0
- package/dist/content/types.d.ts +285 -0
- package/dist/content/types.d.ts.map +1 -0
- package/dist/content/types.js +10 -0
- package/dist/content/types.js.map +1 -0
- package/dist/errors.d.ts +1 -1
- package/dist/errors.d.ts.map +1 -1
- package/dist/errors.js.map +1 -1
- package/dist/http-wrapper.d.ts +7 -0
- package/dist/http-wrapper.d.ts.map +1 -1
- package/dist/http-wrapper.js +449 -29
- package/dist/http-wrapper.js.map +1 -1
- package/dist/i18n/en.json +120 -0
- package/dist/i18n/fr.json +120 -0
- package/dist/i18n/index.d.ts +168 -0
- package/dist/i18n/index.d.ts.map +1 -0
- package/dist/i18n/index.js +213 -0
- package/dist/i18n/index.js.map +1 -0
- package/dist/index.js +26 -2
- package/dist/index.js.map +1 -1
- package/dist/library/notebook-library.d.ts +4 -0
- package/dist/library/notebook-library.d.ts.map +1 -1
- package/dist/library/notebook-library.js +20 -3
- package/dist/library/notebook-library.js.map +1 -1
- package/dist/session/browser-session.d.ts +35 -8
- package/dist/session/browser-session.d.ts.map +1 -1
- package/dist/session/browser-session.js +243 -28
- package/dist/session/browser-session.js.map +1 -1
- package/dist/session/session-manager.d.ts +6 -0
- package/dist/session/session-manager.d.ts.map +1 -1
- package/dist/session/session-manager.js +46 -14
- package/dist/session/session-manager.js.map +1 -1
- package/dist/session/shared-context-manager.d.ts +3 -3
- package/dist/session/shared-context-manager.d.ts.map +1 -1
- package/dist/session/shared-context-manager.js +10 -7
- package/dist/session/shared-context-manager.js.map +1 -1
- package/dist/stdio-http-proxy.d.ts +24 -0
- package/dist/stdio-http-proxy.d.ts.map +1 -0
- package/dist/stdio-http-proxy.js +592 -0
- package/dist/stdio-http-proxy.js.map +1 -0
- package/dist/tools/index.d.ts +106 -1
- package/dist/tools/index.d.ts.map +1 -1
- package/dist/tools/index.js +1028 -7
- package/dist/tools/index.js.map +1 -1
- package/dist/types.d.ts +81 -17
- package/dist/types.d.ts.map +1 -1
- package/dist/utils/citation-extractor.d.ts +66 -0
- package/dist/utils/citation-extractor.d.ts.map +1 -0
- package/dist/utils/citation-extractor.js +492 -0
- package/dist/utils/citation-extractor.js.map +1 -0
- package/dist/utils/page-utils.d.ts +8 -0
- package/dist/utils/page-utils.d.ts.map +1 -1
- package/dist/utils/page-utils.js +112 -8
- package/dist/utils/page-utils.js.map +1 -1
- package/docs/ADDING_A_LANGUAGE.md +209 -0
- package/docs/ARCHITECTURE_MIGRATION_STUDY.md +894 -0
- package/docs/CHROME_PROFILE_LIMITATION.md +15 -1
- package/docs/MULTI_ACCOUNT_SYSTEM.md +304 -0
- package/package.json +15 -12
- package/scripts/archive/add-and-activate-notebook.ps1 +31 -0
- package/scripts/archive/add-new-notebook.ps1 +25 -0
- package/scripts/archive/add-rom1pey.ps1 +2 -0
- package/scripts/archive/add-rpmonster.ps1 +2 -0
- package/scripts/archive/add-source-debug.ps1 +11 -0
- package/scripts/archive/add-source-e2e.ps1 +28 -0
- package/scripts/archive/add-source-visible.ps1 +11 -0
- package/scripts/archive/add-test-notebook.ps1 +13 -0
- package/scripts/archive/add-test-source.ps1 +50 -0
- package/scripts/archive/capture-screen.ps1 +11 -0
- package/scripts/archive/change-language.mjs +45 -0
- package/scripts/archive/change-language.ts +44 -0
- package/scripts/archive/check-account.ps1 +19 -0
- package/scripts/archive/check-notebook-2.ps1 +8 -0
- package/scripts/archive/check-test-notebook.ps1 +11 -0
- package/scripts/archive/create-notebook-auto.ps1 +31 -0
- package/scripts/archive/create-notebook.ps1 +8 -0
- package/scripts/archive/create-rom1pey-notebook.ps1 +19 -0
- package/scripts/archive/create-rom1pey.ps1 +8 -0
- package/scripts/archive/create-test-notebook-fresh.ps1 +21 -0
- package/scripts/archive/create-test-notebook.ps1 +16 -0
- package/scripts/archive/debug-add-source-auto.ps1 +29 -0
- package/scripts/archive/debug-add-source.ps1 +19 -0
- package/scripts/archive/debug-add-text-source.ps1 +47 -0
- package/scripts/archive/debug-home.ps1 +10 -0
- package/scripts/archive/debug-selectors.ps1 +55 -0
- package/scripts/archive/debug-sources-panel.ps1 +22 -0
- package/scripts/archive/debug-ui.ps1 +17 -0
- package/scripts/archive/discover-home.ps1 +26 -0
- package/scripts/archive/kill-automation-chrome.ps1 +37 -0
- package/scripts/archive/list-my-notebooks.ps1 +27 -0
- package/scripts/archive/navigate-home-visible.ps1 +23 -0
- package/scripts/archive/navigate-home.ps1 +15 -0
- package/scripts/archive/run-e2e-english.ps1 +111 -0
- package/scripts/archive/run-e2e-rom1pey-v2.ps1 +122 -0
- package/scripts/archive/run-e2e-rom1pey.ps1 +117 -0
- package/scripts/archive/setup-english-test.ps1 +36 -0
- package/scripts/archive/setup-test-notebook.ps1 +71 -0
- package/scripts/archive/simple-add-source.ps1 +14 -0
- package/scripts/archive/t10.ps1 +2 -0
- package/scripts/archive/t20.ps1 +4 -0
- package/scripts/archive/t30.ps1 +9 -0
- package/scripts/archive/t31.ps1 +11 -0
- package/scripts/archive/t32.ps1 +6 -0
- package/scripts/archive/t39.ps1 +5 -0
- package/scripts/archive/t40.ps1 +5 -0
- package/scripts/archive/t53.ps1 +12 -0
- package/scripts/archive/t54.ps1 +12 -0
- package/scripts/archive/t55.ps1 +11 -0
- package/scripts/archive/t9.ps1 +1 -0
- package/scripts/archive/test-access.ps1 +28 -0
- package/scripts/archive/test-add-delete-source.ps1 +64 -0
- package/scripts/archive/test-add-source-visible.ps1 +16 -0
- package/scripts/archive/test-add-source.ps1 +19 -0
- package/scripts/archive/test-add-text-debug.ps1 +28 -0
- package/scripts/archive/test-add-text-source.ps1 +8 -0
- package/scripts/archive/test-add-url-source.ps1 +7 -0
- package/scripts/archive/test-ask-ascii.ps1 +20 -0
- package/scripts/archive/test-ask-cnv.ps1 +20 -0
- package/scripts/archive/test-ask-headed.ps1 +51 -0
- package/scripts/archive/test-ask-ifs.ps1 +16 -0
- package/scripts/archive/test-ask-now.ps1 +24 -0
- package/scripts/archive/test-ask-real.ps1 +19 -0
- package/scripts/archive/test-ask-visible.ps1 +20 -0
- package/scripts/archive/test-create-notebook.ps1 +8 -0
- package/scripts/archive/test-create-then-add.ps1 +17 -0
- package/scripts/archive/test-delete-source.ps1 +41 -0
- package/scripts/archive/test-e2e-notebook.ps1 +21 -0
- package/scripts/archive/test-english-notebook.ps1 +20 -0
- package/scripts/archive/test-english.ps1 +7 -0
- package/scripts/archive/test-full-custom-instructions.ps1 +40 -0
- package/scripts/archive/test-full-infographic.ps1 +34 -0
- package/scripts/archive/test-full-language.ps1 +21 -0
- package/scripts/archive/test-full-presentation.ps1 +85 -0
- package/scripts/archive/test-full-report.ps1 +34 -0
- package/scripts/archive/test-full-source-selection.ps1 +35 -0
- package/scripts/archive/test-full-video-brief.ps1 +22 -0
- package/scripts/archive/test-full-video-explainer.ps1 +22 -0
- package/scripts/archive/test-full-video-styles.ps1 +37 -0
- package/scripts/archive/test-generate-report.ps1 +15 -0
- package/scripts/archive/test-generate-study-guide.ps1 +11 -0
- package/scripts/archive/test-headed-ask.ps1 +13 -0
- package/scripts/archive/test-headed-now.ps1 +9 -0
- package/scripts/archive/test-headed.ps1 +9 -0
- package/scripts/archive/test-hello.ps1 +7 -0
- package/scripts/archive/test-i18n-studio.ps1 +8 -0
- package/scripts/archive/test-i18n.ps1 +7 -0
- package/scripts/archive/test-manual-headed.ps1 +26 -0
- package/scripts/archive/test-mathieu-quota.ps1 +8 -0
- package/scripts/archive/test-notebook-1.ps1 +10 -0
- package/scripts/archive/test-notebook-2-sources.ps1 +12 -0
- package/scripts/archive/test-notebook1.ps1 +14 -0
- package/scripts/archive/test-personal-notebook.ps1 +14 -0
- package/scripts/archive/test-rate-limit.ps1 +19 -0
- package/scripts/archive/test-real-ask.ps1 +50 -0
- package/scripts/archive/test-real-ask2.ps1 +30 -0
- package/scripts/archive/test-rom1pey.ps1 +7 -0
- package/scripts/archive/test-rotation-complete.ps1 +14 -0
- package/scripts/archive/test-rotation.ps1 +8 -0
- package/scripts/archive/test-show-browser.ps1 +39 -0
- package/scripts/archive/test-update-notebook.ps1 +4 -0
- package/scripts/archive/verify-language-slow.ps1 +21 -0
- package/scripts/archive/verify-language.ps1 +15 -0
- package/scripts/check-server.ps1 +46 -0
- package/scripts/mcp-wsl-helper.sh +146 -0
- package/scripts/start-server.ps1 +94 -0
- package/scripts/stop-server.ps1 +30 -0
- package/scripts/switch-account-language.sh +191 -0
- package/scripts/test-account.ps1 +58 -0
- package/dist/__tests__/cleanup-manager.test.d.ts +0 -2
- package/dist/__tests__/cleanup-manager.test.d.ts.map +0 -1
- package/dist/__tests__/cleanup-manager.test.js +0 -341
- package/dist/__tests__/cleanup-manager.test.js.map +0 -1
- package/dist/__tests__/config-parsing.test.d.ts +0 -2
- package/dist/__tests__/config-parsing.test.d.ts.map +0 -1
- package/dist/__tests__/config-parsing.test.js +0 -338
- package/dist/__tests__/config-parsing.test.js.map +0 -1
- package/dist/__tests__/config.test.d.ts +0 -2
- package/dist/__tests__/config.test.d.ts.map +0 -1
- package/dist/__tests__/config.test.js +0 -267
- package/dist/__tests__/config.test.js.map +0 -1
- package/dist/__tests__/errors.test.d.ts +0 -2
- package/dist/__tests__/errors.test.d.ts.map +0 -1
- package/dist/__tests__/errors.test.js +0 -166
- package/dist/__tests__/errors.test.js.map +0 -1
- package/dist/__tests__/logger.test.d.ts +0 -2
- package/dist/__tests__/logger.test.d.ts.map +0 -1
- package/dist/__tests__/logger.test.js +0 -324
- package/dist/__tests__/logger.test.js.map +0 -1
- package/dist/__tests__/page-utils.test.d.ts +0 -2
- package/dist/__tests__/page-utils.test.d.ts.map +0 -1
- package/dist/__tests__/page-utils.test.js +0 -349
- package/dist/__tests__/page-utils.test.js.map +0 -1
- package/dist/__tests__/setup-verification.test.d.ts +0 -2
- package/dist/__tests__/setup-verification.test.d.ts.map +0 -1
- package/dist/__tests__/setup-verification.test.js +0 -15
- package/dist/__tests__/setup-verification.test.js.map +0 -1
- package/dist/__tests__/stealth-utils.test.d.ts +0 -2
- package/dist/__tests__/stealth-utils.test.d.ts.map +0 -1
- package/dist/__tests__/stealth-utils.test.js +0 -413
- package/dist/__tests__/stealth-utils.test.js.map +0 -1
- package/dist/__tests__/types.test.d.ts +0 -2
- package/dist/__tests__/types.test.d.ts.map +0 -1
- package/dist/__tests__/types.test.js +0 -461
- package/dist/__tests__/types.test.js.map +0 -1
|
@@ -0,0 +1,299 @@
|
|
|
1
|
+
#!/usr/bin/env pwsh
|
|
2
|
+
#Requires -Version 5.1
|
|
3
|
+
|
|
4
|
+
<#
|
|
5
|
+
.SYNOPSIS
|
|
6
|
+
Zod schema validation testing script for NotebookLM MCP HTTP Server API
|
|
7
|
+
|
|
8
|
+
.DESCRIPTION
|
|
9
|
+
Tests all Zod validation schemas to ensure proper input validation:
|
|
10
|
+
- AskQuestionSchema
|
|
11
|
+
- AddNotebookSchema
|
|
12
|
+
- UpdateNotebookSchema
|
|
13
|
+
- AutoDiscoverSchema
|
|
14
|
+
- CleanupDataSchema
|
|
15
|
+
- ShowBrowserSchema
|
|
16
|
+
|
|
17
|
+
.PARAMETER BaseUrl
|
|
18
|
+
Base URL of the server (default: http://localhost:3000)
|
|
19
|
+
|
|
20
|
+
.EXAMPLE
|
|
21
|
+
.\test-validation.ps1
|
|
22
|
+
Runs all validation tests
|
|
23
|
+
|
|
24
|
+
.NOTES
|
|
25
|
+
Prerequisite: The server must be started
|
|
26
|
+
#>
|
|
27
|
+
|
|
28
|
+
param(
|
|
29
|
+
[string]$BaseUrl = "http://localhost:3000"
|
|
30
|
+
)
|
|
31
|
+
|
|
32
|
+
# Colors for logs
|
|
33
|
+
function Write-TestHeader {
|
|
34
|
+
param([string]$Message, [int]$Number, [int]$Total)
|
|
35
|
+
Write-Host "`n" -NoNewline
|
|
36
|
+
Write-Host "═══════════════════════════════════════════════════════" -ForegroundColor Magenta
|
|
37
|
+
Write-Host " [$Number/$Total] $Message" -ForegroundColor Cyan
|
|
38
|
+
Write-Host "═══════════════════════════════════════════════════════" -ForegroundColor Magenta
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
function Write-Success {
|
|
42
|
+
param([string]$Message)
|
|
43
|
+
Write-Host "✓ $Message" -ForegroundColor Green
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
function Write-Info {
|
|
47
|
+
param([string]$Message)
|
|
48
|
+
Write-Host "ℹ $Message" -ForegroundColor Yellow
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
function Write-ErrorExpected {
|
|
52
|
+
param([string]$Message)
|
|
53
|
+
Write-Host "✓ Expected error: $Message" -ForegroundColor Green
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
function Write-ErrorUnexpected {
|
|
57
|
+
param([string]$Message)
|
|
58
|
+
Write-Host "✗ Unexpected: $Message" -ForegroundColor Red
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
# Helper function to test validation
|
|
62
|
+
function Test-ValidationError {
|
|
63
|
+
param(
|
|
64
|
+
[string]$Endpoint,
|
|
65
|
+
[string]$Method,
|
|
66
|
+
[hashtable]$Body,
|
|
67
|
+
[string]$ExpectedPattern,
|
|
68
|
+
[string]$Description
|
|
69
|
+
)
|
|
70
|
+
|
|
71
|
+
try {
|
|
72
|
+
$jsonBody = $Body | ConvertTo-Json -Depth 5
|
|
73
|
+
$result = Invoke-RestMethod -Uri "$BaseUrl$Endpoint" -Method $Method -Body $jsonBody -ContentType "application/json" -TimeoutSec 10
|
|
74
|
+
|
|
75
|
+
# If no HTTP exception, check for success: false
|
|
76
|
+
if ($result.success -eq $false -and $result.error -like $ExpectedPattern) {
|
|
77
|
+
Write-ErrorExpected "$($result.error.Substring(0, [Math]::Min(80, $result.error.Length)))..."
|
|
78
|
+
return $true
|
|
79
|
+
}
|
|
80
|
+
Write-ErrorUnexpected "Should have returned validation error for: $Description"
|
|
81
|
+
return $false
|
|
82
|
+
} catch {
|
|
83
|
+
$statusCode = $_.Exception.Response.StatusCode
|
|
84
|
+
if ($statusCode -eq 400 -or $statusCode -eq 'BadRequest') {
|
|
85
|
+
$errorResponse = $_.ErrorDetails.Message | ConvertFrom-Json
|
|
86
|
+
if ($errorResponse.error -like $ExpectedPattern) {
|
|
87
|
+
Write-ErrorExpected "$($errorResponse.error.Substring(0, [Math]::Min(80, $errorResponse.error.Length)))..."
|
|
88
|
+
return $true
|
|
89
|
+
}
|
|
90
|
+
Write-ErrorUnexpected "Error message doesn't match pattern: $($errorResponse.error)"
|
|
91
|
+
return $false
|
|
92
|
+
}
|
|
93
|
+
Write-ErrorUnexpected "Unexpected HTTP status: $statusCode"
|
|
94
|
+
return $false
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
# Banner
|
|
99
|
+
Clear-Host
|
|
100
|
+
Write-Host "`n" -NoNewline
|
|
101
|
+
Write-Host "╔════════════════════════════════════════════════════════╗" -ForegroundColor Magenta
|
|
102
|
+
Write-Host "║ ║" -ForegroundColor Magenta
|
|
103
|
+
Write-Host "║ ZOD VALIDATION TESTS - HTTP API ║" -ForegroundColor Cyan
|
|
104
|
+
Write-Host "║ ║" -ForegroundColor Magenta
|
|
105
|
+
Write-Host "╚════════════════════════════════════════════════════════╝" -ForegroundColor Magenta
|
|
106
|
+
Write-Host ""
|
|
107
|
+
|
|
108
|
+
# Check that the server is accessible
|
|
109
|
+
Write-Host "Checking connection to server..." -ForegroundColor Yellow
|
|
110
|
+
try {
|
|
111
|
+
$null = Invoke-RestMethod -Uri "$BaseUrl/health" -TimeoutSec 5
|
|
112
|
+
Write-Success "Server accessible at $BaseUrl"
|
|
113
|
+
} catch {
|
|
114
|
+
Write-ErrorUnexpected "Unable to connect to server at $BaseUrl"
|
|
115
|
+
Write-Host "Make sure the server is started" -ForegroundColor Yellow
|
|
116
|
+
exit 1
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
$TotalTests = 18
|
|
120
|
+
$PassedTests = 0
|
|
121
|
+
$FailedTests = 0
|
|
122
|
+
|
|
123
|
+
# =============================================================================
|
|
124
|
+
# ASK QUESTION SCHEMA TESTS
|
|
125
|
+
# =============================================================================
|
|
126
|
+
|
|
127
|
+
Write-TestHeader "POST /ask - Empty question string" 1 $TotalTests
|
|
128
|
+
if (Test-ValidationError -Endpoint "/ask" -Method "Post" -Body @{ question = "" } -ExpectedPattern "*question*empty*" -Description "empty question") {
|
|
129
|
+
$PassedTests++
|
|
130
|
+
} else { $FailedTests++ }
|
|
131
|
+
|
|
132
|
+
Write-TestHeader "POST /ask - Question wrong type (number)" 2 $TotalTests
|
|
133
|
+
if (Test-ValidationError -Endpoint "/ask" -Method "Post" -Body @{ question = 123 } -ExpectedPattern "*question*" -Description "question as number") {
|
|
134
|
+
$PassedTests++
|
|
135
|
+
} else { $FailedTests++ }
|
|
136
|
+
|
|
137
|
+
Write-TestHeader "POST /ask - Invalid notebook_url format" 3 $TotalTests
|
|
138
|
+
if (Test-ValidationError -Endpoint "/ask" -Method "Post" -Body @{ question = "test"; notebook_url = "not-a-url" } -ExpectedPattern "*url*" -Description "invalid URL") {
|
|
139
|
+
$PassedTests++
|
|
140
|
+
} else { $FailedTests++ }
|
|
141
|
+
|
|
142
|
+
Write-TestHeader "POST /ask - show_browser wrong type (string)" 4 $TotalTests
|
|
143
|
+
if (Test-ValidationError -Endpoint "/ask" -Method "Post" -Body @{ question = "test"; show_browser = "yes" } -ExpectedPattern "*show_browser*" -Description "show_browser as string") {
|
|
144
|
+
$PassedTests++
|
|
145
|
+
} else { $FailedTests++ }
|
|
146
|
+
|
|
147
|
+
# =============================================================================
|
|
148
|
+
# ADD NOTEBOOK SCHEMA TESTS
|
|
149
|
+
# =============================================================================
|
|
150
|
+
|
|
151
|
+
Write-TestHeader "POST /notebooks - Empty name" 5 $TotalTests
|
|
152
|
+
if (Test-ValidationError -Endpoint "/notebooks" -Method "Post" -Body @{
|
|
153
|
+
url = "https://notebooklm.google.com/notebook/test"
|
|
154
|
+
name = ""
|
|
155
|
+
description = "Test"
|
|
156
|
+
topics = @("test")
|
|
157
|
+
} -ExpectedPattern "*name*empty*" -Description "empty name") {
|
|
158
|
+
$PassedTests++
|
|
159
|
+
} else { $FailedTests++ }
|
|
160
|
+
|
|
161
|
+
Write-TestHeader "POST /notebooks - Empty description" 6 $TotalTests
|
|
162
|
+
if (Test-ValidationError -Endpoint "/notebooks" -Method "Post" -Body @{
|
|
163
|
+
url = "https://notebooklm.google.com/notebook/test"
|
|
164
|
+
name = "Test"
|
|
165
|
+
description = ""
|
|
166
|
+
topics = @("test")
|
|
167
|
+
} -ExpectedPattern "*description*empty*" -Description "empty description") {
|
|
168
|
+
$PassedTests++
|
|
169
|
+
} else { $FailedTests++ }
|
|
170
|
+
|
|
171
|
+
Write-TestHeader "POST /notebooks - Empty topics array" 7 $TotalTests
|
|
172
|
+
if (Test-ValidationError -Endpoint "/notebooks" -Method "Post" -Body @{
|
|
173
|
+
url = "https://notebooklm.google.com/notebook/test"
|
|
174
|
+
name = "Test"
|
|
175
|
+
description = "Test description"
|
|
176
|
+
topics = @()
|
|
177
|
+
} -ExpectedPattern "*topic*" -Description "empty topics array") {
|
|
178
|
+
$PassedTests++
|
|
179
|
+
} else { $FailedTests++ }
|
|
180
|
+
|
|
181
|
+
Write-TestHeader "POST /notebooks - URL not NotebookLM domain" 8 $TotalTests
|
|
182
|
+
if (Test-ValidationError -Endpoint "/notebooks" -Method "Post" -Body @{
|
|
183
|
+
url = "https://google.com/notebook/test"
|
|
184
|
+
name = "Test"
|
|
185
|
+
description = "Test description"
|
|
186
|
+
topics = @("test")
|
|
187
|
+
} -ExpectedPattern "*NotebookLM*" -Description "wrong domain") {
|
|
188
|
+
$PassedTests++
|
|
189
|
+
} else { $FailedTests++ }
|
|
190
|
+
|
|
191
|
+
Write-TestHeader "POST /notebooks - Invalid URL format" 9 $TotalTests
|
|
192
|
+
if (Test-ValidationError -Endpoint "/notebooks" -Method "Post" -Body @{
|
|
193
|
+
url = "not-a-valid-url"
|
|
194
|
+
name = "Test"
|
|
195
|
+
description = "Test description"
|
|
196
|
+
topics = @("test")
|
|
197
|
+
} -ExpectedPattern "*url*" -Description "invalid URL format") {
|
|
198
|
+
$PassedTests++
|
|
199
|
+
} else { $FailedTests++ }
|
|
200
|
+
|
|
201
|
+
Write-TestHeader "POST /notebooks - topics wrong type (string)" 10 $TotalTests
|
|
202
|
+
if (Test-ValidationError -Endpoint "/notebooks" -Method "Post" -Body @{
|
|
203
|
+
url = "https://notebooklm.google.com/notebook/test"
|
|
204
|
+
name = "Test"
|
|
205
|
+
description = "Test description"
|
|
206
|
+
topics = "single-topic"
|
|
207
|
+
} -ExpectedPattern "*topics*array*" -Description "topics as string") {
|
|
208
|
+
$PassedTests++
|
|
209
|
+
} else { $FailedTests++ }
|
|
210
|
+
|
|
211
|
+
# =============================================================================
|
|
212
|
+
# UPDATE NOTEBOOK SCHEMA TESTS
|
|
213
|
+
# =============================================================================
|
|
214
|
+
|
|
215
|
+
Write-TestHeader "PUT /notebooks/:id - Empty name (when provided)" 11 $TotalTests
|
|
216
|
+
if (Test-ValidationError -Endpoint "/notebooks/test-id" -Method "Put" -Body @{ name = "" } -ExpectedPattern "*name*" -Description "empty name update") {
|
|
217
|
+
$PassedTests++
|
|
218
|
+
} else { $FailedTests++ }
|
|
219
|
+
|
|
220
|
+
Write-TestHeader "PUT /notebooks/:id - Empty description (when provided)" 12 $TotalTests
|
|
221
|
+
if (Test-ValidationError -Endpoint "/notebooks/test-id" -Method "Put" -Body @{ description = "" } -ExpectedPattern "*description*" -Description "empty description update") {
|
|
222
|
+
$PassedTests++
|
|
223
|
+
} else { $FailedTests++ }
|
|
224
|
+
|
|
225
|
+
# =============================================================================
|
|
226
|
+
# AUTO-DISCOVER SCHEMA TESTS
|
|
227
|
+
# =============================================================================
|
|
228
|
+
|
|
229
|
+
Write-TestHeader "POST /notebooks/auto-discover - Missing URL" 13 $TotalTests
|
|
230
|
+
if (Test-ValidationError -Endpoint "/notebooks/auto-discover" -Method "Post" -Body @{} -ExpectedPattern "*url*" -Description "missing URL") {
|
|
231
|
+
$PassedTests++
|
|
232
|
+
} else { $FailedTests++ }
|
|
233
|
+
|
|
234
|
+
Write-TestHeader "POST /notebooks/auto-discover - Invalid URL" 14 $TotalTests
|
|
235
|
+
if (Test-ValidationError -Endpoint "/notebooks/auto-discover" -Method "Post" -Body @{ url = "not-a-url" } -ExpectedPattern "*url*" -Description "invalid URL") {
|
|
236
|
+
$PassedTests++
|
|
237
|
+
} else { $FailedTests++ }
|
|
238
|
+
|
|
239
|
+
Write-TestHeader "POST /notebooks/auto-discover - Wrong domain" 15 $TotalTests
|
|
240
|
+
if (Test-ValidationError -Endpoint "/notebooks/auto-discover" -Method "Post" -Body @{ url = "https://example.com/notebook" } -ExpectedPattern "*NotebookLM*" -Description "wrong domain") {
|
|
241
|
+
$PassedTests++
|
|
242
|
+
} else { $FailedTests++ }
|
|
243
|
+
|
|
244
|
+
# =============================================================================
|
|
245
|
+
# CLEANUP DATA SCHEMA TESTS
|
|
246
|
+
# =============================================================================
|
|
247
|
+
|
|
248
|
+
Write-TestHeader "POST /cleanup-data - Missing confirm" 16 $TotalTests
|
|
249
|
+
if (Test-ValidationError -Endpoint "/cleanup-data" -Method "Post" -Body @{} -ExpectedPattern "*confirm*" -Description "missing confirm") {
|
|
250
|
+
$PassedTests++
|
|
251
|
+
} else { $FailedTests++ }
|
|
252
|
+
|
|
253
|
+
Write-TestHeader "POST /cleanup-data - confirm wrong type (string)" 17 $TotalTests
|
|
254
|
+
if (Test-ValidationError -Endpoint "/cleanup-data" -Method "Post" -Body @{ confirm = "yes" } -ExpectedPattern "*confirm*" -Description "confirm as string") {
|
|
255
|
+
$PassedTests++
|
|
256
|
+
} else { $FailedTests++ }
|
|
257
|
+
|
|
258
|
+
Write-TestHeader "POST /cleanup-data - preserve_library wrong type" 18 $TotalTests
|
|
259
|
+
if (Test-ValidationError -Endpoint "/cleanup-data" -Method "Post" -Body @{ confirm = $true; preserve_library = "yes" } -ExpectedPattern "*preserve_library*" -Description "preserve_library as string") {
|
|
260
|
+
$PassedTests++
|
|
261
|
+
} else { $FailedTests++ }
|
|
262
|
+
|
|
263
|
+
# =============================================================================
|
|
264
|
+
# FINAL SUMMARY
|
|
265
|
+
# =============================================================================
|
|
266
|
+
Write-Host "`n" -NoNewline
|
|
267
|
+
Write-Host "╔════════════════════════════════════════════════════════╗" -ForegroundColor Magenta
|
|
268
|
+
Write-Host "║ ║" -ForegroundColor Magenta
|
|
269
|
+
Write-Host "║ VALIDATION TEST SUMMARY ║" -ForegroundColor Cyan
|
|
270
|
+
Write-Host "║ ║" -ForegroundColor Magenta
|
|
271
|
+
Write-Host "╚════════════════════════════════════════════════════════╝" -ForegroundColor Magenta
|
|
272
|
+
Write-Host ""
|
|
273
|
+
|
|
274
|
+
$TotalExecuted = $PassedTests + $FailedTests
|
|
275
|
+
$SuccessRate = if ($TotalExecuted -gt 0) { [math]::Round(($PassedTests / $TotalExecuted) * 100, 1) } else { 0 }
|
|
276
|
+
|
|
277
|
+
Write-Host "Total tests: $TotalTests" -ForegroundColor White
|
|
278
|
+
Write-Host "Tests passed: " -NoNewline -ForegroundColor White
|
|
279
|
+
Write-Host "$PassedTests" -ForegroundColor Green
|
|
280
|
+
Write-Host "Tests failed: " -NoNewline -ForegroundColor White
|
|
281
|
+
Write-Host "$FailedTests" -ForegroundColor $(if($FailedTests -gt 0){"Red"}else{"Green"})
|
|
282
|
+
Write-Host "Success rate: " -NoNewline -ForegroundColor White
|
|
283
|
+
Write-Host "$SuccessRate%" -ForegroundColor $(if($SuccessRate -eq 100){"Green"}elseif($SuccessRate -ge 80){"Yellow"}else{"Red"})
|
|
284
|
+
|
|
285
|
+
Write-Host ""
|
|
286
|
+
|
|
287
|
+
if ($FailedTests -eq 0) {
|
|
288
|
+
Write-Host "════════════════════════════════════════════════════════" -ForegroundColor Green
|
|
289
|
+
Write-Host " ✓ ALL VALIDATION SCHEMAS WORKING CORRECTLY!" -ForegroundColor Green
|
|
290
|
+
Write-Host "════════════════════════════════════════════════════════" -ForegroundColor Green
|
|
291
|
+
exit 0
|
|
292
|
+
} else {
|
|
293
|
+
Write-Host "════════════════════════════════════════════════════════" -ForegroundColor Yellow
|
|
294
|
+
Write-Host " ⚠ SOME VALIDATION TESTS FAILED" -ForegroundColor Yellow
|
|
295
|
+
Write-Host "════════════════════════════════════════════════════════" -ForegroundColor Yellow
|
|
296
|
+
Write-Host ""
|
|
297
|
+
Write-Host "See details above to identify the issues." -ForegroundColor Yellow
|
|
298
|
+
exit 1
|
|
299
|
+
}
|
|
@@ -0,0 +1,163 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Account Manager
|
|
3
|
+
*
|
|
4
|
+
* Manages multiple Google accounts for NotebookLM with:
|
|
5
|
+
* - Account pool with rotation strategies
|
|
6
|
+
* - Encrypted credential storage
|
|
7
|
+
* - Quota tracking per account
|
|
8
|
+
* - Session health monitoring
|
|
9
|
+
* - Auto-login when sessions expire
|
|
10
|
+
*/
|
|
11
|
+
import type { Account, AccountHealth, AccountSelection, RotationStrategy } from './types.js';
|
|
12
|
+
export declare class AccountManager {
|
|
13
|
+
private configPath;
|
|
14
|
+
private accountsDir;
|
|
15
|
+
private config;
|
|
16
|
+
private accounts;
|
|
17
|
+
private lastUsedIndex;
|
|
18
|
+
constructor();
|
|
19
|
+
/**
|
|
20
|
+
* Initialize the account manager
|
|
21
|
+
*/
|
|
22
|
+
initialize(): Promise<void>;
|
|
23
|
+
/**
|
|
24
|
+
* Ensure required directories exist
|
|
25
|
+
*/
|
|
26
|
+
private ensureDirectories;
|
|
27
|
+
/**
|
|
28
|
+
* Load accounts configuration
|
|
29
|
+
*/
|
|
30
|
+
private loadConfig;
|
|
31
|
+
/**
|
|
32
|
+
* Save accounts configuration
|
|
33
|
+
*/
|
|
34
|
+
private saveConfig;
|
|
35
|
+
/**
|
|
36
|
+
* Load all accounts from disk
|
|
37
|
+
*/
|
|
38
|
+
private loadAccounts;
|
|
39
|
+
/**
|
|
40
|
+
* Load a single account
|
|
41
|
+
*/
|
|
42
|
+
private loadAccount;
|
|
43
|
+
/**
|
|
44
|
+
* Create fresh quota (resets at midnight UTC)
|
|
45
|
+
*/
|
|
46
|
+
private createFreshQuota;
|
|
47
|
+
/**
|
|
48
|
+
* Add a new account
|
|
49
|
+
*/
|
|
50
|
+
addAccount(email: string, password: string, totpSecret?: string, options?: {
|
|
51
|
+
priority?: number;
|
|
52
|
+
notes?: string;
|
|
53
|
+
}): Promise<string>;
|
|
54
|
+
/**
|
|
55
|
+
* Remove an account
|
|
56
|
+
*/
|
|
57
|
+
removeAccount(accountId: string): Promise<boolean>;
|
|
58
|
+
/**
|
|
59
|
+
* List all accounts
|
|
60
|
+
*/
|
|
61
|
+
listAccounts(): Account[];
|
|
62
|
+
/**
|
|
63
|
+
* Get account by ID
|
|
64
|
+
*/
|
|
65
|
+
getAccount(accountId: string): Account | undefined;
|
|
66
|
+
/**
|
|
67
|
+
* Get credentials for an account
|
|
68
|
+
*/
|
|
69
|
+
getCredentials(accountId: string): Promise<{
|
|
70
|
+
email: string;
|
|
71
|
+
password: string;
|
|
72
|
+
totpSecret?: string;
|
|
73
|
+
} | null>;
|
|
74
|
+
/**
|
|
75
|
+
* Get the best available account based on rotation strategy
|
|
76
|
+
* @param excludeAccountId Optional account ID to exclude (e.g., rate-limited account)
|
|
77
|
+
*/
|
|
78
|
+
getBestAccount(excludeAccountId?: string): Promise<AccountSelection | null>;
|
|
79
|
+
/**
|
|
80
|
+
* Get accounts that are available for use
|
|
81
|
+
*/
|
|
82
|
+
private getAvailableAccounts;
|
|
83
|
+
/**
|
|
84
|
+
* Select account with most remaining quota
|
|
85
|
+
*/
|
|
86
|
+
private selectLeastUsed;
|
|
87
|
+
/**
|
|
88
|
+
* Select account using round-robin
|
|
89
|
+
*/
|
|
90
|
+
private selectRoundRobin;
|
|
91
|
+
/**
|
|
92
|
+
* Select account by priority (failover)
|
|
93
|
+
*/
|
|
94
|
+
private selectFailover;
|
|
95
|
+
/**
|
|
96
|
+
* Record a query usage for an account
|
|
97
|
+
*/
|
|
98
|
+
recordUsage(accountId: string): Promise<void>;
|
|
99
|
+
/**
|
|
100
|
+
* Mark account as rate-limited (quota exhausted)
|
|
101
|
+
* This ensures the account won't be selected again until quota resets
|
|
102
|
+
*/
|
|
103
|
+
markRateLimited(accountId: string): Promise<void>;
|
|
104
|
+
/**
|
|
105
|
+
* Save the ID of the currently active account
|
|
106
|
+
* This is used to identify which account is currently loaded in the main profile
|
|
107
|
+
*/
|
|
108
|
+
saveCurrentAccountId(accountId: string): Promise<void>;
|
|
109
|
+
/**
|
|
110
|
+
* Get the ID of the currently active account
|
|
111
|
+
* Returns null if no account is set or file doesn't exist
|
|
112
|
+
*/
|
|
113
|
+
getCurrentAccountId(): Promise<string | null>;
|
|
114
|
+
/**
|
|
115
|
+
* Record a login failure
|
|
116
|
+
*/
|
|
117
|
+
recordLoginFailure(accountId: string, error: string): Promise<void>;
|
|
118
|
+
/**
|
|
119
|
+
* Record a successful login
|
|
120
|
+
*/
|
|
121
|
+
recordLoginSuccess(accountId: string): Promise<void>;
|
|
122
|
+
/**
|
|
123
|
+
* Update session status for an account
|
|
124
|
+
*/
|
|
125
|
+
updateSessionStatus(accountId: string, status: 'valid' | 'expiring' | 'expired'): Promise<void>;
|
|
126
|
+
/**
|
|
127
|
+
* Check health of all accounts
|
|
128
|
+
*/
|
|
129
|
+
healthCheck(): Promise<AccountHealth[]>;
|
|
130
|
+
/**
|
|
131
|
+
* Check health of a single account
|
|
132
|
+
*/
|
|
133
|
+
private checkAccountHealth;
|
|
134
|
+
/**
|
|
135
|
+
* Get current rotation strategy
|
|
136
|
+
*/
|
|
137
|
+
getRotationStrategy(): RotationStrategy;
|
|
138
|
+
/**
|
|
139
|
+
* Set rotation strategy
|
|
140
|
+
*/
|
|
141
|
+
setRotationStrategy(strategy: RotationStrategy): Promise<void>;
|
|
142
|
+
/**
|
|
143
|
+
* Check if auto-login is enabled
|
|
144
|
+
*/
|
|
145
|
+
isAutoLoginEnabled(): boolean;
|
|
146
|
+
/**
|
|
147
|
+
* Enable/disable auto-login
|
|
148
|
+
*/
|
|
149
|
+
setAutoLoginEnabled(enabled: boolean): Promise<void>;
|
|
150
|
+
/**
|
|
151
|
+
* Get account count
|
|
152
|
+
*/
|
|
153
|
+
getAccountCount(): number;
|
|
154
|
+
/**
|
|
155
|
+
* Check if any accounts are configured
|
|
156
|
+
*/
|
|
157
|
+
hasAccounts(): boolean;
|
|
158
|
+
}
|
|
159
|
+
/**
|
|
160
|
+
* Get or create the account manager instance
|
|
161
|
+
*/
|
|
162
|
+
export declare function getAccountManager(): Promise<AccountManager>;
|
|
163
|
+
//# sourceMappingURL=account-manager.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"account-manager.d.ts","sourceRoot":"","sources":["../../src/accounts/account-manager.ts"],"names":[],"mappings":"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"}
|