@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.
Files changed (284) hide show
  1. package/LICENSE +22 -22
  2. package/README.md +71 -34
  3. package/deployment/INDEX.md +292 -0
  4. package/deployment/PACKAGE-FILES.txt +180 -0
  5. package/deployment/QUICK-START.md +100 -0
  6. package/deployment/docs/01-INSTALL.md +611 -0
  7. package/deployment/docs/02-CONFIGURATION.md +404 -0
  8. package/deployment/docs/03-API.md +1691 -0
  9. package/deployment/docs/04-N8N-INTEGRATION.md +373 -0
  10. package/deployment/docs/05-TROUBLESHOOTING.md +429 -0
  11. package/deployment/docs/06-NOTEBOOK-LIBRARY.md +692 -0
  12. package/deployment/docs/07-AUTO-DISCOVERY.md +236 -0
  13. package/deployment/docs/08-WSL-USAGE.md +363 -0
  14. package/deployment/docs/09-MULTI-INTERFACE.md +293 -0
  15. package/deployment/docs/10-CONTENT-MANAGEMENT.md +421 -0
  16. package/deployment/docs/11-MULTI-ACCOUNT.md +295 -0
  17. package/deployment/docs/README.md +207 -0
  18. package/deployment/scripts/README.md +564 -0
  19. package/deployment/scripts/install.ps1 +114 -0
  20. package/deployment/scripts/setup-auth.ps1 +217 -0
  21. package/deployment/scripts/start-server.ps1 +72 -0
  22. package/deployment/scripts/stop-server.ps1 +51 -0
  23. package/deployment/scripts/test-api.ps1 +651 -0
  24. package/deployment/scripts/test-auth.ps1 +323 -0
  25. package/deployment/scripts/test-auto-discovery.ps1 +295 -0
  26. package/deployment/scripts/test-cors.ps1 +398 -0
  27. package/deployment/scripts/test-errors.ps1 +581 -0
  28. package/deployment/scripts/test-server.ps1 +140 -0
  29. package/deployment/scripts/test-sessions.ps1 +426 -0
  30. package/deployment/scripts/test-validation.ps1 +299 -0
  31. package/dist/accounts/account-manager.d.ts +163 -0
  32. package/dist/accounts/account-manager.d.ts.map +1 -0
  33. package/dist/accounts/account-manager.js +614 -0
  34. package/dist/accounts/account-manager.js.map +1 -0
  35. package/dist/accounts/auto-login-manager.d.ts +62 -0
  36. package/dist/accounts/auto-login-manager.d.ts.map +1 -0
  37. package/dist/accounts/auto-login-manager.js +537 -0
  38. package/dist/accounts/auto-login-manager.js.map +1 -0
  39. package/dist/accounts/crypto.d.ts +45 -0
  40. package/dist/accounts/crypto.d.ts.map +1 -0
  41. package/dist/accounts/crypto.js +138 -0
  42. package/dist/accounts/crypto.js.map +1 -0
  43. package/dist/accounts/index.d.ts +14 -0
  44. package/dist/accounts/index.d.ts.map +1 -0
  45. package/dist/accounts/index.js +14 -0
  46. package/dist/accounts/index.js.map +1 -0
  47. package/dist/accounts/types.d.ts +103 -0
  48. package/dist/accounts/types.d.ts.map +1 -0
  49. package/dist/accounts/types.js +7 -0
  50. package/dist/accounts/types.js.map +1 -0
  51. package/dist/auth/auth-manager.d.ts +9 -2
  52. package/dist/auth/auth-manager.d.ts.map +1 -1
  53. package/dist/auth/auth-manager.js +60 -6
  54. package/dist/auth/auth-manager.js.map +1 -1
  55. package/dist/auto-discovery/auto-discovery.d.ts.map +1 -1
  56. package/dist/auto-discovery/auto-discovery.js +2 -1
  57. package/dist/auto-discovery/auto-discovery.js.map +1 -1
  58. package/dist/cli/accounts.d.ts +13 -0
  59. package/dist/cli/accounts.d.ts.map +1 -0
  60. package/dist/cli/accounts.js +195 -0
  61. package/dist/cli/accounts.js.map +1 -0
  62. package/dist/config.d.ts +1 -0
  63. package/dist/config.d.ts.map +1 -1
  64. package/dist/config.js +24 -0
  65. package/dist/config.js.map +1 -1
  66. package/dist/content/content-generator.d.ts +153 -0
  67. package/dist/content/content-generator.d.ts.map +1 -0
  68. package/dist/content/content-generator.js +637 -0
  69. package/dist/content/content-generator.js.map +1 -0
  70. package/dist/content/content-manager.d.ts +364 -0
  71. package/dist/content/content-manager.d.ts.map +1 -0
  72. package/dist/content/content-manager.js +3841 -0
  73. package/dist/content/content-manager.js.map +1 -0
  74. package/dist/content/content-templates.d.ts +183 -0
  75. package/dist/content/content-templates.d.ts.map +1 -0
  76. package/dist/content/content-templates.js +719 -0
  77. package/dist/content/content-templates.js.map +1 -0
  78. package/dist/content/index.d.ts +14 -0
  79. package/dist/content/index.d.ts.map +1 -0
  80. package/dist/content/index.js +14 -0
  81. package/dist/content/index.js.map +1 -0
  82. package/dist/content/types.d.ts +285 -0
  83. package/dist/content/types.d.ts.map +1 -0
  84. package/dist/content/types.js +10 -0
  85. package/dist/content/types.js.map +1 -0
  86. package/dist/errors.d.ts +1 -1
  87. package/dist/errors.d.ts.map +1 -1
  88. package/dist/errors.js.map +1 -1
  89. package/dist/http-wrapper.d.ts +7 -0
  90. package/dist/http-wrapper.d.ts.map +1 -1
  91. package/dist/http-wrapper.js +449 -29
  92. package/dist/http-wrapper.js.map +1 -1
  93. package/dist/i18n/en.json +120 -0
  94. package/dist/i18n/fr.json +120 -0
  95. package/dist/i18n/index.d.ts +168 -0
  96. package/dist/i18n/index.d.ts.map +1 -0
  97. package/dist/i18n/index.js +213 -0
  98. package/dist/i18n/index.js.map +1 -0
  99. package/dist/index.js +26 -2
  100. package/dist/index.js.map +1 -1
  101. package/dist/library/notebook-library.d.ts +4 -0
  102. package/dist/library/notebook-library.d.ts.map +1 -1
  103. package/dist/library/notebook-library.js +20 -3
  104. package/dist/library/notebook-library.js.map +1 -1
  105. package/dist/session/browser-session.d.ts +35 -8
  106. package/dist/session/browser-session.d.ts.map +1 -1
  107. package/dist/session/browser-session.js +243 -28
  108. package/dist/session/browser-session.js.map +1 -1
  109. package/dist/session/session-manager.d.ts +6 -0
  110. package/dist/session/session-manager.d.ts.map +1 -1
  111. package/dist/session/session-manager.js +46 -14
  112. package/dist/session/session-manager.js.map +1 -1
  113. package/dist/session/shared-context-manager.d.ts +3 -3
  114. package/dist/session/shared-context-manager.d.ts.map +1 -1
  115. package/dist/session/shared-context-manager.js +10 -7
  116. package/dist/session/shared-context-manager.js.map +1 -1
  117. package/dist/stdio-http-proxy.d.ts +24 -0
  118. package/dist/stdio-http-proxy.d.ts.map +1 -0
  119. package/dist/stdio-http-proxy.js +592 -0
  120. package/dist/stdio-http-proxy.js.map +1 -0
  121. package/dist/tools/index.d.ts +106 -1
  122. package/dist/tools/index.d.ts.map +1 -1
  123. package/dist/tools/index.js +1028 -7
  124. package/dist/tools/index.js.map +1 -1
  125. package/dist/types.d.ts +81 -17
  126. package/dist/types.d.ts.map +1 -1
  127. package/dist/utils/citation-extractor.d.ts +66 -0
  128. package/dist/utils/citation-extractor.d.ts.map +1 -0
  129. package/dist/utils/citation-extractor.js +492 -0
  130. package/dist/utils/citation-extractor.js.map +1 -0
  131. package/dist/utils/page-utils.d.ts +8 -0
  132. package/dist/utils/page-utils.d.ts.map +1 -1
  133. package/dist/utils/page-utils.js +112 -8
  134. package/dist/utils/page-utils.js.map +1 -1
  135. package/docs/ADDING_A_LANGUAGE.md +209 -0
  136. package/docs/ARCHITECTURE_MIGRATION_STUDY.md +894 -0
  137. package/docs/CHROME_PROFILE_LIMITATION.md +15 -1
  138. package/docs/MULTI_ACCOUNT_SYSTEM.md +304 -0
  139. package/package.json +15 -12
  140. package/scripts/archive/add-and-activate-notebook.ps1 +31 -0
  141. package/scripts/archive/add-new-notebook.ps1 +25 -0
  142. package/scripts/archive/add-rom1pey.ps1 +2 -0
  143. package/scripts/archive/add-rpmonster.ps1 +2 -0
  144. package/scripts/archive/add-source-debug.ps1 +11 -0
  145. package/scripts/archive/add-source-e2e.ps1 +28 -0
  146. package/scripts/archive/add-source-visible.ps1 +11 -0
  147. package/scripts/archive/add-test-notebook.ps1 +13 -0
  148. package/scripts/archive/add-test-source.ps1 +50 -0
  149. package/scripts/archive/capture-screen.ps1 +11 -0
  150. package/scripts/archive/change-language.mjs +45 -0
  151. package/scripts/archive/change-language.ts +44 -0
  152. package/scripts/archive/check-account.ps1 +19 -0
  153. package/scripts/archive/check-notebook-2.ps1 +8 -0
  154. package/scripts/archive/check-test-notebook.ps1 +11 -0
  155. package/scripts/archive/create-notebook-auto.ps1 +31 -0
  156. package/scripts/archive/create-notebook.ps1 +8 -0
  157. package/scripts/archive/create-rom1pey-notebook.ps1 +19 -0
  158. package/scripts/archive/create-rom1pey.ps1 +8 -0
  159. package/scripts/archive/create-test-notebook-fresh.ps1 +21 -0
  160. package/scripts/archive/create-test-notebook.ps1 +16 -0
  161. package/scripts/archive/debug-add-source-auto.ps1 +29 -0
  162. package/scripts/archive/debug-add-source.ps1 +19 -0
  163. package/scripts/archive/debug-add-text-source.ps1 +47 -0
  164. package/scripts/archive/debug-home.ps1 +10 -0
  165. package/scripts/archive/debug-selectors.ps1 +55 -0
  166. package/scripts/archive/debug-sources-panel.ps1 +22 -0
  167. package/scripts/archive/debug-ui.ps1 +17 -0
  168. package/scripts/archive/discover-home.ps1 +26 -0
  169. package/scripts/archive/kill-automation-chrome.ps1 +37 -0
  170. package/scripts/archive/list-my-notebooks.ps1 +27 -0
  171. package/scripts/archive/navigate-home-visible.ps1 +23 -0
  172. package/scripts/archive/navigate-home.ps1 +15 -0
  173. package/scripts/archive/run-e2e-english.ps1 +111 -0
  174. package/scripts/archive/run-e2e-rom1pey-v2.ps1 +122 -0
  175. package/scripts/archive/run-e2e-rom1pey.ps1 +117 -0
  176. package/scripts/archive/setup-english-test.ps1 +36 -0
  177. package/scripts/archive/setup-test-notebook.ps1 +71 -0
  178. package/scripts/archive/simple-add-source.ps1 +14 -0
  179. package/scripts/archive/t10.ps1 +2 -0
  180. package/scripts/archive/t20.ps1 +4 -0
  181. package/scripts/archive/t30.ps1 +9 -0
  182. package/scripts/archive/t31.ps1 +11 -0
  183. package/scripts/archive/t32.ps1 +6 -0
  184. package/scripts/archive/t39.ps1 +5 -0
  185. package/scripts/archive/t40.ps1 +5 -0
  186. package/scripts/archive/t53.ps1 +12 -0
  187. package/scripts/archive/t54.ps1 +12 -0
  188. package/scripts/archive/t55.ps1 +11 -0
  189. package/scripts/archive/t9.ps1 +1 -0
  190. package/scripts/archive/test-access.ps1 +28 -0
  191. package/scripts/archive/test-add-delete-source.ps1 +64 -0
  192. package/scripts/archive/test-add-source-visible.ps1 +16 -0
  193. package/scripts/archive/test-add-source.ps1 +19 -0
  194. package/scripts/archive/test-add-text-debug.ps1 +28 -0
  195. package/scripts/archive/test-add-text-source.ps1 +8 -0
  196. package/scripts/archive/test-add-url-source.ps1 +7 -0
  197. package/scripts/archive/test-ask-ascii.ps1 +20 -0
  198. package/scripts/archive/test-ask-cnv.ps1 +20 -0
  199. package/scripts/archive/test-ask-headed.ps1 +51 -0
  200. package/scripts/archive/test-ask-ifs.ps1 +16 -0
  201. package/scripts/archive/test-ask-now.ps1 +24 -0
  202. package/scripts/archive/test-ask-real.ps1 +19 -0
  203. package/scripts/archive/test-ask-visible.ps1 +20 -0
  204. package/scripts/archive/test-create-notebook.ps1 +8 -0
  205. package/scripts/archive/test-create-then-add.ps1 +17 -0
  206. package/scripts/archive/test-delete-source.ps1 +41 -0
  207. package/scripts/archive/test-e2e-notebook.ps1 +21 -0
  208. package/scripts/archive/test-english-notebook.ps1 +20 -0
  209. package/scripts/archive/test-english.ps1 +7 -0
  210. package/scripts/archive/test-full-custom-instructions.ps1 +40 -0
  211. package/scripts/archive/test-full-infographic.ps1 +34 -0
  212. package/scripts/archive/test-full-language.ps1 +21 -0
  213. package/scripts/archive/test-full-presentation.ps1 +85 -0
  214. package/scripts/archive/test-full-report.ps1 +34 -0
  215. package/scripts/archive/test-full-source-selection.ps1 +35 -0
  216. package/scripts/archive/test-full-video-brief.ps1 +22 -0
  217. package/scripts/archive/test-full-video-explainer.ps1 +22 -0
  218. package/scripts/archive/test-full-video-styles.ps1 +37 -0
  219. package/scripts/archive/test-generate-report.ps1 +15 -0
  220. package/scripts/archive/test-generate-study-guide.ps1 +11 -0
  221. package/scripts/archive/test-headed-ask.ps1 +13 -0
  222. package/scripts/archive/test-headed-now.ps1 +9 -0
  223. package/scripts/archive/test-headed.ps1 +9 -0
  224. package/scripts/archive/test-hello.ps1 +7 -0
  225. package/scripts/archive/test-i18n-studio.ps1 +8 -0
  226. package/scripts/archive/test-i18n.ps1 +7 -0
  227. package/scripts/archive/test-manual-headed.ps1 +26 -0
  228. package/scripts/archive/test-mathieu-quota.ps1 +8 -0
  229. package/scripts/archive/test-notebook-1.ps1 +10 -0
  230. package/scripts/archive/test-notebook-2-sources.ps1 +12 -0
  231. package/scripts/archive/test-notebook1.ps1 +14 -0
  232. package/scripts/archive/test-personal-notebook.ps1 +14 -0
  233. package/scripts/archive/test-rate-limit.ps1 +19 -0
  234. package/scripts/archive/test-real-ask.ps1 +50 -0
  235. package/scripts/archive/test-real-ask2.ps1 +30 -0
  236. package/scripts/archive/test-rom1pey.ps1 +7 -0
  237. package/scripts/archive/test-rotation-complete.ps1 +14 -0
  238. package/scripts/archive/test-rotation.ps1 +8 -0
  239. package/scripts/archive/test-show-browser.ps1 +39 -0
  240. package/scripts/archive/test-update-notebook.ps1 +4 -0
  241. package/scripts/archive/verify-language-slow.ps1 +21 -0
  242. package/scripts/archive/verify-language.ps1 +15 -0
  243. package/scripts/check-server.ps1 +46 -0
  244. package/scripts/mcp-wsl-helper.sh +146 -0
  245. package/scripts/start-server.ps1 +94 -0
  246. package/scripts/stop-server.ps1 +30 -0
  247. package/scripts/switch-account-language.sh +191 -0
  248. package/scripts/test-account.ps1 +58 -0
  249. package/dist/__tests__/cleanup-manager.test.d.ts +0 -2
  250. package/dist/__tests__/cleanup-manager.test.d.ts.map +0 -1
  251. package/dist/__tests__/cleanup-manager.test.js +0 -341
  252. package/dist/__tests__/cleanup-manager.test.js.map +0 -1
  253. package/dist/__tests__/config-parsing.test.d.ts +0 -2
  254. package/dist/__tests__/config-parsing.test.d.ts.map +0 -1
  255. package/dist/__tests__/config-parsing.test.js +0 -338
  256. package/dist/__tests__/config-parsing.test.js.map +0 -1
  257. package/dist/__tests__/config.test.d.ts +0 -2
  258. package/dist/__tests__/config.test.d.ts.map +0 -1
  259. package/dist/__tests__/config.test.js +0 -267
  260. package/dist/__tests__/config.test.js.map +0 -1
  261. package/dist/__tests__/errors.test.d.ts +0 -2
  262. package/dist/__tests__/errors.test.d.ts.map +0 -1
  263. package/dist/__tests__/errors.test.js +0 -166
  264. package/dist/__tests__/errors.test.js.map +0 -1
  265. package/dist/__tests__/logger.test.d.ts +0 -2
  266. package/dist/__tests__/logger.test.d.ts.map +0 -1
  267. package/dist/__tests__/logger.test.js +0 -324
  268. package/dist/__tests__/logger.test.js.map +0 -1
  269. package/dist/__tests__/page-utils.test.d.ts +0 -2
  270. package/dist/__tests__/page-utils.test.d.ts.map +0 -1
  271. package/dist/__tests__/page-utils.test.js +0 -349
  272. package/dist/__tests__/page-utils.test.js.map +0 -1
  273. package/dist/__tests__/setup-verification.test.d.ts +0 -2
  274. package/dist/__tests__/setup-verification.test.d.ts.map +0 -1
  275. package/dist/__tests__/setup-verification.test.js +0 -15
  276. package/dist/__tests__/setup-verification.test.js.map +0 -1
  277. package/dist/__tests__/stealth-utils.test.d.ts +0 -2
  278. package/dist/__tests__/stealth-utils.test.d.ts.map +0 -1
  279. package/dist/__tests__/stealth-utils.test.js +0 -413
  280. package/dist/__tests__/stealth-utils.test.js.map +0 -1
  281. package/dist/__tests__/types.test.d.ts +0 -2
  282. package/dist/__tests__/types.test.d.ts.map +0 -1
  283. package/dist/__tests__/types.test.js +0 -461
  284. 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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"}