@pan-sec/notebooklm-mcp 2026.2.1 → 2026.2.11

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 (117) hide show
  1. package/README.md +39 -18
  2. package/dist/auth/auth-manager.d.ts +37 -2
  3. package/dist/auth/auth-manager.d.ts.map +1 -1
  4. package/dist/auth/auth-manager.js +133 -11
  5. package/dist/auth/auth-manager.js.map +1 -1
  6. package/dist/auth/mcp-auth.d.ts +25 -4
  7. package/dist/auth/mcp-auth.d.ts.map +1 -1
  8. package/dist/auth/mcp-auth.js +145 -29
  9. package/dist/auth/mcp-auth.js.map +1 -1
  10. package/dist/compliance/retention-engine.js +1 -1
  11. package/dist/compliance/retention-engine.js.map +1 -1
  12. package/dist/config.d.ts +24 -0
  13. package/dist/config.d.ts.map +1 -1
  14. package/dist/config.js +56 -8
  15. package/dist/config.js.map +1 -1
  16. package/dist/gemini/gemini-client.d.ts.map +1 -1
  17. package/dist/gemini/gemini-client.js +58 -20
  18. package/dist/gemini/gemini-client.js.map +1 -1
  19. package/dist/index.js +87 -180
  20. package/dist/index.js.map +1 -1
  21. package/dist/notebook-creation/audio-manager.js +2 -2
  22. package/dist/notebook-creation/audio-manager.js.map +1 -1
  23. package/dist/notebook-creation/data-table-manager.d.ts +13 -3
  24. package/dist/notebook-creation/data-table-manager.d.ts.map +1 -1
  25. package/dist/notebook-creation/data-table-manager.js +70 -32
  26. package/dist/notebook-creation/data-table-manager.js.map +1 -1
  27. package/dist/notebook-creation/discover-creation-flow.js +1 -1
  28. package/dist/notebook-creation/discover-creation-flow.js.map +1 -1
  29. package/dist/notebook-creation/discover-quota.js +1 -1
  30. package/dist/notebook-creation/discover-quota.js.map +1 -1
  31. package/dist/notebook-creation/discover-sources.js +1 -1
  32. package/dist/notebook-creation/discover-sources.js.map +1 -1
  33. package/dist/notebook-creation/notebook-creator.d.ts.map +1 -1
  34. package/dist/notebook-creation/notebook-creator.js +49 -26
  35. package/dist/notebook-creation/notebook-creator.js.map +1 -1
  36. package/dist/notebook-creation/notebook-sync.js +1 -1
  37. package/dist/notebook-creation/notebook-sync.js.map +1 -1
  38. package/dist/notebook-creation/selectors.d.ts +21 -16
  39. package/dist/notebook-creation/selectors.d.ts.map +1 -1
  40. package/dist/notebook-creation/selectors.js +37 -20
  41. package/dist/notebook-creation/selectors.js.map +1 -1
  42. package/dist/notebook-creation/source-manager.d.ts.map +1 -1
  43. package/dist/notebook-creation/source-manager.js +29 -6
  44. package/dist/notebook-creation/source-manager.js.map +1 -1
  45. package/dist/notebook-creation/video-manager.d.ts +10 -1
  46. package/dist/notebook-creation/video-manager.d.ts.map +1 -1
  47. package/dist/notebook-creation/video-manager.js +103 -42
  48. package/dist/notebook-creation/video-manager.js.map +1 -1
  49. package/dist/quota/quota-manager.d.ts.map +1 -1
  50. package/dist/quota/quota-manager.js +46 -15
  51. package/dist/quota/quota-manager.js.map +1 -1
  52. package/dist/session/browser-session.d.ts.map +1 -1
  53. package/dist/session/browser-session.js +21 -14
  54. package/dist/session/browser-session.js.map +1 -1
  55. package/dist/tools/definitions/notebook-management.d.ts.map +1 -1
  56. package/dist/tools/definitions/notebook-management.js +64 -0
  57. package/dist/tools/definitions/notebook-management.js.map +1 -1
  58. package/dist/tools/handlers/ask-question.d.ts +18 -0
  59. package/dist/tools/handlers/ask-question.d.ts.map +1 -0
  60. package/dist/tools/handlers/ask-question.js +236 -0
  61. package/dist/tools/handlers/ask-question.js.map +1 -0
  62. package/dist/tools/handlers/audio-video.d.ts +42 -0
  63. package/dist/tools/handlers/audio-video.d.ts.map +1 -0
  64. package/dist/tools/handlers/audio-video.js +356 -0
  65. package/dist/tools/handlers/audio-video.js.map +1 -0
  66. package/dist/tools/handlers/auth.d.ts +41 -0
  67. package/dist/tools/handlers/auth.d.ts.map +1 -0
  68. package/dist/tools/handlers/auth.js +171 -0
  69. package/dist/tools/handlers/auth.js.map +1 -0
  70. package/dist/tools/handlers/gemini.d.ts +142 -0
  71. package/dist/tools/handlers/gemini.d.ts.map +1 -0
  72. package/dist/tools/handlers/gemini.js +626 -0
  73. package/dist/tools/handlers/gemini.js.map +1 -0
  74. package/dist/tools/handlers/index.d.ts +295 -0
  75. package/dist/tools/handlers/index.d.ts.map +1 -0
  76. package/dist/tools/handlers/index.js +197 -0
  77. package/dist/tools/handlers/index.js.map +1 -0
  78. package/dist/tools/handlers/notebook-creation.d.ts +75 -0
  79. package/dist/tools/handlers/notebook-creation.d.ts.map +1 -0
  80. package/dist/tools/handlers/notebook-creation.js +598 -0
  81. package/dist/tools/handlers/notebook-creation.js.map +1 -0
  82. package/dist/tools/handlers/notebook-management.d.ts +64 -0
  83. package/dist/tools/handlers/notebook-management.d.ts.map +1 -0
  84. package/dist/tools/handlers/notebook-management.js +214 -0
  85. package/dist/tools/handlers/notebook-management.js.map +1 -0
  86. package/dist/tools/handlers/session-management.d.ts +68 -0
  87. package/dist/tools/handlers/session-management.d.ts.map +1 -0
  88. package/dist/tools/handlers/session-management.js +238 -0
  89. package/dist/tools/handlers/session-management.js.map +1 -0
  90. package/dist/tools/handlers/system.d.ts +102 -0
  91. package/dist/tools/handlers/system.d.ts.map +1 -0
  92. package/dist/tools/handlers/system.js +275 -0
  93. package/dist/tools/handlers/system.js.map +1 -0
  94. package/dist/tools/handlers/types.d.ts +19 -0
  95. package/dist/tools/handlers/types.d.ts.map +1 -0
  96. package/dist/tools/handlers/types.js +5 -0
  97. package/dist/tools/handlers/types.js.map +1 -0
  98. package/dist/tools/handlers/webhooks.d.ts +34 -0
  99. package/dist/tools/handlers/webhooks.d.ts.map +1 -0
  100. package/dist/tools/handlers/webhooks.js +122 -0
  101. package/dist/tools/handlers/webhooks.js.map +1 -0
  102. package/dist/tools/handlers.d.ts +27 -0
  103. package/dist/tools/handlers.d.ts.map +1 -1
  104. package/dist/tools/handlers.js +226 -5
  105. package/dist/tools/handlers.js.map +1 -1
  106. package/dist/tools/index.d.ts +1 -1
  107. package/dist/tools/index.d.ts.map +1 -1
  108. package/dist/tools/index.js +1 -1
  109. package/dist/tools/index.js.map +1 -1
  110. package/dist/utils/cleanup-manager.d.ts.map +1 -1
  111. package/dist/utils/cleanup-manager.js +8 -10
  112. package/dist/utils/cleanup-manager.js.map +1 -1
  113. package/dist/utils/file-permissions.d.ts.map +1 -1
  114. package/dist/utils/file-permissions.js +41 -6
  115. package/dist/utils/file-permissions.js.map +1 -1
  116. package/docs/improvement-sprint-2026.2.10.md +210 -0
  117. package/package.json +6 -3
@@ -0,0 +1,356 @@
1
+ /**
2
+ * Audio, Video, and Data Table handler functions
3
+ *
4
+ * Extracted from the monolithic ToolHandlers class.
5
+ */
6
+ import { log } from "../../utils/logger.js";
7
+ import { validateNotebookUrl } from "../../utils/security.js";
8
+ import { AudioManager, } from "../../notebook-creation/audio-manager.js";
9
+ import { VideoManager, } from "../../notebook-creation/video-manager.js";
10
+ import { DataTableManager, } from "../../notebook-creation/data-table-manager.js";
11
+ export async function handleGenerateAudioOverview(ctx, args) {
12
+ log.info(`🔧 [TOOL] generate_audio_overview called`);
13
+ try {
14
+ // Resolve notebook URL
15
+ let notebookUrl = args.notebook_url;
16
+ if (!notebookUrl && args.notebook_id) {
17
+ const notebook = ctx.library.getNotebook(args.notebook_id);
18
+ if (!notebook) {
19
+ throw new Error(`Notebook not found in library: ${args.notebook_id}`);
20
+ }
21
+ notebookUrl = notebook.url;
22
+ log.info(` Resolved notebook: ${notebook.name}`);
23
+ }
24
+ else if (!notebookUrl) {
25
+ const active = ctx.library.getActiveNotebook();
26
+ if (active) {
27
+ notebookUrl = active.url;
28
+ log.info(` Using active notebook: ${active.name}`);
29
+ }
30
+ else {
31
+ throw new Error("No notebook specified. Provide notebook_id or notebook_url.");
32
+ }
33
+ }
34
+ // Validate URL
35
+ const safeUrl = validateNotebookUrl(notebookUrl);
36
+ // Get the shared context manager from session manager
37
+ const contextManager = ctx.sessionManager.getContextManager();
38
+ // Generate audio
39
+ const audioManager = new AudioManager(ctx.authManager, contextManager);
40
+ const result = await audioManager.generateAudioOverview(safeUrl);
41
+ if (result.success) {
42
+ log.success(`✅ [TOOL] generate_audio_overview completed (status: ${result.status.status})`);
43
+ }
44
+ else {
45
+ log.warning(`⚠️ [TOOL] generate_audio_overview: ${result.error}`);
46
+ }
47
+ return {
48
+ success: result.success,
49
+ data: result,
50
+ ...(result.error && { error: result.error }),
51
+ };
52
+ }
53
+ catch (error) {
54
+ const errorMessage = error instanceof Error ? error.message : String(error);
55
+ log.error(`❌ [TOOL] generate_audio_overview failed: ${errorMessage}`);
56
+ return {
57
+ success: false,
58
+ error: errorMessage,
59
+ };
60
+ }
61
+ }
62
+ export async function handleGetAudioStatus(ctx, args) {
63
+ log.info(`🔧 [TOOL] get_audio_status called`);
64
+ try {
65
+ // Resolve notebook URL
66
+ let notebookUrl = args.notebook_url;
67
+ if (!notebookUrl && args.notebook_id) {
68
+ const notebook = ctx.library.getNotebook(args.notebook_id);
69
+ if (!notebook) {
70
+ throw new Error(`Notebook not found in library: ${args.notebook_id}`);
71
+ }
72
+ notebookUrl = notebook.url;
73
+ log.info(` Resolved notebook: ${notebook.name}`);
74
+ }
75
+ else if (!notebookUrl) {
76
+ const active = ctx.library.getActiveNotebook();
77
+ if (active) {
78
+ notebookUrl = active.url;
79
+ log.info(` Using active notebook: ${active.name}`);
80
+ }
81
+ else {
82
+ throw new Error("No notebook specified. Provide notebook_id or notebook_url.");
83
+ }
84
+ }
85
+ // Validate URL
86
+ const safeUrl = validateNotebookUrl(notebookUrl);
87
+ // Get the shared context manager from session manager
88
+ const contextManager = ctx.sessionManager.getContextManager();
89
+ // Get status
90
+ const audioManager = new AudioManager(ctx.authManager, contextManager);
91
+ const status = await audioManager.getAudioStatus(safeUrl);
92
+ log.success(`✅ [TOOL] get_audio_status completed (status: ${status.status})`);
93
+ return {
94
+ success: true,
95
+ data: status,
96
+ };
97
+ }
98
+ catch (error) {
99
+ const errorMessage = error instanceof Error ? error.message : String(error);
100
+ log.error(`❌ [TOOL] get_audio_status failed: ${errorMessage}`);
101
+ return {
102
+ success: false,
103
+ error: errorMessage,
104
+ };
105
+ }
106
+ }
107
+ export async function handleDownloadAudio(ctx, args) {
108
+ log.info(`🔧 [TOOL] download_audio called`);
109
+ try {
110
+ // Resolve notebook URL
111
+ let notebookUrl = args.notebook_url;
112
+ if (!notebookUrl && args.notebook_id) {
113
+ const notebook = ctx.library.getNotebook(args.notebook_id);
114
+ if (!notebook) {
115
+ throw new Error(`Notebook not found in library: ${args.notebook_id}`);
116
+ }
117
+ notebookUrl = notebook.url;
118
+ log.info(` Resolved notebook: ${notebook.name}`);
119
+ }
120
+ else if (!notebookUrl) {
121
+ const active = ctx.library.getActiveNotebook();
122
+ if (active) {
123
+ notebookUrl = active.url;
124
+ log.info(` Using active notebook: ${active.name}`);
125
+ }
126
+ else {
127
+ throw new Error("No notebook specified. Provide notebook_id or notebook_url.");
128
+ }
129
+ }
130
+ // Validate URL
131
+ const safeUrl = validateNotebookUrl(notebookUrl);
132
+ // Get the shared context manager from session manager
133
+ const contextManager = ctx.sessionManager.getContextManager();
134
+ // Download audio
135
+ const audioManager = new AudioManager(ctx.authManager, contextManager);
136
+ const result = await audioManager.downloadAudio(safeUrl, args.output_path);
137
+ if (result.success) {
138
+ log.success(`✅ [TOOL] download_audio completed: ${result.filePath}`);
139
+ }
140
+ else {
141
+ log.warning(`⚠️ [TOOL] download_audio: ${result.error}`);
142
+ }
143
+ return {
144
+ success: result.success,
145
+ data: result,
146
+ ...(result.error && { error: result.error }),
147
+ };
148
+ }
149
+ catch (error) {
150
+ const errorMessage = error instanceof Error ? error.message : String(error);
151
+ log.error(`❌ [TOOL] download_audio failed: ${errorMessage}`);
152
+ return {
153
+ success: false,
154
+ error: errorMessage,
155
+ };
156
+ }
157
+ }
158
+ export async function handleGenerateVideoOverview(ctx, args) {
159
+ log.info(`🔧 [TOOL] generate_video_overview called`);
160
+ try {
161
+ // Resolve notebook URL
162
+ let notebookUrl = args.notebook_url;
163
+ if (!notebookUrl && args.notebook_id) {
164
+ const notebook = ctx.library.getNotebook(args.notebook_id);
165
+ if (!notebook) {
166
+ throw new Error(`Notebook not found in library: ${args.notebook_id}`);
167
+ }
168
+ notebookUrl = notebook.url;
169
+ log.info(` Resolved notebook: ${notebook.name}`);
170
+ }
171
+ else if (!notebookUrl) {
172
+ const active = ctx.library.getActiveNotebook();
173
+ if (active) {
174
+ notebookUrl = active.url;
175
+ log.info(` Using active notebook: ${active.name}`);
176
+ }
177
+ else {
178
+ throw new Error("No notebook specified. Provide notebook_id or notebook_url.");
179
+ }
180
+ }
181
+ // Validate URL
182
+ const safeUrl = validateNotebookUrl(notebookUrl);
183
+ // Get the shared context manager from session manager
184
+ const contextManager = ctx.sessionManager.getContextManager();
185
+ // Generate video
186
+ const videoManager = new VideoManager(ctx.authManager, contextManager);
187
+ const result = await videoManager.generateVideoOverview(safeUrl, args.style || "auto-select", args.format || "explainer");
188
+ if (result.success) {
189
+ log.success(`✅ [TOOL] generate_video_overview completed (status: ${result.status.status})`);
190
+ }
191
+ else {
192
+ log.warning(`⚠️ [TOOL] generate_video_overview: ${result.error}`);
193
+ }
194
+ return {
195
+ success: result.success,
196
+ data: result,
197
+ ...(result.error && { error: result.error }),
198
+ };
199
+ }
200
+ catch (error) {
201
+ const errorMessage = error instanceof Error ? error.message : String(error);
202
+ log.error(`❌ [TOOL] generate_video_overview failed: ${errorMessage}`);
203
+ return {
204
+ success: false,
205
+ error: errorMessage,
206
+ };
207
+ }
208
+ }
209
+ export async function handleGetVideoStatus(ctx, args) {
210
+ log.info(`🔧 [TOOL] get_video_status called`);
211
+ try {
212
+ // Resolve notebook URL
213
+ let notebookUrl = args.notebook_url;
214
+ if (!notebookUrl && args.notebook_id) {
215
+ const notebook = ctx.library.getNotebook(args.notebook_id);
216
+ if (!notebook) {
217
+ throw new Error(`Notebook not found in library: ${args.notebook_id}`);
218
+ }
219
+ notebookUrl = notebook.url;
220
+ log.info(` Resolved notebook: ${notebook.name}`);
221
+ }
222
+ else if (!notebookUrl) {
223
+ const active = ctx.library.getActiveNotebook();
224
+ if (active) {
225
+ notebookUrl = active.url;
226
+ log.info(` Using active notebook: ${active.name}`);
227
+ }
228
+ else {
229
+ throw new Error("No notebook specified. Provide notebook_id or notebook_url.");
230
+ }
231
+ }
232
+ // Validate URL
233
+ const safeUrl = validateNotebookUrl(notebookUrl);
234
+ // Get the shared context manager from session manager
235
+ const contextManager = ctx.sessionManager.getContextManager();
236
+ // Get status
237
+ const videoManager = new VideoManager(ctx.authManager, contextManager);
238
+ const status = await videoManager.getVideoStatus(safeUrl);
239
+ log.success(`✅ [TOOL] get_video_status completed (status: ${status.status})`);
240
+ return {
241
+ success: true,
242
+ data: status,
243
+ };
244
+ }
245
+ catch (error) {
246
+ const errorMessage = error instanceof Error ? error.message : String(error);
247
+ log.error(`❌ [TOOL] get_video_status failed: ${errorMessage}`);
248
+ return {
249
+ success: false,
250
+ error: errorMessage,
251
+ };
252
+ }
253
+ }
254
+ export async function handleGenerateDataTable(ctx, args) {
255
+ log.info(`🔧 [TOOL] generate_data_table called`);
256
+ try {
257
+ // Resolve notebook URL
258
+ let notebookUrl = args.notebook_url;
259
+ if (!notebookUrl && args.notebook_id) {
260
+ const notebook = ctx.library.getNotebook(args.notebook_id);
261
+ if (!notebook) {
262
+ throw new Error(`Notebook not found in library: ${args.notebook_id}`);
263
+ }
264
+ notebookUrl = notebook.url;
265
+ log.info(` Resolved notebook: ${notebook.name}`);
266
+ }
267
+ else if (!notebookUrl) {
268
+ const active = ctx.library.getActiveNotebook();
269
+ if (active) {
270
+ notebookUrl = active.url;
271
+ log.info(` Using active notebook: ${active.name}`);
272
+ }
273
+ else {
274
+ throw new Error("No notebook specified. Provide notebook_id or notebook_url.");
275
+ }
276
+ }
277
+ // Validate URL
278
+ const safeUrl = validateNotebookUrl(notebookUrl);
279
+ // Get the shared context manager from session manager
280
+ const contextManager = ctx.sessionManager.getContextManager();
281
+ // Generate data table
282
+ const dataTableManager = new DataTableManager(ctx.authManager, contextManager);
283
+ const result = await dataTableManager.generateDataTable(safeUrl);
284
+ if (result.success) {
285
+ log.success(`✅ [TOOL] generate_data_table completed (status: ${result.status.status})`);
286
+ }
287
+ else {
288
+ log.warning(`⚠️ [TOOL] generate_data_table: ${result.error}`);
289
+ }
290
+ return {
291
+ success: result.success,
292
+ data: result,
293
+ ...(result.error && { error: result.error }),
294
+ };
295
+ }
296
+ catch (error) {
297
+ const errorMessage = error instanceof Error ? error.message : String(error);
298
+ log.error(`❌ [TOOL] generate_data_table failed: ${errorMessage}`);
299
+ return {
300
+ success: false,
301
+ error: errorMessage,
302
+ };
303
+ }
304
+ }
305
+ export async function handleGetDataTable(ctx, args) {
306
+ log.info(`🔧 [TOOL] get_data_table called`);
307
+ try {
308
+ // Resolve notebook URL
309
+ let notebookUrl = args.notebook_url;
310
+ if (!notebookUrl && args.notebook_id) {
311
+ const notebook = ctx.library.getNotebook(args.notebook_id);
312
+ if (!notebook) {
313
+ throw new Error(`Notebook not found in library: ${args.notebook_id}`);
314
+ }
315
+ notebookUrl = notebook.url;
316
+ log.info(` Resolved notebook: ${notebook.name}`);
317
+ }
318
+ else if (!notebookUrl) {
319
+ const active = ctx.library.getActiveNotebook();
320
+ if (active) {
321
+ notebookUrl = active.url;
322
+ log.info(` Using active notebook: ${active.name}`);
323
+ }
324
+ else {
325
+ throw new Error("No notebook specified. Provide notebook_id or notebook_url.");
326
+ }
327
+ }
328
+ // Validate URL
329
+ const safeUrl = validateNotebookUrl(notebookUrl);
330
+ // Get the shared context manager from session manager
331
+ const contextManager = ctx.sessionManager.getContextManager();
332
+ // Get data table
333
+ const dataTableManager = new DataTableManager(ctx.authManager, contextManager);
334
+ const result = await dataTableManager.getDataTable(safeUrl);
335
+ if (result.success) {
336
+ log.success(`✅ [TOOL] get_data_table completed (${result.table?.totalRows} rows x ${result.table?.totalColumns} cols)`);
337
+ }
338
+ else {
339
+ log.warning(`⚠️ [TOOL] get_data_table: ${result.error}`);
340
+ }
341
+ return {
342
+ success: result.success,
343
+ data: result,
344
+ ...(result.error && { error: result.error }),
345
+ };
346
+ }
347
+ catch (error) {
348
+ const errorMessage = error instanceof Error ? error.message : String(error);
349
+ log.error(`❌ [TOOL] get_data_table failed: ${errorMessage}`);
350
+ return {
351
+ success: false,
352
+ error: errorMessage,
353
+ };
354
+ }
355
+ }
356
+ //# sourceMappingURL=audio-video.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"audio-video.js","sourceRoot":"","sources":["../../../src/tools/handlers/audio-video.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,41 @@
1
+ /**
2
+ * Auth domain handlers — setup_auth & re_auth
3
+ */
4
+ import type { HandlerContext } from "./types.js";
5
+ import type { BrowserOptions } from "../../config.js";
6
+ import type { ToolResult, ProgressCallback } from "../../types.js";
7
+ /**
8
+ * Handle setup_auth tool
9
+ *
10
+ * Opens a browser window for manual login with live progress updates.
11
+ * The operation waits synchronously for login completion (up to 10 minutes).
12
+ */
13
+ export declare function handleSetupAuth(ctx: HandlerContext, args: {
14
+ show_browser?: boolean;
15
+ browser_options?: BrowserOptions;
16
+ }, sendProgress?: ProgressCallback): Promise<ToolResult<{
17
+ status: string;
18
+ message: string;
19
+ authenticated: boolean;
20
+ duration_seconds?: number;
21
+ }>>;
22
+ /**
23
+ * Handle re_auth tool
24
+ *
25
+ * Performs a complete re-authentication:
26
+ * 1. Closes all active browser sessions
27
+ * 2. Deletes all saved authentication data (cookies, Chrome profile)
28
+ * 3. Opens browser for fresh Google login
29
+ *
30
+ * Use for switching Google accounts or recovering from rate limits.
31
+ */
32
+ export declare function handleReAuth(ctx: HandlerContext, args: {
33
+ show_browser?: boolean;
34
+ browser_options?: BrowserOptions;
35
+ }, sendProgress?: ProgressCallback): Promise<ToolResult<{
36
+ status: string;
37
+ message: string;
38
+ authenticated: boolean;
39
+ duration_seconds?: number;
40
+ }>>;
41
+ //# sourceMappingURL=auth.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auth.d.ts","sourceRoot":"","sources":["../../../src/tools/handlers/auth.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AACjD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AACtD,OAAO,KAAK,EAAE,UAAU,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAInE;;;;;GAKG;AACH,wBAAsB,eAAe,CACnC,GAAG,EAAE,cAAc,EACnB,IAAI,EAAE;IACJ,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,eAAe,CAAC,EAAE,cAAc,CAAC;CAClC,EACD,YAAY,CAAC,EAAE,gBAAgB,GAC9B,OAAO,CACR,UAAU,CAAC;IACT,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;IAChB,aAAa,EAAE,OAAO,CAAC;IACvB,gBAAgB,CAAC,EAAE,MAAM,CAAC;CAC3B,CAAC,CACH,CAwFA;AAED;;;;;;;;;GASG;AACH,wBAAsB,YAAY,CAChC,GAAG,EAAE,cAAc,EACnB,IAAI,EAAE;IACJ,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,eAAe,CAAC,EAAE,cAAc,CAAC;CAClC,EACD,YAAY,CAAC,EAAE,gBAAgB,GAC9B,OAAO,CACR,UAAU,CAAC;IACT,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;IAChB,aAAa,EAAE,OAAO,CAAC;IACvB,gBAAgB,CAAC,EAAE,MAAM,CAAC;CAC3B,CAAC,CACH,CA0FA"}
@@ -0,0 +1,171 @@
1
+ /**
2
+ * Auth domain handlers — setup_auth & re_auth
3
+ */
4
+ import { log } from "../../utils/logger.js";
5
+ import { audit } from "../../utils/audit-logger.js";
6
+ /**
7
+ * Handle setup_auth tool
8
+ *
9
+ * Opens a browser window for manual login with live progress updates.
10
+ * The operation waits synchronously for login completion (up to 10 minutes).
11
+ */
12
+ export async function handleSetupAuth(ctx, args, sendProgress) {
13
+ const { show_browser } = args;
14
+ // CRITICAL: Send immediate progress to reset timeout from the very start
15
+ await sendProgress?.("Initializing authentication setup...", 0, 10);
16
+ log.info(`🔧 [TOOL] setup_auth called`);
17
+ if (show_browser !== undefined) {
18
+ log.info(` Show browser: ${show_browser}`);
19
+ }
20
+ // Guard: setup_auth ALWAYS clears all saved credentials before re-logging in.
21
+ // Calling it headlessly will wipe auth and then fail to restore it, leaving
22
+ // all sessions permanently unauthenticated. Require show_browser:true.
23
+ if (!show_browser) {
24
+ log.error("❌ setup_auth requires show_browser:true — cannot login interactively in headless mode");
25
+ return {
26
+ success: false,
27
+ authenticated: false,
28
+ error: "setup_auth requires show_browser:true. " +
29
+ "Calling it without a visible browser wipes your saved credentials then fails to restore them. " +
30
+ "Run the auth-now.mjs script instead, or pass show_browser:true.",
31
+ };
32
+ }
33
+ const startTime = Date.now();
34
+ try {
35
+ // Progress: Starting
36
+ await sendProgress?.("Preparing authentication browser...", 1, 10);
37
+ log.info(` 🌐 Opening browser for interactive login...`);
38
+ // Progress: Opening browser
39
+ await sendProgress?.("Opening browser window...", 2, 10);
40
+ // Perform setup with progress updates; pass show_browser so the caller
41
+ // can force a visible browser even when HEADLESS=true is set in env
42
+ const success = await ctx.authManager.performSetup(sendProgress, show_browser);
43
+ const durationSeconds = (Date.now() - startTime) / 1000;
44
+ if (success) {
45
+ // Progress: Complete
46
+ await sendProgress?.("Authentication saved successfully!", 10, 10);
47
+ log.success(`✅ [TOOL] setup_auth completed (${durationSeconds.toFixed(1)}s)`);
48
+ // Audit: successful authentication
49
+ await audit.auth("setup_auth", true, { duration_seconds: durationSeconds });
50
+ await audit.tool("setup_auth", {}, true, Date.now() - startTime);
51
+ return {
52
+ success: true,
53
+ data: {
54
+ status: "authenticated",
55
+ message: "Successfully authenticated and saved browser state",
56
+ authenticated: true,
57
+ duration_seconds: durationSeconds,
58
+ },
59
+ };
60
+ }
61
+ else {
62
+ log.error(`❌ [TOOL] setup_auth failed (${durationSeconds.toFixed(1)}s)`);
63
+ // Audit: failed authentication
64
+ await audit.auth("setup_auth", false, { reason: "cancelled_or_failed" });
65
+ await audit.tool("setup_auth", {}, false, Date.now() - startTime, "Authentication failed or was cancelled");
66
+ return {
67
+ success: false,
68
+ error: "Authentication failed or was cancelled",
69
+ };
70
+ }
71
+ }
72
+ catch (error) {
73
+ const errorMessage = error instanceof Error ? error.message : String(error);
74
+ const durationSeconds = (Date.now() - startTime) / 1000;
75
+ log.error(`❌ [TOOL] setup_auth failed: ${errorMessage} (${durationSeconds.toFixed(1)}s)`);
76
+ // Audit: auth error
77
+ await audit.auth("setup_auth", false, { error: errorMessage });
78
+ await audit.tool("setup_auth", {}, false, Date.now() - startTime, errorMessage);
79
+ return {
80
+ success: false,
81
+ error: errorMessage,
82
+ };
83
+ }
84
+ }
85
+ /**
86
+ * Handle re_auth tool
87
+ *
88
+ * Performs a complete re-authentication:
89
+ * 1. Closes all active browser sessions
90
+ * 2. Deletes all saved authentication data (cookies, Chrome profile)
91
+ * 3. Opens browser for fresh Google login
92
+ *
93
+ * Use for switching Google accounts or recovering from rate limits.
94
+ */
95
+ export async function handleReAuth(ctx, args, sendProgress) {
96
+ const { show_browser } = args;
97
+ await sendProgress?.("Preparing re-authentication...", 0, 12);
98
+ log.info(`🔧 [TOOL] re_auth called`);
99
+ if (show_browser !== undefined) {
100
+ log.info(` Show browser: ${show_browser}`);
101
+ }
102
+ // Guard: re_auth requires a visible browser — Google login is interactive.
103
+ // Calling without show_browser:true would wipe saved credentials then fail,
104
+ // leaving all sessions permanently unauthenticated.
105
+ if (!show_browser) {
106
+ log.error("❌ re_auth requires show_browser:true — cannot login interactively in headless mode");
107
+ return {
108
+ success: false,
109
+ error: "re_auth requires show_browser:true. Google login is interactive and cannot complete " +
110
+ "in headless mode. Calling re_auth headlessly wipes your saved credentials then fails to " +
111
+ "restore them, destroying auth for all concurrent sessions. Pass show_browser:true.",
112
+ };
113
+ }
114
+ const startTime = Date.now();
115
+ try {
116
+ // 1. Close all active sessions
117
+ await sendProgress?.("Closing all active sessions...", 1, 12);
118
+ log.info(" 🛑 Closing all sessions...");
119
+ await ctx.sessionManager.closeAllSessions();
120
+ log.success(" ✅ All sessions closed");
121
+ // 2. Clear all auth data
122
+ await sendProgress?.("Clearing authentication data...", 2, 12);
123
+ log.info(" 🗑️ Clearing all auth data...");
124
+ await ctx.authManager.clearAllAuthData();
125
+ log.success(" ✅ Auth data cleared");
126
+ // 3. Perform fresh setup
127
+ await sendProgress?.("Starting fresh authentication...", 3, 12);
128
+ log.info(" 🌐 Starting fresh authentication setup...");
129
+ const success = await ctx.authManager.performSetup(sendProgress);
130
+ const durationSeconds = (Date.now() - startTime) / 1000;
131
+ if (success) {
132
+ await sendProgress?.("Re-authentication complete!", 12, 12);
133
+ log.success(`✅ [TOOL] re_auth completed (${durationSeconds.toFixed(1)}s)`);
134
+ // Audit: successful re-auth
135
+ await audit.auth("re_auth", true, { duration_seconds: durationSeconds });
136
+ await audit.tool("re_auth", {}, true, Date.now() - startTime);
137
+ return {
138
+ success: true,
139
+ data: {
140
+ status: "authenticated",
141
+ message: "Successfully re-authenticated with new account. All previous sessions have been closed.",
142
+ authenticated: true,
143
+ duration_seconds: durationSeconds,
144
+ },
145
+ };
146
+ }
147
+ else {
148
+ log.error(`❌ [TOOL] re_auth failed (${durationSeconds.toFixed(1)}s)`);
149
+ // Audit: failed re-auth
150
+ await audit.auth("re_auth", false, { reason: "cancelled_or_failed" });
151
+ await audit.tool("re_auth", {}, false, Date.now() - startTime, "Re-authentication failed or was cancelled");
152
+ return {
153
+ success: false,
154
+ error: "Re-authentication failed or was cancelled",
155
+ };
156
+ }
157
+ }
158
+ catch (error) {
159
+ const errorMessage = error instanceof Error ? error.message : String(error);
160
+ const durationSeconds = (Date.now() - startTime) / 1000;
161
+ log.error(`❌ [TOOL] re_auth failed: ${errorMessage} (${durationSeconds.toFixed(1)}s)`);
162
+ // Audit: re-auth error
163
+ await audit.auth("re_auth", false, { error: errorMessage });
164
+ await audit.tool("re_auth", {}, false, Date.now() - startTime, errorMessage);
165
+ return {
166
+ success: false,
167
+ error: errorMessage,
168
+ };
169
+ }
170
+ }
171
+ //# sourceMappingURL=auth.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auth.js","sourceRoot":"","sources":["../../../src/tools/handlers/auth.ts"],"names":[],"mappings":"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"}