@pan-sec/notebooklm-mcp 2026.2.11 → 2026.3.0
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/README.md +58 -17
- package/SECURITY.md +31 -61
- package/dist/auth/auth-manager.d.ts +2 -1
- package/dist/auth/auth-manager.d.ts.map +1 -1
- package/dist/auth/auth-manager.js +97 -42
- package/dist/auth/auth-manager.js.map +1 -1
- package/dist/auth/mcp-auth.d.ts +22 -4
- package/dist/auth/mcp-auth.d.ts.map +1 -1
- package/dist/auth/mcp-auth.js +120 -19
- package/dist/auth/mcp-auth.js.map +1 -1
- package/dist/compliance/alert-manager.d.ts.map +1 -1
- package/dist/compliance/alert-manager.js +7 -4
- package/dist/compliance/alert-manager.js.map +1 -1
- package/dist/compliance/breach-detection.d.ts.map +1 -1
- package/dist/compliance/breach-detection.js +14 -7
- package/dist/compliance/breach-detection.js.map +1 -1
- package/dist/compliance/change-log.d.ts.map +1 -1
- package/dist/compliance/change-log.js +7 -4
- package/dist/compliance/change-log.js.map +1 -1
- package/dist/compliance/compliance-logger.d.ts.map +1 -1
- package/dist/compliance/compliance-logger.js +11 -6
- package/dist/compliance/compliance-logger.js.map +1 -1
- package/dist/compliance/consent-manager.d.ts.map +1 -1
- package/dist/compliance/consent-manager.js +5 -3
- package/dist/compliance/consent-manager.js.map +1 -1
- package/dist/compliance/data-erasure.d.ts +1 -1
- package/dist/compliance/data-erasure.d.ts.map +1 -1
- package/dist/compliance/data-erasure.js +142 -83
- package/dist/compliance/data-erasure.js.map +1 -1
- package/dist/compliance/data-export.d.ts.map +1 -1
- package/dist/compliance/data-export.js +23 -12
- package/dist/compliance/data-export.js.map +1 -1
- package/dist/compliance/data-inventory.d.ts.map +1 -1
- package/dist/compliance/data-inventory.js +7 -6
- package/dist/compliance/data-inventory.js.map +1 -1
- package/dist/compliance/dsar-handler.d.ts +7 -1
- package/dist/compliance/dsar-handler.d.ts.map +1 -1
- package/dist/compliance/dsar-handler.js +74 -61
- package/dist/compliance/dsar-handler.js.map +1 -1
- package/dist/compliance/evidence-collector.d.ts.map +1 -1
- package/dist/compliance/evidence-collector.js +10 -6
- package/dist/compliance/evidence-collector.js.map +1 -1
- package/dist/compliance/health-monitor.d.ts.map +1 -1
- package/dist/compliance/health-monitor.js +15 -9
- package/dist/compliance/health-monitor.js.map +1 -1
- package/dist/compliance/incident-manager.d.ts.map +1 -1
- package/dist/compliance/incident-manager.js +5 -3
- package/dist/compliance/incident-manager.js.map +1 -1
- package/dist/compliance/policy-docs.d.ts.map +1 -1
- package/dist/compliance/policy-docs.js +14 -11
- package/dist/compliance/policy-docs.js.map +1 -1
- package/dist/compliance/privacy-notice-text.d.ts.map +1 -1
- package/dist/compliance/privacy-notice-text.js +3 -4
- package/dist/compliance/privacy-notice-text.js.map +1 -1
- package/dist/compliance/privacy-notice.d.ts.map +1 -1
- package/dist/compliance/privacy-notice.js +5 -3
- package/dist/compliance/privacy-notice.js.map +1 -1
- package/dist/compliance/report-generator.d.ts.map +1 -1
- package/dist/compliance/report-generator.js +5 -3
- package/dist/compliance/report-generator.js.map +1 -1
- package/dist/compliance/retention-engine.d.ts.map +1 -1
- package/dist/compliance/retention-engine.js +18 -10
- package/dist/compliance/retention-engine.js.map +1 -1
- package/dist/compliance/siem-exporter.d.ts.map +1 -1
- package/dist/compliance/siem-exporter.js +40 -16
- package/dist/compliance/siem-exporter.js.map +1 -1
- package/dist/config.d.ts +4 -31
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +25 -63
- package/dist/config.js.map +1 -1
- package/dist/errors.d.ts +21 -0
- package/dist/errors.d.ts.map +1 -1
- package/dist/errors.js +54 -1
- package/dist/errors.js.map +1 -1
- package/dist/gemini/gemini-client.d.ts +1 -0
- package/dist/gemini/gemini-client.d.ts.map +1 -1
- package/dist/gemini/gemini-client.js +50 -49
- package/dist/gemini/gemini-client.js.map +1 -1
- package/dist/gemini/types.d.ts +3 -1
- package/dist/gemini/types.d.ts.map +1 -1
- package/dist/gemini/types.js.map +1 -1
- package/dist/index.d.ts +52 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +399 -85
- package/dist/index.js.map +1 -1
- package/dist/library/notebook-library.d.ts.map +1 -1
- package/dist/library/notebook-library.js +2 -1
- package/dist/library/notebook-library.js.map +1 -1
- package/dist/logging/query-logger.d.ts +13 -1
- package/dist/logging/query-logger.d.ts.map +1 -1
- package/dist/logging/query-logger.js +62 -10
- package/dist/logging/query-logger.js.map +1 -1
- package/dist/notebook-creation/audio-manager.d.ts.map +1 -1
- package/dist/notebook-creation/audio-manager.js +19 -24
- package/dist/notebook-creation/audio-manager.js.map +1 -1
- package/dist/notebook-creation/browser-options.d.ts +28 -0
- package/dist/notebook-creation/browser-options.d.ts.map +1 -0
- package/dist/notebook-creation/browser-options.js +75 -0
- package/dist/notebook-creation/browser-options.js.map +1 -0
- package/dist/notebook-creation/data-table-manager.d.ts.map +1 -1
- package/dist/notebook-creation/data-table-manager.js +20 -21
- package/dist/notebook-creation/data-table-manager.js.map +1 -1
- package/dist/notebook-creation/discover-creation-flow.d.ts +0 -6
- package/dist/notebook-creation/discover-creation-flow.d.ts.map +1 -1
- package/dist/notebook-creation/discover-creation-flow.js +10 -10
- package/dist/notebook-creation/discover-creation-flow.js.map +1 -1
- package/dist/notebook-creation/discover-quota.d.ts +0 -6
- package/dist/notebook-creation/discover-quota.d.ts.map +1 -1
- package/dist/notebook-creation/discover-quota.js +12 -13
- package/dist/notebook-creation/discover-quota.js.map +1 -1
- package/dist/notebook-creation/discover-sources.js +15 -16
- package/dist/notebook-creation/discover-sources.js.map +1 -1
- package/dist/notebook-creation/dom-scripts.d.ts +10 -0
- package/dist/notebook-creation/dom-scripts.d.ts.map +1 -0
- package/dist/notebook-creation/dom-scripts.js +58 -0
- package/dist/notebook-creation/dom-scripts.js.map +1 -0
- package/dist/notebook-creation/errors.d.ts +18 -0
- package/dist/notebook-creation/errors.d.ts.map +1 -0
- package/dist/notebook-creation/errors.js +20 -0
- package/dist/notebook-creation/errors.js.map +1 -0
- package/dist/notebook-creation/index.d.ts +2 -0
- package/dist/notebook-creation/index.d.ts.map +1 -1
- package/dist/notebook-creation/index.js +2 -0
- package/dist/notebook-creation/index.js.map +1 -1
- package/dist/notebook-creation/notebook-creator.d.ts +6 -82
- package/dist/notebook-creation/notebook-creator.d.ts.map +1 -1
- package/dist/notebook-creation/notebook-creator.js +49 -835
- package/dist/notebook-creation/notebook-creator.js.map +1 -1
- package/dist/notebook-creation/notebook-nav.d.ts +19 -0
- package/dist/notebook-creation/notebook-nav.d.ts.map +1 -0
- package/dist/notebook-creation/notebook-nav.js +239 -0
- package/dist/notebook-creation/notebook-nav.js.map +1 -0
- package/dist/notebook-creation/notebook-sync.d.ts.map +1 -1
- package/dist/notebook-creation/notebook-sync.js +36 -38
- package/dist/notebook-creation/notebook-sync.js.map +1 -1
- package/dist/notebook-creation/selector-discovery.d.ts.map +1 -1
- package/dist/notebook-creation/selector-discovery.js +17 -24
- package/dist/notebook-creation/selector-discovery.js.map +1 -1
- package/dist/notebook-creation/selectors.d.ts +23 -19
- package/dist/notebook-creation/selectors.d.ts.map +1 -1
- package/dist/notebook-creation/selectors.js +69 -33
- package/dist/notebook-creation/selectors.js.map +1 -1
- package/dist/notebook-creation/source-manager.d.ts +22 -0
- package/dist/notebook-creation/source-manager.d.ts.map +1 -1
- package/dist/notebook-creation/source-manager.js +716 -50
- package/dist/notebook-creation/source-manager.js.map +1 -1
- package/dist/notebook-creation/types.d.ts +4 -0
- package/dist/notebook-creation/types.d.ts.map +1 -1
- package/dist/notebook-creation/video-manager.d.ts.map +1 -1
- package/dist/notebook-creation/video-manager.js +33 -35
- package/dist/notebook-creation/video-manager.js.map +1 -1
- package/dist/observability/metrics.d.ts +19 -0
- package/dist/observability/metrics.d.ts.map +1 -0
- package/dist/observability/metrics.js +35 -0
- package/dist/observability/metrics.js.map +1 -0
- package/dist/quota/quota-manager.d.ts +11 -3
- package/dist/quota/quota-manager.d.ts.map +1 -1
- package/dist/quota/quota-manager.js +139 -47
- package/dist/quota/quota-manager.js.map +1 -1
- package/dist/resources/resource-handlers.d.ts.map +1 -1
- package/dist/resources/resource-handlers.js +29 -12
- package/dist/resources/resource-handlers.js.map +1 -1
- package/dist/session/browser-session.d.ts.map +1 -1
- package/dist/session/browser-session.js +22 -22
- package/dist/session/browser-session.js.map +1 -1
- package/dist/session/session-timeout.d.ts.map +1 -1
- package/dist/session/session-timeout.js +4 -2
- package/dist/session/session-timeout.js.map +1 -1
- package/dist/session/shared-context-manager.d.ts.map +1 -1
- package/dist/session/shared-context-manager.js +31 -30
- package/dist/session/shared-context-manager.js.map +1 -1
- package/dist/tools/annotations.js +9 -9
- package/dist/tools/annotations.js.map +1 -1
- package/dist/tools/definitions/ask-question.d.ts.map +1 -1
- package/dist/tools/definitions/ask-question.js +35 -100
- package/dist/tools/definitions/ask-question.js.map +1 -1
- package/dist/tools/definitions/chat-history.d.ts +47 -1
- package/dist/tools/definitions/chat-history.d.ts.map +1 -1
- package/dist/tools/definitions/chat-history.js +10 -1
- package/dist/tools/definitions/chat-history.js.map +1 -1
- package/dist/tools/definitions/data-tables.d.ts.map +1 -1
- package/dist/tools/definitions/data-tables.js +2 -0
- package/dist/tools/definitions/data-tables.js.map +1 -1
- package/dist/tools/definitions/gemini.d.ts.map +1 -1
- package/dist/tools/definitions/gemini.js +40 -10
- package/dist/tools/definitions/gemini.js.map +1 -1
- package/dist/tools/definitions/notebook-management.d.ts.map +1 -1
- package/dist/tools/definitions/notebook-management.js +100 -70
- package/dist/tools/definitions/notebook-management.js.map +1 -1
- package/dist/tools/definitions/query-history.d.ts +47 -1
- package/dist/tools/definitions/query-history.d.ts.map +1 -1
- package/dist/tools/definitions/query-history.js +7 -0
- package/dist/tools/definitions/query-history.js.map +1 -1
- package/dist/tools/definitions/session-management.d.ts.map +1 -1
- package/dist/tools/definitions/session-management.js +5 -0
- package/dist/tools/definitions/session-management.js.map +1 -1
- package/dist/tools/definitions/system.d.ts.map +1 -1
- package/dist/tools/definitions/system.js +71 -100
- package/dist/tools/definitions/system.js.map +1 -1
- package/dist/tools/definitions/video.d.ts.map +1 -1
- package/dist/tools/definitions/video.js +3 -0
- package/dist/tools/definitions/video.js.map +1 -1
- package/dist/tools/definitions.d.ts.map +1 -1
- package/dist/tools/definitions.js +4 -0
- package/dist/tools/definitions.js.map +1 -1
- package/dist/tools/handlers/ask-question.d.ts +1 -1
- package/dist/tools/handlers/ask-question.d.ts.map +1 -1
- package/dist/tools/handlers/ask-question.js +56 -12
- package/dist/tools/handlers/ask-question.js.map +1 -1
- package/dist/tools/handlers/audio-video.d.ts.map +1 -1
- package/dist/tools/handlers/audio-video.js +15 -7
- package/dist/tools/handlers/audio-video.js.map +1 -1
- package/dist/tools/handlers/auth.d.ts +14 -19
- package/dist/tools/handlers/auth.d.ts.map +1 -1
- package/dist/tools/handlers/auth.js +77 -121
- package/dist/tools/handlers/auth.js.map +1 -1
- package/dist/tools/handlers/error-utils.d.ts +7 -0
- package/dist/tools/handlers/error-utils.d.ts.map +1 -0
- package/dist/tools/handlers/error-utils.js +17 -0
- package/dist/tools/handlers/error-utils.js.map +1 -0
- package/dist/tools/handlers/gemini.d.ts +1 -0
- package/dist/tools/handlers/gemini.d.ts.map +1 -1
- package/dist/tools/handlers/gemini.js +81 -51
- package/dist/tools/handlers/gemini.js.map +1 -1
- package/dist/tools/handlers/index.d.ts +39 -47
- package/dist/tools/handlers/index.d.ts.map +1 -1
- package/dist/tools/handlers/index.js +13 -2
- package/dist/tools/handlers/index.js.map +1 -1
- package/dist/tools/handlers/notebook-creation.d.ts.map +1 -1
- package/dist/tools/handlers/notebook-creation.js +99 -20
- package/dist/tools/handlers/notebook-creation.js.map +1 -1
- package/dist/tools/handlers/notebook-management.d.ts +8 -8
- package/dist/tools/handlers/notebook-management.d.ts.map +1 -1
- package/dist/tools/handlers/notebook-management.js +34 -80
- package/dist/tools/handlers/notebook-management.js.map +1 -1
- package/dist/tools/handlers/session-management.d.ts.map +1 -1
- package/dist/tools/handlers/session-management.js +12 -5
- package/dist/tools/handlers/session-management.js.map +1 -1
- package/dist/tools/handlers/system.d.ts.map +1 -1
- package/dist/tools/handlers/system.js +45 -10
- package/dist/tools/handlers/system.js.map +1 -1
- package/dist/tools/handlers/types.d.ts +1 -1
- package/dist/tools/handlers/types.d.ts.map +1 -1
- package/dist/tools/handlers/webhooks.d.ts.map +1 -1
- package/dist/tools/handlers/webhooks.js +15 -13
- package/dist/tools/handlers/webhooks.js.map +1 -1
- package/dist/types.d.ts +7 -17
- package/dist/types.d.ts.map +1 -1
- package/dist/utils/audit-logger.d.ts +19 -1
- package/dist/utils/audit-logger.d.ts.map +1 -1
- package/dist/utils/audit-logger.js +193 -27
- package/dist/utils/audit-logger.js.map +1 -1
- package/dist/utils/cleanup-manager.d.ts.map +1 -1
- package/dist/utils/cleanup-manager.js +6 -3
- package/dist/utils/cleanup-manager.js.map +1 -1
- package/dist/utils/crypto.d.ts +4 -1
- package/dist/utils/crypto.d.ts.map +1 -1
- package/dist/utils/crypto.js +32 -21
- package/dist/utils/crypto.js.map +1 -1
- package/dist/utils/file-lock.d.ts.map +1 -1
- package/dist/utils/file-lock.js +80 -16
- package/dist/utils/file-lock.js.map +1 -1
- package/dist/utils/file-permissions.d.ts +2 -0
- package/dist/utils/file-permissions.d.ts.map +1 -1
- package/dist/utils/file-permissions.js +2 -1
- package/dist/utils/file-permissions.js.map +1 -1
- package/dist/utils/logger.d.ts +4 -0
- package/dist/utils/logger.d.ts.map +1 -1
- package/dist/utils/logger.js +16 -0
- package/dist/utils/logger.js.map +1 -1
- package/dist/utils/page-utils.d.ts.map +1 -1
- package/dist/utils/page-utils.js +22 -39
- package/dist/utils/page-utils.js.map +1 -1
- package/dist/utils/response-validator.d.ts.map +1 -1
- package/dist/utils/response-validator.js +27 -22
- package/dist/utils/response-validator.js.map +1 -1
- package/dist/utils/secrets-scanner.d.ts +11 -0
- package/dist/utils/secrets-scanner.d.ts.map +1 -1
- package/dist/utils/secrets-scanner.js +63 -15
- package/dist/utils/secrets-scanner.js.map +1 -1
- package/dist/utils/secure-memory.d.ts +9 -31
- package/dist/utils/secure-memory.d.ts.map +1 -1
- package/dist/utils/secure-memory.js +17 -102
- package/dist/utils/secure-memory.js.map +1 -1
- package/dist/utils/security.d.ts +4 -3
- package/dist/utils/security.d.ts.map +1 -1
- package/dist/utils/security.js +41 -11
- package/dist/utils/security.js.map +1 -1
- package/dist/utils/stealth-utils.d.ts.map +1 -1
- package/dist/utils/stealth-utils.js +4 -4
- package/dist/utils/stealth-utils.js.map +1 -1
- package/dist/webhooks/types.d.ts +2 -0
- package/dist/webhooks/types.d.ts.map +1 -1
- package/dist/webhooks/webhook-dispatcher.d.ts +80 -12
- package/dist/webhooks/webhook-dispatcher.d.ts.map +1 -1
- package/dist/webhooks/webhook-dispatcher.js +472 -72
- package/dist/webhooks/webhook-dispatcher.js.map +1 -1
- package/docs/archive/ISSUES-legacy-2026-04-24.md +644 -0
- package/docs/dependency-risk.md +25 -0
- package/docs/testing-runbook.md +166 -0
- package/docs/usage-guide.md +2 -1
- package/package.json +32 -15
package/README.md
CHANGED
|
@@ -7,7 +7,7 @@
|
|
|
7
7
|
**Zero-hallucination answers • Gemini Deep Research • 17 Security Layers • Enterprise Compliance**
|
|
8
8
|
|
|
9
9
|
[](https://www.npmjs.com/package/@pan-sec/notebooklm-mcp)
|
|
10
|
-
[](https://calver.org/)
|
|
11
11
|
[](https://www.typescriptlang.org/)
|
|
12
12
|
[](https://modelcontextprotocol.io/)
|
|
13
13
|
[](#cross-platform-support)
|
|
@@ -17,7 +17,7 @@
|
|
|
17
17
|
[](#-document-api-v190)
|
|
18
18
|
[](#programmatic-notebook-creation-v170)
|
|
19
19
|
[](./docs/COMPLIANCE-SPEC.md)
|
|
20
|
-
[](./tests/)
|
|
21
21
|
|
|
22
22
|
[**What's New 2026**](#-whats-new-in-2026) • [**Deep Research**](#-gemini-deep-research) • [**Document API**](#-document-api) • [**Create Notebooks**](#programmatic-notebook-creation) • [**Security**](#security-features) • [**Install**](#installation)
|
|
23
23
|
|
|
@@ -44,10 +44,11 @@
|
|
|
44
44
|
|
|
45
45
|
## 🚀 What's New in 2026
|
|
46
46
|
|
|
47
|
-
**Latest: v2026.
|
|
47
|
+
**Latest: v2026.3.0** — The Security Audit Release. 334-issue independent audit closed. 609 tests. Full MCP protocol compliance.
|
|
48
48
|
|
|
49
49
|
| Version | Highlights |
|
|
50
50
|
|---------|------------|
|
|
51
|
+
| **v2026.3.0** | **The Security Audit Release** — Four parallel AI code reviews (security, protocol, architecture, testing) against 334 issues. All highs and mediums resolved. Tests: 139 → 609 across 50 files (4.4×). Full MCP protocol compliance: structuredContent, isError, transport tags. Schema bounds on all 48 tools. Annotation correctness. Webhook SSRF fix. Audit log integrity (hash chain, concurrent write lock, rotation continuity). Per-page mutex. HandlerContext DI. Cert pinning retracted (claims aligned with implementation). |
|
|
51
52
|
| **v2026.2.10** | **The Hardening Release** — 3 new security layers (14→17): secure-by-default auth, exponential backoff lockout, credential isolation. Architecture overhaul: 3,611-line handler split into 9 domain modules, tool registry pattern. Gemini API retry with backoff. Multi-stage Docker build. Token CLI (`token show/rotate`). 168 tests. |
|
|
52
53
|
| **v2026.2.9** | `performSetup` no longer wipes credentials before Chrome opens — prevents auth destruction on failed launch |
|
|
53
54
|
| **v2026.2.8** | `cleanup_data` never deletes auth dirs (`browser_state/`, `chrome_profile/`) — auth survives all cleanup paths |
|
|
@@ -80,13 +81,50 @@ claude mcp add notebooklm -- npx @pan-sec/notebooklm-mcp@latest
|
|
|
80
81
|
| Create notebooks programmatically | ❌ | ✅ **UNIQUE** |
|
|
81
82
|
| Gemini Deep Research | ❌ | ✅ **EXCLUSIVE** |
|
|
82
83
|
| Document API (no browser) | ❌ | ✅ **EXCLUSIVE** |
|
|
83
|
-
| Post-quantum encryption | ❌ | ✅ **
|
|
84
|
+
| Post-quantum encryption | ❌ | ✅ **Hybrid PQ at-rest** |
|
|
84
85
|
| Enterprise compliance | ❌ | ✅ **GDPR/SOC2/CSSF-ready** |
|
|
85
86
|
| Video Overview generation | ❌ | ✅ **NEW** |
|
|
86
87
|
| Data Table extraction | ❌ | ✅ **NEW** |
|
|
87
88
|
| Chat history extraction | ❌ | ✅ |
|
|
88
89
|
| Deep health verification | ❌ | ✅ |
|
|
89
90
|
|
|
91
|
+
---
|
|
92
|
+
|
|
93
|
+
## 🔬 Security Audit 2026 — What We Found and Fixed
|
|
94
|
+
|
|
95
|
+
In April 2026, we commissioned a parallel deep-audit of v2026.2.11 (`main @ 2973097`) using four specialised AI code reviewers, each focused on a different attack surface: **security vulnerabilities**, **protocol correctness**, **architecture quality**, and **testing gaps and edge cases**. The four reviewers operated independently so their findings wouldn't influence each other. Together they produced a **334-item master issue list** covering protocol correctness, security vulnerabilities, architecture flaws, test gaps, and documentation accuracy. All high and medium issues are now resolved in v2026.3.0.
|
|
96
|
+
|
|
97
|
+
### Audit by the Numbers
|
|
98
|
+
|
|
99
|
+
| Metric | Before (v2026.2.11) | After (v2026.3.0) |
|
|
100
|
+
|--------|---------------------|--------------------|
|
|
101
|
+
| Tests | 139 | **609 across 50 files** |
|
|
102
|
+
| Test suites | ~6 | **50** |
|
|
103
|
+
| TypeScript errors (`tsc --noEmit`) | 0 | **0 (maintained)** |
|
|
104
|
+
| npm audit vulnerabilities | 0 | **0 (maintained)** |
|
|
105
|
+
| MCP protocol compliance | Partial | **Full** (structuredContent, isError, transport tags) |
|
|
106
|
+
| Audit log integrity | Basic | **Hash-chain verified on read** |
|
|
107
|
+
| Concurrent write safety | ❌ | **✅ Write-locked** |
|
|
108
|
+
| Webhook SSRF | ❌ | **✅ Blocked** |
|
|
109
|
+
|
|
110
|
+
### What the Four Reviewers Found
|
|
111
|
+
|
|
112
|
+
**Security reviewer:** Identified the `forceAuth` bypass in `validateToken()` allowing unauthenticated access to filesystem tools; webhook SSRF via unvalidated delivery targets; audit log hash chain not verified on read; concurrent audit writes interleaving entries; auth token salt not persisted (tokens invalidated on restart).
|
|
113
|
+
|
|
114
|
+
**Protocol reviewer:** Found 38 tools returning incorrect response shapes (missing `structuredContent`, wrong `isError` semantics, transport tags leaking into content); all 48 tools had incorrect or missing `readOnlyHint`/`idempotentHint`/`destructiveHint` annotations; 9 tool schemas lacked numeric bounds, enabling out-of-range inputs.
|
|
115
|
+
|
|
116
|
+
**Architecture reviewer:** Flagged the 3,611-line `handlers.ts` as a maintenance liability; singleton imports throughout domain functions preventing unit testing; the 500-line `switch/case` dispatch adding O(n) overhead and making tool registration error-prone.
|
|
117
|
+
|
|
118
|
+
**Testing & edge-case reviewer:** Found test suite at 139 tests with minimal coverage of security-critical modules; `mcp-auth.ts` at near-zero coverage; no tests for prompt injection patterns, audit log tampering, or concurrent browser session state; the DSAR handler had an undetected race condition.
|
|
119
|
+
|
|
120
|
+
### Key Fixes
|
|
121
|
+
|
|
122
|
+
- **17 security vulnerabilities** addressed (auth bypass, SSRF, audit integrity, race conditions, selector injection vectors)
|
|
123
|
+
- **MCP protocol fully compliant** — all 48 tools return correct `structuredContent`/`isError` shapes; annotations accurate; schema bounds enforced
|
|
124
|
+
- **Architecture decomposed** — `handlers.ts` split into 9 domain modules with HandlerContext dependency injection; 100% unit-testable without process mocks
|
|
125
|
+
- **Test coverage** — 15 new security-critical test suites including browser session, auth, prompt injection, audit log, webhook, DSAR, and compliance
|
|
126
|
+
- **Claims aligned** — certificate pinning removed (implementation was retracted in Day 1 of the audit); PQ encryption scope documented accurately; compliance language uses "controls implemented" not "certified"
|
|
127
|
+
|
|
90
128
|
<details>
|
|
91
129
|
<summary><b>📋 Full Feature List (48 Tools)</b></summary>
|
|
92
130
|
|
|
@@ -208,7 +246,7 @@ Run deep research in the background and check progress:
|
|
|
208
246
|
|
|
209
247
|
```
|
|
210
248
|
┌──────────────────────────────────────────────────────────────────────────────┐
|
|
211
|
-
│ NotebookLM MCP Server v2026.
|
|
249
|
+
│ NotebookLM MCP Server v2026.3.x │
|
|
212
250
|
├──────────────────────────────────────────────────────────────────────────────┤
|
|
213
251
|
│ │
|
|
214
252
|
│ ┌────────────────────────────────┐ ┌──────────────────────────────────┐ │
|
|
@@ -237,7 +275,7 @@ Run deep research in the background and check progress:
|
|
|
237
275
|
│ ┌─────────────────────────────────┐ │
|
|
238
276
|
│ │ 17 SECURITY LAYERS │ │
|
|
239
277
|
│ │ Post-Quantum • Audit Logs │ │
|
|
240
|
-
│ │
|
|
278
|
+
│ │ Secrets Scan • Memory Wipe │ │
|
|
241
279
|
│ │ GDPR • SOC2 • CSSF Ready* │ │
|
|
242
280
|
│ └─────────────────────────────────┘ │
|
|
243
281
|
└──────────────────────────────────────────────────────────────────────────────┘
|
|
@@ -644,9 +682,8 @@ This fork adds **17 security hardening layers** to protect that data.
|
|
|
644
682
|
|
|
645
683
|
| Layer | Feature | Protection |
|
|
646
684
|
|-------|---------|------------|
|
|
647
|
-
| 🔐 | **Post-Quantum Encryption** | ML-KEM-768 + ChaCha20-Poly1305 hybrid |
|
|
685
|
+
| 🔐 | **Post-Quantum Encryption** | ML-KEM-768 + ChaCha20-Poly1305 hybrid (local at-rest) |
|
|
648
686
|
| 🔍 | **Secrets Scanning** | Detects 30+ credential patterns (AWS, GitHub, Slack...) |
|
|
649
|
-
| 📌 | **Certificate Pinning** | Blocks MITM attacks on Google connections |
|
|
650
687
|
| 🧹 | **Memory Scrubbing** | Zeros sensitive data after use |
|
|
651
688
|
| 📝 | **Audit Logging** | Tamper-evident logs with hash chains |
|
|
652
689
|
| ⏱️ | **Session Timeout** | 8h hard limit + 30m inactivity auto-logout |
|
|
@@ -661,9 +698,9 @@ This fork adds **17 security hardening layers** to protect that data.
|
|
|
661
698
|
| 📈 | **Exponential Backoff** | Lockout escalation: 5min → 15min → 45min → 4hr cap |
|
|
662
699
|
| 🗝️ | **Credential Isolation** | SecureCredential TTL + env var scrubbing from process.env |
|
|
663
700
|
|
|
664
|
-
### Post-Quantum
|
|
701
|
+
### Post-Quantum Primitives (Local At-Rest)
|
|
665
702
|
|
|
666
|
-
|
|
703
|
+
Encryption of secrets on disk uses hybrid post-quantum primitives:
|
|
667
704
|
|
|
668
705
|
```
|
|
669
706
|
ML-KEM-768 (Kyber) + ChaCha20-Poly1305
|
|
@@ -672,7 +709,12 @@ ML-KEM-768 (Kyber) + ChaCha20-Poly1305
|
|
|
672
709
|
- **ML-KEM-768**: NIST-standardized post-quantum key encapsulation
|
|
673
710
|
- **ChaCha20-Poly1305**: Modern stream cipher (immune to timing attacks)
|
|
674
711
|
|
|
675
|
-
|
|
712
|
+
**Scope, honestly:** this is **local at-rest** encryption. Both keys live
|
|
713
|
+
on the same machine — the PQ secret key is wrapped with a classical key
|
|
714
|
+
derived from a machine-bound secret, not held by a remote recipient.
|
|
715
|
+
This protects against offline theft of individual encrypted files, not
|
|
716
|
+
against Harvest-Now-Decrypt-Later attacks (those require a remote PQ
|
|
717
|
+
recipient holding the unwrap key).
|
|
676
718
|
|
|
677
719
|
### Cross-Platform Support
|
|
678
720
|
|
|
@@ -733,6 +775,8 @@ All core NotebookLM features work immediately with just browser authentication:
|
|
|
733
775
|
|
|
734
776
|
**Optional:** Add `GEMINI_API_KEY` for bonus features like `deep_research`, `gemini_query`, and `upload_document`.
|
|
735
777
|
|
|
778
|
+
For repeatable authenticated validation, see the [Authenticated Testing Runbook](./docs/testing-runbook.md).
|
|
779
|
+
|
|
736
780
|
---
|
|
737
781
|
|
|
738
782
|
### Claude Code
|
|
@@ -989,7 +1033,7 @@ Go to [notebooklm.google.com](https://notebooklm.google.com) → Create notebook
|
|
|
989
1033
|
| Browser cookies | Post-quantum encrypted at rest |
|
|
990
1034
|
| Session tokens | Auto-expire + memory scrubbing |
|
|
991
1035
|
| Query history | Audit logged with tamper detection |
|
|
992
|
-
| Google connection |
|
|
1036
|
+
| Google connection | TLS with response validation |
|
|
993
1037
|
| Log output | Credentials auto-redacted |
|
|
994
1038
|
| API responses | Scanned for leaked secrets |
|
|
995
1039
|
| Gemini API key | Secure memory handling |
|
|
@@ -1029,9 +1073,6 @@ NLMCP_SECRETS_SCANNING=true
|
|
|
1029
1073
|
NLMCP_SECRETS_BLOCK=false # Block on detection
|
|
1030
1074
|
NLMCP_SECRETS_REDACT=true # Auto-redact
|
|
1031
1075
|
|
|
1032
|
-
# Certificate Pinning
|
|
1033
|
-
NLMCP_CERT_PINNING=true
|
|
1034
|
-
|
|
1035
1076
|
# Audit Logging
|
|
1036
1077
|
NLMCP_AUDIT_ENABLED=true
|
|
1037
1078
|
|
|
@@ -1111,9 +1152,8 @@ Or integrate in CI/CD:
|
|
|
1111
1152
|
| Feature | Others | @pan-sec/notebooklm-mcp |
|
|
1112
1153
|
|---------|--------|-------------------------|
|
|
1113
1154
|
| Cross-platform (Linux/macOS/Windows) | ⚠️ Partial | ✅ Full |
|
|
1114
|
-
| **Post-quantum encryption** | ❌ | ✅ ML-KEM-768 + ChaCha20 |
|
|
1155
|
+
| **Post-quantum encryption** | ❌ | ✅ ML-KEM-768 + ChaCha20 (local at-rest) |
|
|
1115
1156
|
| **Secrets scanning** | ❌ | ✅ 30+ patterns |
|
|
1116
|
-
| **Certificate pinning** | ❌ | ✅ Google MITM protection |
|
|
1117
1157
|
| **Memory scrubbing** | ❌ | ✅ Zero-on-free |
|
|
1118
1158
|
| **Audit logging** | ❌ | ✅ Hash-chained |
|
|
1119
1159
|
| **MCP authentication** | ❌ | ✅ Token + lockout |
|
|
@@ -1132,6 +1172,7 @@ Or integrate in CI/CD:
|
|
|
1132
1172
|
|
|
1133
1173
|
| Version | Highlights |
|
|
1134
1174
|
|---------|------------|
|
|
1175
|
+
| **v2026.3.0** | 🔬 **Security Audit Release** — 334-issue independent audit. Tests 139→609 (50 files). Full MCP protocol compliance. Webhook SSRF fix. Audit log hash-chain verified on read. Per-page mutex. HandlerContext DI. Cert pinning retracted. |
|
|
1135
1176
|
| **v2026.2.9** | 🔐 `performSetup` no longer destroys credentials before Chrome opens — last root cause of auth loop fixed |
|
|
1136
1177
|
| **v2026.2.8** | 🛡️ `cleanup_data` excludes `browser_state/` and `chrome_profile/` from all deletion paths — auth survives cleanup |
|
|
1137
1178
|
| **v2026.2.7** | 🚫 Block headless `setup_auth`; `auth-now.mjs` standalone script handles Chrome profile locks and silent save failures |
|
package/SECURITY.md
CHANGED
|
@@ -2,27 +2,33 @@
|
|
|
2
2
|
|
|
3
3
|
This is a security-hardened fork of [PleasePrompto/notebooklm-mcp](https://github.com/PleasePrompto/notebooklm-mcp), maintained by [Pantheon Security](https://pantheonsecurity.io).
|
|
4
4
|
|
|
5
|
-
**Version**:
|
|
6
|
-
**Security Features**:
|
|
5
|
+
**Version**: 2026.3.0
|
|
6
|
+
**Security Features**: 17 hardening layers
|
|
7
7
|
**Platforms**: Linux, macOS, Windows
|
|
8
8
|
|
|
9
|
+
> **v2026.3.0 — Security Audit Release.** In April 2026 we ran a parallel deep-audit of this codebase using four specialised AI code reviewers, each independently focused on a different attack surface. They produced a 334-item master issue list. Every high and medium issue is resolved in this release. See [CHANGELOG.md](./CHANGELOG.md#20263.0---2026-04-25) for the full list.
|
|
10
|
+
|
|
9
11
|
## Security Features Overview
|
|
10
12
|
|
|
11
13
|
| Feature | Status | Description |
|
|
12
14
|
|---------|--------|-------------|
|
|
13
|
-
| Input Validation | ✅ | URL whitelisting,
|
|
15
|
+
| Input Validation | ✅ | URL whitelisting, Zod schemas, injection prevention |
|
|
14
16
|
| Rate Limiting | ✅ | Per-session request throttling |
|
|
15
|
-
| Log Sanitization | ✅ | Credential masking |
|
|
16
|
-
| Audit Logging | ✅ |
|
|
17
|
+
| Log Sanitization | ✅ | Credential masking, PII redaction |
|
|
18
|
+
| Audit Logging | ✅ | Hash-chained tamper-evident logs, verified on read |
|
|
17
19
|
| Session Timeout | ✅ | Hard lifetime + inactivity limits |
|
|
18
|
-
| MCP Authentication | ✅ | Token-based auth with lockout |
|
|
19
|
-
| Response Validation | ✅ | Prompt injection detection |
|
|
20
|
-
| **Post-Quantum Encryption** | ✅ | ML-KEM-768 + ChaCha20-Poly1305 |
|
|
21
|
-
| **Secrets Scanning** | ✅ | Detect
|
|
22
|
-
| **
|
|
23
|
-
| **
|
|
24
|
-
| **MEDUSA Integration** | ✅ | Automated security scanning |
|
|
20
|
+
| MCP Authentication | ✅ | Token-based auth with persistent salt + lockout |
|
|
21
|
+
| Response Validation | ✅ | Prompt injection detection, suspicious URL blocking |
|
|
22
|
+
| **Post-Quantum Encryption** | ✅ | ML-KEM-768 + ChaCha20-Poly1305 (local at-rest) |
|
|
23
|
+
| **Secrets Scanning** | ✅ | Detect 30+ credential patterns (AWS, GitHub, Slack…) |
|
|
24
|
+
| **Memory Scrubbing** | ✅ | Zero sensitive data after use, FinalizationRegistry cleanup |
|
|
25
|
+
| **MEDUSA Integration** | ✅ | Automated security scanning in CI |
|
|
25
26
|
| **Cross-Platform Permissions** | ✅ | Secure file permissions on all OSes |
|
|
27
|
+
| **Secure-by-Default Auth** | ✅ | Auth enabled without configuration; explicit opt-out via `NLMCP_AUTH_DISABLED=true` |
|
|
28
|
+
| **Exponential Backoff Lockout** | ✅ | Failed auth lockouts escalate 5min → 15min → 45min → 4hr; `lockoutCount` persists |
|
|
29
|
+
| **Credential Isolation** | ✅ | `LOGIN_PASSWORD` and `GEMINI_API_KEY` wrapped in `SecureCredential` with 30-min TTL; env vars scrubbed from `process.env` |
|
|
30
|
+
| **Webhook SSRF Protection** | ✅ | Delivery targets validated against SSRF blocklist; HMAC signing on all deliveries |
|
|
31
|
+
| **Per-Page Mutex** | ✅ | Browser page operations serialised per-page to prevent race conditions |
|
|
26
32
|
|
|
27
33
|
---
|
|
28
34
|
|
|
@@ -58,16 +64,23 @@ All sensitive files are automatically protected with owner-only permissions:
|
|
|
58
64
|
|
|
59
65
|
---
|
|
60
66
|
|
|
61
|
-
## Post-Quantum Encryption
|
|
62
|
-
|
|
63
|
-
### Why Post-Quantum?
|
|
67
|
+
## Post-Quantum Encryption (Local At-Rest)
|
|
64
68
|
|
|
65
|
-
|
|
69
|
+
### Scope
|
|
66
70
|
|
|
67
|
-
|
|
71
|
+
Secrets written to disk (cookies, session state, auth tokens, PQ key pair) are encrypted with hybrid post-quantum primitives:
|
|
68
72
|
- **ML-KEM-768 (Kyber)** - NIST-standardized post-quantum key encapsulation
|
|
69
73
|
- **ChaCha20-Poly1305** - Modern stream cipher (NOT AES-GCM)
|
|
70
74
|
|
|
75
|
+
### What this does and does not protect against
|
|
76
|
+
|
|
77
|
+
This is **local at-rest** encryption. Both keys live on the same machine: the PQ secret key is wrapped with a classical key derived from a machine-bound secret, not held by a remote recipient.
|
|
78
|
+
|
|
79
|
+
- ✅ Protects against **offline theft** of individual encrypted files (backup leak, misplaced disk)
|
|
80
|
+
- ✅ Defence-in-depth on top of the underlying filesystem permissions
|
|
81
|
+
- ❌ Does **NOT** protect against Harvest-Now-Decrypt-Later attacks — that threat model requires a remote PQ recipient holding the unwrap key, which this implementation does not have
|
|
82
|
+
- ❌ Does **NOT** protect against an attacker who compromises the host — they can read the machine-derived key and unwrap the PQ secret key in the same step
|
|
83
|
+
|
|
71
84
|
### Why ChaCha20-Poly1305 over AES-GCM?
|
|
72
85
|
|
|
73
86
|
| Property | ChaCha20-Poly1305 | AES-GCM |
|
|
@@ -158,41 +171,6 @@ NLMCP_SECRETS_IGNORE=pattern1,pattern2 # Ignore specific patterns
|
|
|
158
171
|
|
|
159
172
|
---
|
|
160
173
|
|
|
161
|
-
## Certificate Pinning
|
|
162
|
-
|
|
163
|
-
Protects HTTPS connections to Google by validating server certificate chains against known-good SPKI hashes.
|
|
164
|
-
|
|
165
|
-
### Why Certificate Pinning?
|
|
166
|
-
|
|
167
|
-
Prevents man-in-the-middle attacks even if:
|
|
168
|
-
- A rogue CA certificate is installed on the system
|
|
169
|
-
- Corporate proxies attempt SSL inspection
|
|
170
|
-
- DNS is compromised
|
|
171
|
-
|
|
172
|
-
### Pinned Certificates
|
|
173
|
-
|
|
174
|
-
- **GTS Root R1-R4** - Google Trust Services roots
|
|
175
|
-
- **GlobalSign Root CA R2** - Backup root
|
|
176
|
-
- **DigiCert Global Root G2** - Backup root
|
|
177
|
-
|
|
178
|
-
### Configuration
|
|
179
|
-
|
|
180
|
-
```bash
|
|
181
|
-
NLMCP_CERT_PINNING=true # Enable pinning (default: true)
|
|
182
|
-
NLMCP_CERT_FAIL_OPEN=false # Allow on failure (default: false)
|
|
183
|
-
NLMCP_CERT_REPORT_ONLY=false # Log but don't block (default: false)
|
|
184
|
-
```
|
|
185
|
-
|
|
186
|
-
### Violation Response
|
|
187
|
-
|
|
188
|
-
```
|
|
189
|
-
🔒 Certificate pinning violation for notebooklm.google.com
|
|
190
|
-
Chain hashes: abc123...
|
|
191
|
-
Expected one of: hxqRlP..., Vfd95B...
|
|
192
|
-
```
|
|
193
|
-
|
|
194
|
-
---
|
|
195
|
-
|
|
196
174
|
## Memory Scrubbing
|
|
197
175
|
|
|
198
176
|
Sensitive data is securely wiped from memory after use to prevent:
|
|
@@ -431,7 +409,7 @@ This MCP uses browser automation (Patchright) which:
|
|
|
431
409
|
The Chrome profile directory itself is not fully encrypted:
|
|
432
410
|
- `~/.local/share/notebooklm-mcp/chrome_profile/`
|
|
433
411
|
|
|
434
|
-
The sensitive state files (cookies, session) ARE encrypted with post-quantum
|
|
412
|
+
The sensitive state files (cookies, session) ARE encrypted with hybrid post-quantum primitives for at-rest protection. See [Post-Quantum Encryption (Local At-Rest)](#post-quantum-encryption-local-at-rest) above for the exact threat model this covers.
|
|
435
413
|
|
|
436
414
|
---
|
|
437
415
|
|
|
@@ -493,18 +471,10 @@ import {
|
|
|
493
471
|
scanAndRedactSecrets,
|
|
494
472
|
} from './utils/secrets-scanner.js';
|
|
495
473
|
|
|
496
|
-
// Certificate pinning
|
|
497
|
-
import {
|
|
498
|
-
CertificatePinningManager,
|
|
499
|
-
getCertificatePinningManager,
|
|
500
|
-
validateCertificatePin,
|
|
501
|
-
} from './utils/cert-pinning.js';
|
|
502
|
-
|
|
503
474
|
// Memory security
|
|
504
475
|
import {
|
|
505
476
|
SecureString,
|
|
506
477
|
SecureCredential,
|
|
507
|
-
SecureObject,
|
|
508
478
|
zeroBuffer,
|
|
509
479
|
withSecureCredential,
|
|
510
480
|
secureCompare,
|
|
@@ -11,6 +11,7 @@
|
|
|
11
11
|
*
|
|
12
12
|
* Based on the Python implementation from auth.py
|
|
13
13
|
*/
|
|
14
|
+
/// <reference types="node" resolution-mode="require"/>
|
|
14
15
|
import type { BrowserContext, Page } from "patchright";
|
|
15
16
|
import type { ProgressCallback } from "../types.js";
|
|
16
17
|
export declare class AuthManager {
|
|
@@ -94,7 +95,7 @@ export declare class AuthManager {
|
|
|
94
95
|
*
|
|
95
96
|
* SIMPLE & RELIABLE: Just wait for URL to change to notebooklm.google.com
|
|
96
97
|
*/
|
|
97
|
-
performLogin(page: Page, sendProgress?: ProgressCallback): Promise<boolean>;
|
|
98
|
+
performLogin(page: Page, sendProgress?: ProgressCallback, signal?: AbortSignal): Promise<boolean>;
|
|
98
99
|
/**
|
|
99
100
|
* Attempt to authenticate using configured credentials
|
|
100
101
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"auth-manager.d.ts","sourceRoot":"","sources":["../../src/auth/auth-manager.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG
|
|
1
|
+
{"version":3,"file":"auth-manager.d.ts","sourceRoot":"","sources":["../../src/auth/auth-manager.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;;AAEH,OAAO,KAAK,EAAE,cAAc,EAAE,IAAI,EAAE,MAAM,YAAY,CAAC;AAYvD,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AA6BpD,qBAAa,WAAW;IACtB,OAAO,CAAC,aAAa,CAAS;IAC9B,OAAO,CAAC,eAAe,CAAS;IAChC,OAAO,CAAC,YAAY,CAAS;;IAa7B;;;;OAIG;IACG,gBAAgB,CAAC,OAAO,EAAE,cAAc,EAAE,IAAI,CAAC,EAAE,IAAI,GAAG,OAAO,CAAC,OAAO,CAAC;IAoD9E;;OAEG;IACG,aAAa,IAAI,OAAO,CAAC,OAAO,CAAC;IAKvC;;OAEG;IACH,YAAY,IAAI,MAAM,GAAG,IAAI;IAQ7B;;OAEG;IACG,iBAAiB,IAAI,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;IAejD;;OAEG;IACG,kBAAkB,IAAI,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,IAAI,CAAC;IAyBlE;;OAEG;IACG,aAAa,CAAC,OAAO,EAAE,cAAc,GAAG,OAAO,CAAC,OAAO,CAAC;IAoC9D;;OAEG;IACG,qBAAqB,CAAC,OAAO,EAAE,cAAc,GAAG,OAAO,CAAC,OAAO,CAAC;IAiDtE;;;;;;;;;;;;;;;;OAgBG;IACG,iBAAiB,CACrB,OAAO,EAAE,cAAc,EACvB,UAAU,SAAI,GACb,OAAO,CAAC,OAAO,CAAC;IAmDnB;;;OAGG;YACW,mBAAmB;IAajC;;;;OAIG;YACW,cAAc;IAc5B;;;;OAIG;YACW,sBAAsB;IAmBpC;;;OAGG;IACG,cAAc,IAAI,OAAO,CAAC,OAAO,CAAC;IAgCxC;;;;;OAKG;IACG,YAAY,CAChB,IAAI,EAAE,IAAI,EACV,YAAY,CAAC,EAAE,gBAAgB,EAC/B,MAAM,CAAC,EAAE,WAAW,GACnB,OAAO,CAAC,OAAO,CAAC;IAmGnB;;OAEG;IACG,oBAAoB,CACxB,OAAO,EAAE,cAAc,EACvB,IAAI,EAAE,IAAI,EACV,KAAK,EAAE,MAAM,EACb,QAAQ,EAAE,MAAM,GACf,OAAO,CAAC,OAAO,CAAC;IAqJnB;;;;;OAKG;YACW,yBAAyB;IA6BvC;;;;;OAKG;YACW,eAAe;IAuB7B;;OAEG;YACW,oBAAoB;IAgClC;;OAEG;YACW,cAAc;IAiI5B;;OAEG;YACW,YAAY;IAkG1B;;OAEG;YACW,SAAS;IAwBvB;;;OAGG;IACG,aAAa,CAAC,OAAO,EAAE,cAAc,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAiCjF;;;;;;;;;;;;;;;;OAgBG;IACG,YAAY,CAAC,YAAY,CAAC,EAAE,gBAAgB,EAAE,gBAAgB,CAAC,EAAE,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC;IA6FjG;;;;;;;;;;OAUG;IACG,gBAAgB,IAAI,OAAO,CAAC,IAAI,CAAC;IAoDvC;;OAEG;IACG,UAAU,IAAI,OAAO,CAAC,OAAO,CAAC;IAkBpC;;OAEG;IACG,cAAc,IAAI,OAAO,CAAC,OAAO,CAAC;CAmDzC"}
|