@dollhousemcp/mcp-server 1.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/CHANGELOG.md +132 -0
- package/LICENSE +51 -0
- package/README.md +1124 -0
- package/data/agents/code-reviewer.md +296 -0
- package/data/agents/research-assistant.md +259 -0
- package/data/agents/task-manager.md +206 -0
- package/data/ensembles/business-advisor.md +354 -0
- package/data/ensembles/creative-studio.md +288 -0
- package/data/ensembles/development-team.md +292 -0
- package/data/ensembles/security-analysis-team.md +438 -0
- package/data/memories/conversation-history.md +146 -0
- package/data/memories/learning-progress.md +376 -0
- package/data/memories/project-context.md +268 -0
- package/data/personas/business-consultant.md +50 -0
- package/data/personas/creative-writer.md +44 -0
- package/data/personas/debug-detective.md +59 -0
- package/data/personas/eli5-explainer.md +49 -0
- package/data/personas/security-analyst.md +161 -0
- package/data/personas/technical-analyst.md +43 -0
- package/data/skills/code-review.md +112 -0
- package/data/skills/creative-writing.md +174 -0
- package/data/skills/data-analysis.md +160 -0
- package/data/skills/penetration-testing.md +374 -0
- package/data/skills/research.md +181 -0
- package/data/skills/threat-modeling.md +469 -0
- package/data/skills/translation.md +148 -0
- package/data/templates/code-documentation.md +409 -0
- package/data/templates/email-professional.md +158 -0
- package/data/templates/meeting-notes.md +141 -0
- package/data/templates/penetration-test-report.md +608 -0
- package/data/templates/project-brief.md +234 -0
- package/data/templates/report-executive.md +258 -0
- package/data/templates/security-vulnerability-report.md +457 -0
- package/data/templates/threat-assessment-report.md +774 -0
- package/dist/cache/APICache.d.ts +23 -0
- package/dist/cache/APICache.d.ts.map +1 -0
- package/dist/cache/APICache.js +42 -0
- package/dist/cache/index.d.ts +5 -0
- package/dist/cache/index.d.ts.map +1 -0
- package/dist/cache/index.js +5 -0
- package/dist/collection/CollectionBrowser.d.ts +24 -0
- package/dist/collection/CollectionBrowser.d.ts.map +1 -0
- package/dist/collection/CollectionBrowser.js +120 -0
- package/dist/collection/CollectionSearch.d.ts +18 -0
- package/dist/collection/CollectionSearch.d.ts.map +1 -0
- package/dist/collection/CollectionSearch.js +48 -0
- package/dist/collection/ElementInstaller.d.ts +33 -0
- package/dist/collection/ElementInstaller.d.ts.map +1 -0
- package/dist/collection/ElementInstaller.js +142 -0
- package/dist/collection/GitHubClient.d.ts +22 -0
- package/dist/collection/GitHubClient.d.ts.map +1 -0
- package/dist/collection/GitHubClient.js +114 -0
- package/dist/collection/MarketplaceBrowser.d.ts +24 -0
- package/dist/collection/MarketplaceBrowser.d.ts.map +1 -0
- package/dist/collection/MarketplaceBrowser.js +115 -0
- package/dist/collection/MarketplaceSearch.d.ts +18 -0
- package/dist/collection/MarketplaceSearch.d.ts.map +1 -0
- package/dist/collection/MarketplaceSearch.js +48 -0
- package/dist/collection/PersonaDetails.d.ts +22 -0
- package/dist/collection/PersonaDetails.d.ts.map +1 -0
- package/dist/collection/PersonaDetails.js +71 -0
- package/dist/collection/PersonaInstaller.d.ts +26 -0
- package/dist/collection/PersonaInstaller.d.ts.map +1 -0
- package/dist/collection/PersonaInstaller.js +103 -0
- package/dist/collection/PersonaSubmitter.d.ts +19 -0
- package/dist/collection/PersonaSubmitter.d.ts.map +1 -0
- package/dist/collection/PersonaSubmitter.js +57 -0
- package/dist/collection/index.d.ts +10 -0
- package/dist/collection/index.d.ts.map +1 -0
- package/dist/collection/index.js +10 -0
- package/dist/config/constants.d.ts +25 -0
- package/dist/config/constants.d.ts.map +1 -0
- package/dist/config/constants.js +34 -0
- package/dist/config/index.d.ts +6 -0
- package/dist/config/index.d.ts.map +1 -0
- package/dist/config/index.js +6 -0
- package/dist/config/indicator-config.d.ts +107 -0
- package/dist/config/indicator-config.d.ts.map +1 -0
- package/dist/config/indicator-config.js +158 -0
- package/dist/constants/defaultPersonas.d.ts +10 -0
- package/dist/constants/defaultPersonas.d.ts.map +1 -0
- package/dist/constants/defaultPersonas.js +18 -0
- package/dist/constants/limits.d.ts +10 -0
- package/dist/constants/limits.d.ts.map +1 -0
- package/dist/constants/limits.js +13 -0
- package/dist/elements/BaseElement.d.ts +81 -0
- package/dist/elements/BaseElement.d.ts.map +1 -0
- package/dist/elements/BaseElement.js +381 -0
- package/dist/elements/FeedbackProcessor.d.ts +57 -0
- package/dist/elements/FeedbackProcessor.d.ts.map +1 -0
- package/dist/elements/FeedbackProcessor.js +418 -0
- package/dist/elements/agents/Agent.d.ts +145 -0
- package/dist/elements/agents/Agent.d.ts.map +1 -0
- package/dist/elements/agents/Agent.js +848 -0
- package/dist/elements/agents/AgentManager.d.ts +125 -0
- package/dist/elements/agents/AgentManager.d.ts.map +1 -0
- package/dist/elements/agents/AgentManager.js +615 -0
- package/dist/elements/agents/constants.d.ts +42 -0
- package/dist/elements/agents/constants.d.ts.map +1 -0
- package/dist/elements/agents/constants.js +45 -0
- package/dist/elements/agents/goalTemplates.d.ts +44 -0
- package/dist/elements/agents/goalTemplates.d.ts.map +1 -0
- package/dist/elements/agents/goalTemplates.js +297 -0
- package/dist/elements/agents/index.d.ts +8 -0
- package/dist/elements/agents/index.d.ts.map +1 -0
- package/dist/elements/agents/index.js +8 -0
- package/dist/elements/agents/ruleEngineConfig.d.ts +76 -0
- package/dist/elements/agents/ruleEngineConfig.d.ts.map +1 -0
- package/dist/elements/agents/ruleEngineConfig.js +143 -0
- package/dist/elements/agents/types.d.ts +97 -0
- package/dist/elements/agents/types.d.ts.map +1 -0
- package/dist/elements/agents/types.js +5 -0
- package/dist/elements/ensembles/Ensemble.d.ts +144 -0
- package/dist/elements/ensembles/Ensemble.d.ts.map +1 -0
- package/dist/elements/ensembles/Ensemble.js +860 -0
- package/dist/elements/ensembles/EnsembleManager.d.ts +85 -0
- package/dist/elements/ensembles/EnsembleManager.d.ts.map +1 -0
- package/dist/elements/ensembles/EnsembleManager.js +378 -0
- package/dist/elements/ensembles/constants.d.ts +73 -0
- package/dist/elements/ensembles/constants.d.ts.map +1 -0
- package/dist/elements/ensembles/constants.js +92 -0
- package/dist/elements/ensembles/index.d.ts +8 -0
- package/dist/elements/ensembles/index.d.ts.map +1 -0
- package/dist/elements/ensembles/index.js +8 -0
- package/dist/elements/ensembles/types.d.ts +92 -0
- package/dist/elements/ensembles/types.d.ts.map +1 -0
- package/dist/elements/ensembles/types.js +8 -0
- package/dist/elements/index.d.ts +11 -0
- package/dist/elements/index.d.ts.map +1 -0
- package/dist/elements/index.js +12 -0
- package/dist/elements/memories/Memory.d.ts +110 -0
- package/dist/elements/memories/Memory.d.ts.map +1 -0
- package/dist/elements/memories/Memory.js +470 -0
- package/dist/elements/memories/MemoryManager.d.ts +86 -0
- package/dist/elements/memories/MemoryManager.d.ts.map +1 -0
- package/dist/elements/memories/MemoryManager.js +435 -0
- package/dist/elements/memories/constants.d.ts +42 -0
- package/dist/elements/memories/constants.d.ts.map +1 -0
- package/dist/elements/memories/constants.js +49 -0
- package/dist/elements/memories/index.d.ts +6 -0
- package/dist/elements/memories/index.d.ts.map +1 -0
- package/dist/elements/memories/index.js +6 -0
- package/dist/elements/skills/Skill.d.ts +109 -0
- package/dist/elements/skills/Skill.d.ts.map +1 -0
- package/dist/elements/skills/Skill.js +381 -0
- package/dist/elements/skills/index.d.ts +5 -0
- package/dist/elements/skills/index.d.ts.map +1 -0
- package/dist/elements/skills/index.js +5 -0
- package/dist/elements/templates/Template.d.ts +138 -0
- package/dist/elements/templates/Template.d.ts.map +1 -0
- package/dist/elements/templates/Template.js +673 -0
- package/dist/elements/templates/TemplateManager.d.ts +104 -0
- package/dist/elements/templates/TemplateManager.d.ts.map +1 -0
- package/dist/elements/templates/TemplateManager.js +501 -0
- package/dist/elements/templates/index.d.ts +6 -0
- package/dist/elements/templates/index.d.ts.map +1 -0
- package/dist/elements/templates/index.js +6 -0
- package/dist/errors/SecurityError.d.ts +29 -0
- package/dist/errors/SecurityError.d.ts.map +1 -0
- package/dist/errors/SecurityError.js +47 -0
- package/dist/errors/index.d.ts +2 -0
- package/dist/errors/index.d.ts.map +1 -0
- package/dist/errors/index.js +2 -0
- package/dist/index.barrel.d.ts +21 -0
- package/dist/index.barrel.d.ts.map +1 -0
- package/dist/index.barrel.js +31 -0
- package/dist/index.d.ts +223 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +1606 -0
- package/dist/marketplace/GitHubClient.d.ts +22 -0
- package/dist/marketplace/GitHubClient.d.ts.map +1 -0
- package/dist/marketplace/GitHubClient.js +112 -0
- package/dist/marketplace/MarketplaceBrowser.d.ts +24 -0
- package/dist/marketplace/MarketplaceBrowser.d.ts.map +1 -0
- package/dist/marketplace/MarketplaceBrowser.js +115 -0
- package/dist/marketplace/MarketplaceSearch.d.ts +18 -0
- package/dist/marketplace/MarketplaceSearch.d.ts.map +1 -0
- package/dist/marketplace/MarketplaceSearch.js +48 -0
- package/dist/marketplace/PersonaDetails.d.ts +22 -0
- package/dist/marketplace/PersonaDetails.d.ts.map +1 -0
- package/dist/marketplace/PersonaDetails.js +71 -0
- package/dist/marketplace/PersonaInstaller.d.ts +25 -0
- package/dist/marketplace/PersonaInstaller.d.ts.map +1 -0
- package/dist/marketplace/PersonaInstaller.js +100 -0
- package/dist/marketplace/PersonaSubmitter.d.ts +19 -0
- package/dist/marketplace/PersonaSubmitter.d.ts.map +1 -0
- package/dist/marketplace/PersonaSubmitter.js +57 -0
- package/dist/marketplace/index.d.ts +10 -0
- package/dist/marketplace/index.d.ts.map +1 -0
- package/dist/marketplace/index.js +10 -0
- package/dist/persona/PersonaElement.d.ts +64 -0
- package/dist/persona/PersonaElement.d.ts.map +1 -0
- package/dist/persona/PersonaElement.js +223 -0
- package/dist/persona/PersonaElementManager.d.ts +97 -0
- package/dist/persona/PersonaElementManager.d.ts.map +1 -0
- package/dist/persona/PersonaElementManager.js +348 -0
- package/dist/persona/PersonaLoader.d.ts +34 -0
- package/dist/persona/PersonaLoader.d.ts.map +1 -0
- package/dist/persona/PersonaLoader.js +145 -0
- package/dist/persona/PersonaManager.d.ts +112 -0
- package/dist/persona/PersonaManager.d.ts.map +1 -0
- package/dist/persona/PersonaManager.js +341 -0
- package/dist/persona/PersonaValidator.d.ts +39 -0
- package/dist/persona/PersonaValidator.d.ts.map +1 -0
- package/dist/persona/PersonaValidator.js +161 -0
- package/dist/persona/export-import/PersonaExporter.d.ts +43 -0
- package/dist/persona/export-import/PersonaExporter.d.ts.map +1 -0
- package/dist/persona/export-import/PersonaExporter.js +99 -0
- package/dist/persona/export-import/PersonaImporter.d.ts +65 -0
- package/dist/persona/export-import/PersonaImporter.d.ts.map +1 -0
- package/dist/persona/export-import/PersonaImporter.js +315 -0
- package/dist/persona/export-import/PersonaSharer.d.ts +60 -0
- package/dist/persona/export-import/PersonaSharer.d.ts.map +1 -0
- package/dist/persona/export-import/PersonaSharer.js +502 -0
- package/dist/persona/export-import/index.d.ts +10 -0
- package/dist/persona/export-import/index.d.ts.map +1 -0
- package/dist/persona/export-import/index.js +7 -0
- package/dist/persona/index.d.ts +7 -0
- package/dist/persona/index.d.ts.map +1 -0
- package/dist/persona/index.js +7 -0
- package/dist/portfolio/MigrationManager.d.ts +44 -0
- package/dist/portfolio/MigrationManager.d.ts.map +1 -0
- package/dist/portfolio/MigrationManager.js +163 -0
- package/dist/portfolio/PortfolioManager.d.ts +54 -0
- package/dist/portfolio/PortfolioManager.d.ts.map +1 -0
- package/dist/portfolio/PortfolioManager.js +224 -0
- package/dist/portfolio/types.d.ts +18 -0
- package/dist/portfolio/types.d.ts.map +1 -0
- package/dist/portfolio/types.js +13 -0
- package/dist/security/InputValidator.d.ts +80 -0
- package/dist/security/InputValidator.d.ts.map +1 -0
- package/dist/security/InputValidator.js +448 -0
- package/dist/security/audit/SecurityAuditor.d.ts +44 -0
- package/dist/security/audit/SecurityAuditor.d.ts.map +1 -0
- package/dist/security/audit/SecurityAuditor.js +274 -0
- package/dist/security/audit/config/suppressions.d.ts +34 -0
- package/dist/security/audit/config/suppressions.d.ts.map +1 -0
- package/dist/security/audit/config/suppressions.js +575 -0
- package/dist/security/audit/index.d.ts +14 -0
- package/dist/security/audit/index.d.ts.map +1 -0
- package/dist/security/audit/index.js +15 -0
- package/dist/security/audit/reporters/ConsoleReporter.d.ts +46 -0
- package/dist/security/audit/reporters/ConsoleReporter.d.ts.map +1 -0
- package/dist/security/audit/reporters/ConsoleReporter.js +174 -0
- package/dist/security/audit/reporters/JsonReporter.d.ts +13 -0
- package/dist/security/audit/reporters/JsonReporter.d.ts.map +1 -0
- package/dist/security/audit/reporters/JsonReporter.js +25 -0
- package/dist/security/audit/reporters/MarkdownReporter.d.ts +13 -0
- package/dist/security/audit/reporters/MarkdownReporter.d.ts.map +1 -0
- package/dist/security/audit/reporters/MarkdownReporter.js +79 -0
- package/dist/security/audit/rules/SecurityRules.d.ts +20 -0
- package/dist/security/audit/rules/SecurityRules.d.ts.map +1 -0
- package/dist/security/audit/rules/SecurityRules.js +244 -0
- package/dist/security/audit/scanners/CodeScanner.d.ts +47 -0
- package/dist/security/audit/scanners/CodeScanner.d.ts.map +1 -0
- package/dist/security/audit/scanners/CodeScanner.js +174 -0
- package/dist/security/audit/scanners/ConfigurationScanner.d.ts +13 -0
- package/dist/security/audit/scanners/ConfigurationScanner.d.ts.map +1 -0
- package/dist/security/audit/scanners/ConfigurationScanner.js +22 -0
- package/dist/security/audit/scanners/DependencyScanner.d.ts +13 -0
- package/dist/security/audit/scanners/DependencyScanner.d.ts.map +1 -0
- package/dist/security/audit/scanners/DependencyScanner.js +22 -0
- package/dist/security/audit/types.d.ts +94 -0
- package/dist/security/audit/types.d.ts.map +1 -0
- package/dist/security/audit/types.js +6 -0
- package/dist/security/commandValidator.d.ts +7 -0
- package/dist/security/commandValidator.d.ts.map +1 -0
- package/dist/security/commandValidator.js +78 -0
- package/dist/security/constants.d.ts +24 -0
- package/dist/security/constants.d.ts.map +1 -0
- package/dist/security/constants.js +26 -0
- package/dist/security/contentValidator.d.ts +47 -0
- package/dist/security/contentValidator.d.ts.map +1 -0
- package/dist/security/contentValidator.js +301 -0
- package/dist/security/errorHandler.d.ts +42 -0
- package/dist/security/errorHandler.d.ts.map +1 -0
- package/dist/security/errorHandler.js +166 -0
- package/dist/security/errors.d.ts +14 -0
- package/dist/security/errors.d.ts.map +1 -0
- package/dist/security/errors.js +28 -0
- package/dist/security/fileLockManager.d.ts +70 -0
- package/dist/security/fileLockManager.d.ts.map +1 -0
- package/dist/security/fileLockManager.js +187 -0
- package/dist/security/index.d.ts +12 -0
- package/dist/security/index.d.ts.map +1 -0
- package/dist/security/index.js +14 -0
- package/dist/security/pathValidator.d.ts +9 -0
- package/dist/security/pathValidator.d.ts.map +1 -0
- package/dist/security/pathValidator.js +102 -0
- package/dist/security/regexValidator.d.ts +59 -0
- package/dist/security/regexValidator.d.ts.map +1 -0
- package/dist/security/regexValidator.js +214 -0
- package/dist/security/secureYamlParser.d.ts +46 -0
- package/dist/security/secureYamlParser.d.ts.map +1 -0
- package/dist/security/secureYamlParser.js +203 -0
- package/dist/security/securityMonitor.d.ts +58 -0
- package/dist/security/securityMonitor.d.ts.map +1 -0
- package/dist/security/securityMonitor.js +108 -0
- package/dist/security/tokenManager.d.ts +85 -0
- package/dist/security/tokenManager.d.ts.map +1 -0
- package/dist/security/tokenManager.js +286 -0
- package/dist/security/validators/unicodeValidator.d.ts +97 -0
- package/dist/security/validators/unicodeValidator.d.ts.map +1 -0
- package/dist/security/validators/unicodeValidator.js +312 -0
- package/dist/security/yamlValidator.d.ts +21 -0
- package/dist/security/yamlValidator.d.ts.map +1 -0
- package/dist/security/yamlValidator.js +164 -0
- package/dist/server/ServerSetup.d.ts +35 -0
- package/dist/server/ServerSetup.d.ts.map +1 -0
- package/dist/server/ServerSetup.js +116 -0
- package/dist/server/index.d.ts +7 -0
- package/dist/server/index.d.ts.map +1 -0
- package/dist/server/index.js +7 -0
- package/dist/server/startup.d.ts +31 -0
- package/dist/server/startup.d.ts.map +1 -0
- package/dist/server/startup.js +67 -0
- package/dist/server/tools/CollectionTools.d.ts +10 -0
- package/dist/server/tools/CollectionTools.d.ts.map +1 -0
- package/dist/server/tools/CollectionTools.js +96 -0
- package/dist/server/tools/ConfigTools.d.ts +10 -0
- package/dist/server/tools/ConfigTools.d.ts.map +1 -0
- package/dist/server/tools/ConfigTools.js +63 -0
- package/dist/server/tools/MarketplaceTools.d.ts +10 -0
- package/dist/server/tools/MarketplaceTools.d.ts.map +1 -0
- package/dist/server/tools/MarketplaceTools.js +96 -0
- package/dist/server/tools/PersonaTools.d.ts +10 -0
- package/dist/server/tools/PersonaTools.d.ts.map +1 -0
- package/dist/server/tools/PersonaTools.js +257 -0
- package/dist/server/tools/ToolRegistry.d.ts +37 -0
- package/dist/server/tools/ToolRegistry.d.ts.map +1 -0
- package/dist/server/tools/ToolRegistry.js +40 -0
- package/dist/server/tools/UpdateTools.d.ts +10 -0
- package/dist/server/tools/UpdateTools.d.ts.map +1 -0
- package/dist/server/tools/UpdateTools.js +64 -0
- package/dist/server/tools/UserTools.d.ts +10 -0
- package/dist/server/tools/UserTools.d.ts.map +1 -0
- package/dist/server/tools/UserTools.js +51 -0
- package/dist/server/tools/index.d.ts +10 -0
- package/dist/server/tools/index.d.ts.map +1 -0
- package/dist/server/tools/index.js +10 -0
- package/dist/server/types.d.ts +34 -0
- package/dist/server/types.d.ts.map +1 -0
- package/dist/server/types.js +5 -0
- package/dist/src/cache/APICache.d.ts +23 -0
- package/dist/src/cache/APICache.d.ts.map +1 -0
- package/dist/src/cache/APICache.js +42 -0
- package/dist/src/cache/index.d.ts +5 -0
- package/dist/src/cache/index.d.ts.map +1 -0
- package/dist/src/cache/index.js +5 -0
- package/dist/src/config/constants.d.ts +25 -0
- package/dist/src/config/constants.d.ts.map +1 -0
- package/dist/src/config/constants.js +30 -0
- package/dist/src/config/index.d.ts +6 -0
- package/dist/src/config/index.d.ts.map +1 -0
- package/dist/src/config/index.js +6 -0
- package/dist/src/config/indicator-config.d.ts +107 -0
- package/dist/src/config/indicator-config.d.ts.map +1 -0
- package/dist/src/config/indicator-config.js +158 -0
- package/dist/src/constants/defaultPersonas.d.ts +10 -0
- package/dist/src/constants/defaultPersonas.d.ts.map +1 -0
- package/dist/src/constants/defaultPersonas.js +18 -0
- package/dist/src/constants/limits.d.ts +10 -0
- package/dist/src/constants/limits.d.ts.map +1 -0
- package/dist/src/constants/limits.js +13 -0
- package/dist/src/errors/SecurityError.d.ts +29 -0
- package/dist/src/errors/SecurityError.d.ts.map +1 -0
- package/dist/src/errors/SecurityError.js +47 -0
- package/dist/src/errors/index.d.ts +2 -0
- package/dist/src/errors/index.d.ts.map +1 -0
- package/dist/src/errors/index.js +2 -0
- package/dist/src/index.barrel.d.ts +21 -0
- package/dist/src/index.barrel.d.ts.map +1 -0
- package/dist/src/index.barrel.js +31 -0
- package/dist/src/index.d.ts +220 -0
- package/dist/src/index.d.ts.map +1 -0
- package/dist/src/index.js +1559 -0
- package/dist/src/marketplace/GitHubClient.d.ts +22 -0
- package/dist/src/marketplace/GitHubClient.d.ts.map +1 -0
- package/dist/src/marketplace/GitHubClient.js +112 -0
- package/dist/src/marketplace/MarketplaceBrowser.d.ts +21 -0
- package/dist/src/marketplace/MarketplaceBrowser.d.ts.map +1 -0
- package/dist/src/marketplace/MarketplaceBrowser.js +45 -0
- package/dist/src/marketplace/MarketplaceSearch.d.ts +18 -0
- package/dist/src/marketplace/MarketplaceSearch.d.ts.map +1 -0
- package/dist/src/marketplace/MarketplaceSearch.js +36 -0
- package/dist/src/marketplace/PersonaDetails.d.ts +22 -0
- package/dist/src/marketplace/PersonaDetails.d.ts.map +1 -0
- package/dist/src/marketplace/PersonaDetails.js +71 -0
- package/dist/src/marketplace/PersonaInstaller.d.ts +25 -0
- package/dist/src/marketplace/PersonaInstaller.d.ts.map +1 -0
- package/dist/src/marketplace/PersonaInstaller.js +100 -0
- package/dist/src/marketplace/PersonaSubmitter.d.ts +19 -0
- package/dist/src/marketplace/PersonaSubmitter.d.ts.map +1 -0
- package/dist/src/marketplace/PersonaSubmitter.js +57 -0
- package/dist/src/marketplace/index.d.ts +10 -0
- package/dist/src/marketplace/index.d.ts.map +1 -0
- package/dist/src/marketplace/index.js +10 -0
- package/dist/src/persona/PersonaLoader.d.ts +33 -0
- package/dist/src/persona/PersonaLoader.d.ts.map +1 -0
- package/dist/src/persona/PersonaLoader.js +139 -0
- package/dist/src/persona/PersonaManager.d.ts +112 -0
- package/dist/src/persona/PersonaManager.d.ts.map +1 -0
- package/dist/src/persona/PersonaManager.js +341 -0
- package/dist/src/persona/PersonaValidator.d.ts +33 -0
- package/dist/src/persona/PersonaValidator.d.ts.map +1 -0
- package/dist/src/persona/PersonaValidator.js +157 -0
- package/dist/src/persona/export-import/PersonaExporter.d.ts +43 -0
- package/dist/src/persona/export-import/PersonaExporter.d.ts.map +1 -0
- package/dist/src/persona/export-import/PersonaExporter.js +99 -0
- package/dist/src/persona/export-import/PersonaImporter.d.ts +65 -0
- package/dist/src/persona/export-import/PersonaImporter.d.ts.map +1 -0
- package/dist/src/persona/export-import/PersonaImporter.js +313 -0
- package/dist/src/persona/export-import/PersonaSharer.d.ts +60 -0
- package/dist/src/persona/export-import/PersonaSharer.d.ts.map +1 -0
- package/dist/src/persona/export-import/PersonaSharer.js +363 -0
- package/dist/src/persona/export-import/index.d.ts +10 -0
- package/dist/src/persona/export-import/index.d.ts.map +1 -0
- package/dist/src/persona/export-import/index.js +7 -0
- package/dist/src/persona/index.d.ts +7 -0
- package/dist/src/persona/index.d.ts.map +1 -0
- package/dist/src/persona/index.js +7 -0
- package/dist/src/security/InputValidator.d.ts +69 -0
- package/dist/src/security/InputValidator.d.ts.map +1 -0
- package/dist/src/security/InputValidator.js +381 -0
- package/dist/src/security/commandValidator.d.ts +7 -0
- package/dist/src/security/commandValidator.d.ts.map +1 -0
- package/dist/src/security/commandValidator.js +77 -0
- package/dist/src/security/constants.d.ts +21 -0
- package/dist/src/security/constants.d.ts.map +1 -0
- package/dist/src/security/constants.js +23 -0
- package/dist/src/security/contentValidator.d.ts +47 -0
- package/dist/src/security/contentValidator.d.ts.map +1 -0
- package/dist/src/security/contentValidator.js +188 -0
- package/dist/src/security/fileLockManager.d.ts +70 -0
- package/dist/src/security/fileLockManager.d.ts.map +1 -0
- package/dist/src/security/fileLockManager.js +187 -0
- package/dist/src/security/index.d.ts +12 -0
- package/dist/src/security/index.d.ts.map +1 -0
- package/dist/src/security/index.js +14 -0
- package/dist/src/security/pathValidator.d.ts +9 -0
- package/dist/src/security/pathValidator.d.ts.map +1 -0
- package/dist/src/security/pathValidator.js +97 -0
- package/dist/src/security/secureYamlParser.d.ts +46 -0
- package/dist/src/security/secureYamlParser.d.ts.map +1 -0
- package/dist/src/security/secureYamlParser.js +203 -0
- package/dist/src/security/securityMonitor.d.ts +58 -0
- package/dist/src/security/securityMonitor.d.ts.map +1 -0
- package/dist/src/security/securityMonitor.js +108 -0
- package/dist/src/security/tokenManager.d.ts +59 -0
- package/dist/src/security/tokenManager.d.ts.map +1 -0
- package/dist/src/security/tokenManager.js +216 -0
- package/dist/src/security/yamlValidator.d.ts +20 -0
- package/dist/src/security/yamlValidator.d.ts.map +1 -0
- package/dist/src/security/yamlValidator.js +138 -0
- package/dist/src/server/ServerSetup.d.ts +31 -0
- package/dist/src/server/ServerSetup.d.ts.map +1 -0
- package/dist/src/server/ServerSetup.js +79 -0
- package/dist/src/server/index.d.ts +7 -0
- package/dist/src/server/index.d.ts.map +1 -0
- package/dist/src/server/index.js +7 -0
- package/dist/src/server/tools/ConfigTools.d.ts +10 -0
- package/dist/src/server/tools/ConfigTools.d.ts.map +1 -0
- package/dist/src/server/tools/ConfigTools.js +63 -0
- package/dist/src/server/tools/MarketplaceTools.d.ts +10 -0
- package/dist/src/server/tools/MarketplaceTools.d.ts.map +1 -0
- package/dist/src/server/tools/MarketplaceTools.js +92 -0
- package/dist/src/server/tools/PersonaTools.d.ts +10 -0
- package/dist/src/server/tools/PersonaTools.d.ts.map +1 -0
- package/dist/src/server/tools/PersonaTools.js +257 -0
- package/dist/src/server/tools/ToolRegistry.d.ts +37 -0
- package/dist/src/server/tools/ToolRegistry.d.ts.map +1 -0
- package/dist/src/server/tools/ToolRegistry.js +40 -0
- package/dist/src/server/tools/UpdateTools.d.ts +10 -0
- package/dist/src/server/tools/UpdateTools.d.ts.map +1 -0
- package/dist/src/server/tools/UpdateTools.js +64 -0
- package/dist/src/server/tools/UserTools.d.ts +10 -0
- package/dist/src/server/tools/UserTools.d.ts.map +1 -0
- package/dist/src/server/tools/UserTools.js +51 -0
- package/dist/src/server/tools/index.d.ts +10 -0
- package/dist/src/server/tools/index.d.ts.map +1 -0
- package/dist/src/server/tools/index.js +10 -0
- package/dist/src/server/types.d.ts +34 -0
- package/dist/src/server/types.d.ts.map +1 -0
- package/dist/src/server/types.js +5 -0
- package/dist/src/tools/debug.d.ts +20 -0
- package/dist/src/tools/debug.d.ts.map +1 -0
- package/dist/src/tools/debug.js +37 -0
- package/dist/src/types/cache.d.ts +8 -0
- package/dist/src/types/cache.d.ts.map +1 -0
- package/dist/src/types/cache.js +5 -0
- package/dist/src/types/index.d.ts +8 -0
- package/dist/src/types/index.d.ts.map +1 -0
- package/dist/src/types/index.js +8 -0
- package/dist/src/types/marketplace.d.ts +23 -0
- package/dist/src/types/marketplace.d.ts.map +1 -0
- package/dist/src/types/marketplace.js +5 -0
- package/dist/src/types/mcp.d.ts +161 -0
- package/dist/src/types/mcp.d.ts.map +1 -0
- package/dist/src/types/mcp.js +75 -0
- package/dist/src/types/persona.d.ts +30 -0
- package/dist/src/types/persona.d.ts.map +1 -0
- package/dist/src/types/persona.js +5 -0
- package/dist/src/update/BackupManager.d.ts +46 -0
- package/dist/src/update/BackupManager.d.ts.map +1 -0
- package/dist/src/update/BackupManager.js +261 -0
- package/dist/src/update/DependencyChecker.d.ts +41 -0
- package/dist/src/update/DependencyChecker.d.ts.map +1 -0
- package/dist/src/update/DependencyChecker.js +132 -0
- package/dist/src/update/RateLimiter.d.ts +80 -0
- package/dist/src/update/RateLimiter.d.ts.map +1 -0
- package/dist/src/update/RateLimiter.js +172 -0
- package/dist/src/update/SignatureVerifier.d.ts +71 -0
- package/dist/src/update/SignatureVerifier.d.ts.map +1 -0
- package/dist/src/update/SignatureVerifier.js +214 -0
- package/dist/src/update/UpdateChecker.d.ts +127 -0
- package/dist/src/update/UpdateChecker.d.ts.map +1 -0
- package/dist/src/update/UpdateChecker.js +460 -0
- package/dist/src/update/UpdateManager.d.ts +41 -0
- package/dist/src/update/UpdateManager.d.ts.map +1 -0
- package/dist/src/update/UpdateManager.js +260 -0
- package/dist/src/update/VersionManager.d.ts +31 -0
- package/dist/src/update/VersionManager.d.ts.map +1 -0
- package/dist/src/update/VersionManager.js +134 -0
- package/dist/src/update/index.d.ts +9 -0
- package/dist/src/update/index.d.ts.map +1 -0
- package/dist/src/update/index.js +9 -0
- package/dist/src/utils/filesystem.d.ts +32 -0
- package/dist/src/utils/filesystem.d.ts.map +1 -0
- package/dist/src/utils/filesystem.js +73 -0
- package/dist/src/utils/git.d.ts +32 -0
- package/dist/src/utils/git.d.ts.map +1 -0
- package/dist/src/utils/git.js +65 -0
- package/dist/src/utils/index.d.ts +7 -0
- package/dist/src/utils/index.d.ts.map +1 -0
- package/dist/src/utils/index.js +7 -0
- package/dist/src/utils/logger.d.ts +45 -0
- package/dist/src/utils/logger.d.ts.map +1 -0
- package/dist/src/utils/logger.js +91 -0
- package/dist/src/utils/version.d.ts +25 -0
- package/dist/src/utils/version.d.ts.map +1 -0
- package/dist/src/utils/version.js +97 -0
- package/dist/test/src/cache/APICache.d.ts +23 -0
- package/dist/test/src/cache/APICache.d.ts.map +1 -0
- package/dist/test/src/cache/APICache.js +42 -0
- package/dist/test/src/cache/index.d.ts +5 -0
- package/dist/test/src/cache/index.d.ts.map +1 -0
- package/dist/test/src/cache/index.js +5 -0
- package/dist/test/src/collection/CollectionBrowser.d.ts +24 -0
- package/dist/test/src/collection/CollectionBrowser.d.ts.map +1 -0
- package/dist/test/src/collection/CollectionBrowser.js +115 -0
- package/dist/test/src/collection/CollectionSearch.d.ts +18 -0
- package/dist/test/src/collection/CollectionSearch.d.ts.map +1 -0
- package/dist/test/src/collection/CollectionSearch.js +48 -0
- package/dist/test/src/collection/GitHubClient.d.ts +22 -0
- package/dist/test/src/collection/GitHubClient.d.ts.map +1 -0
- package/dist/test/src/collection/GitHubClient.js +114 -0
- package/dist/test/src/collection/PersonaDetails.d.ts +22 -0
- package/dist/test/src/collection/PersonaDetails.d.ts.map +1 -0
- package/dist/test/src/collection/PersonaDetails.js +71 -0
- package/dist/test/src/collection/PersonaInstaller.d.ts +26 -0
- package/dist/test/src/collection/PersonaInstaller.d.ts.map +1 -0
- package/dist/test/src/collection/PersonaInstaller.js +103 -0
- package/dist/test/src/collection/PersonaSubmitter.d.ts +19 -0
- package/dist/test/src/collection/PersonaSubmitter.d.ts.map +1 -0
- package/dist/test/src/collection/PersonaSubmitter.js +57 -0
- package/dist/test/src/collection/index.d.ts +10 -0
- package/dist/test/src/collection/index.d.ts.map +1 -0
- package/dist/test/src/collection/index.js +10 -0
- package/dist/test/src/config/constants.d.ts +25 -0
- package/dist/test/src/config/constants.d.ts.map +1 -0
- package/dist/test/src/config/constants.js +30 -0
- package/dist/test/src/config/index.d.ts +6 -0
- package/dist/test/src/config/index.d.ts.map +1 -0
- package/dist/test/src/config/index.js +6 -0
- package/dist/test/src/config/indicator-config.d.ts +107 -0
- package/dist/test/src/config/indicator-config.d.ts.map +1 -0
- package/dist/test/src/config/indicator-config.js +158 -0
- package/dist/test/src/constants/defaultPersonas.d.ts +10 -0
- package/dist/test/src/constants/defaultPersonas.d.ts.map +1 -0
- package/dist/test/src/constants/defaultPersonas.js +18 -0
- package/dist/test/src/constants/limits.d.ts +10 -0
- package/dist/test/src/constants/limits.d.ts.map +1 -0
- package/dist/test/src/constants/limits.js +13 -0
- package/dist/test/src/elements/BaseElement.d.ts +81 -0
- package/dist/test/src/elements/BaseElement.d.ts.map +1 -0
- package/dist/test/src/elements/BaseElement.js +381 -0
- package/dist/test/src/elements/FeedbackProcessor.d.ts +57 -0
- package/dist/test/src/elements/FeedbackProcessor.d.ts.map +1 -0
- package/dist/test/src/elements/FeedbackProcessor.js +418 -0
- package/dist/test/src/elements/agents/Agent.d.ts +145 -0
- package/dist/test/src/elements/agents/Agent.d.ts.map +1 -0
- package/dist/test/src/elements/agents/Agent.js +848 -0
- package/dist/test/src/elements/agents/AgentManager.d.ts +125 -0
- package/dist/test/src/elements/agents/AgentManager.d.ts.map +1 -0
- package/dist/test/src/elements/agents/AgentManager.js +608 -0
- package/dist/test/src/elements/agents/constants.d.ts +42 -0
- package/dist/test/src/elements/agents/constants.d.ts.map +1 -0
- package/dist/test/src/elements/agents/constants.js +45 -0
- package/dist/test/src/elements/agents/goalTemplates.d.ts +44 -0
- package/dist/test/src/elements/agents/goalTemplates.d.ts.map +1 -0
- package/dist/test/src/elements/agents/goalTemplates.js +297 -0
- package/dist/test/src/elements/agents/index.d.ts +8 -0
- package/dist/test/src/elements/agents/index.d.ts.map +1 -0
- package/dist/test/src/elements/agents/index.js +8 -0
- package/dist/test/src/elements/agents/ruleEngineConfig.d.ts +76 -0
- package/dist/test/src/elements/agents/ruleEngineConfig.d.ts.map +1 -0
- package/dist/test/src/elements/agents/ruleEngineConfig.js +143 -0
- package/dist/test/src/elements/agents/types.d.ts +97 -0
- package/dist/test/src/elements/agents/types.d.ts.map +1 -0
- package/dist/test/src/elements/agents/types.js +5 -0
- package/dist/test/src/elements/index.d.ts +6 -0
- package/dist/test/src/elements/index.d.ts.map +1 -0
- package/dist/test/src/elements/index.js +6 -0
- package/dist/test/src/elements/memories/Memory.d.ts +110 -0
- package/dist/test/src/elements/memories/Memory.d.ts.map +1 -0
- package/dist/test/src/elements/memories/Memory.js +470 -0
- package/dist/test/src/elements/memories/MemoryManager.d.ts +86 -0
- package/dist/test/src/elements/memories/MemoryManager.d.ts.map +1 -0
- package/dist/test/src/elements/memories/MemoryManager.js +435 -0
- package/dist/test/src/elements/memories/constants.d.ts +42 -0
- package/dist/test/src/elements/memories/constants.d.ts.map +1 -0
- package/dist/test/src/elements/memories/constants.js +49 -0
- package/dist/test/src/elements/memories/index.d.ts +6 -0
- package/dist/test/src/elements/memories/index.d.ts.map +1 -0
- package/dist/test/src/elements/memories/index.js +6 -0
- package/dist/test/src/elements/skills/Skill.d.ts +109 -0
- package/dist/test/src/elements/skills/Skill.d.ts.map +1 -0
- package/dist/test/src/elements/skills/Skill.js +381 -0
- package/dist/test/src/elements/templates/Template.d.ts +138 -0
- package/dist/test/src/elements/templates/Template.d.ts.map +1 -0
- package/dist/test/src/elements/templates/Template.js +673 -0
- package/dist/test/src/elements/templates/TemplateManager.d.ts +104 -0
- package/dist/test/src/elements/templates/TemplateManager.d.ts.map +1 -0
- package/dist/test/src/elements/templates/TemplateManager.js +496 -0
- package/dist/test/src/elements/templates/index.d.ts +6 -0
- package/dist/test/src/elements/templates/index.d.ts.map +1 -0
- package/dist/test/src/elements/templates/index.js +6 -0
- package/dist/test/src/errors/SecurityError.d.ts +29 -0
- package/dist/test/src/errors/SecurityError.d.ts.map +1 -0
- package/dist/test/src/errors/SecurityError.js +47 -0
- package/dist/test/src/errors/index.d.ts +2 -0
- package/dist/test/src/errors/index.d.ts.map +1 -0
- package/dist/test/src/errors/index.js +2 -0
- package/dist/test/src/index.barrel.d.ts +21 -0
- package/dist/test/src/index.barrel.d.ts.map +1 -0
- package/dist/test/src/index.barrel.js +31 -0
- package/dist/test/src/index.d.ts +223 -0
- package/dist/test/src/index.d.ts.map +1 -0
- package/dist/test/src/index.js +1594 -0
- package/dist/test/src/marketplace/GitHubClient.d.ts +22 -0
- package/dist/test/src/marketplace/GitHubClient.d.ts.map +1 -0
- package/dist/test/src/marketplace/GitHubClient.js +112 -0
- package/dist/test/src/marketplace/MarketplaceBrowser.d.ts +21 -0
- package/dist/test/src/marketplace/MarketplaceBrowser.d.ts.map +1 -0
- package/dist/test/src/marketplace/MarketplaceBrowser.js +45 -0
- package/dist/test/src/marketplace/MarketplaceSearch.d.ts +18 -0
- package/dist/test/src/marketplace/MarketplaceSearch.d.ts.map +1 -0
- package/dist/test/src/marketplace/MarketplaceSearch.js +36 -0
- package/dist/test/src/marketplace/PersonaDetails.d.ts +22 -0
- package/dist/test/src/marketplace/PersonaDetails.d.ts.map +1 -0
- package/dist/test/src/marketplace/PersonaDetails.js +71 -0
- package/dist/test/src/marketplace/PersonaInstaller.d.ts +25 -0
- package/dist/test/src/marketplace/PersonaInstaller.d.ts.map +1 -0
- package/dist/test/src/marketplace/PersonaInstaller.js +100 -0
- package/dist/test/src/marketplace/PersonaSubmitter.d.ts +19 -0
- package/dist/test/src/marketplace/PersonaSubmitter.d.ts.map +1 -0
- package/dist/test/src/marketplace/PersonaSubmitter.js +57 -0
- package/dist/test/src/marketplace/index.d.ts +10 -0
- package/dist/test/src/marketplace/index.d.ts.map +1 -0
- package/dist/test/src/marketplace/index.js +10 -0
- package/dist/test/src/persona/PersonaElement.d.ts +64 -0
- package/dist/test/src/persona/PersonaElement.d.ts.map +1 -0
- package/dist/test/src/persona/PersonaElement.js +223 -0
- package/dist/test/src/persona/PersonaElementManager.d.ts +97 -0
- package/dist/test/src/persona/PersonaElementManager.d.ts.map +1 -0
- package/dist/test/src/persona/PersonaElementManager.js +342 -0
- package/dist/test/src/persona/PersonaLoader.d.ts +34 -0
- package/dist/test/src/persona/PersonaLoader.d.ts.map +1 -0
- package/dist/test/src/persona/PersonaLoader.js +145 -0
- package/dist/test/src/persona/PersonaManager.d.ts +112 -0
- package/dist/test/src/persona/PersonaManager.d.ts.map +1 -0
- package/dist/test/src/persona/PersonaManager.js +341 -0
- package/dist/test/src/persona/PersonaValidator.d.ts +33 -0
- package/dist/test/src/persona/PersonaValidator.d.ts.map +1 -0
- package/dist/test/src/persona/PersonaValidator.js +157 -0
- package/dist/test/src/persona/export-import/PersonaExporter.d.ts +43 -0
- package/dist/test/src/persona/export-import/PersonaExporter.d.ts.map +1 -0
- package/dist/test/src/persona/export-import/PersonaExporter.js +99 -0
- package/dist/test/src/persona/export-import/PersonaImporter.d.ts +65 -0
- package/dist/test/src/persona/export-import/PersonaImporter.d.ts.map +1 -0
- package/dist/test/src/persona/export-import/PersonaImporter.js +315 -0
- package/dist/test/src/persona/export-import/PersonaSharer.d.ts +60 -0
- package/dist/test/src/persona/export-import/PersonaSharer.d.ts.map +1 -0
- package/dist/test/src/persona/export-import/PersonaSharer.js +502 -0
- package/dist/test/src/persona/export-import/index.d.ts +10 -0
- package/dist/test/src/persona/export-import/index.d.ts.map +1 -0
- package/dist/test/src/persona/export-import/index.js +7 -0
- package/dist/test/src/persona/index.d.ts +7 -0
- package/dist/test/src/persona/index.d.ts.map +1 -0
- package/dist/test/src/persona/index.js +7 -0
- package/dist/test/src/portfolio/MigrationManager.d.ts +44 -0
- package/dist/test/src/portfolio/MigrationManager.d.ts.map +1 -0
- package/dist/test/src/portfolio/MigrationManager.js +163 -0
- package/dist/test/src/portfolio/PortfolioManager.d.ts +54 -0
- package/dist/test/src/portfolio/PortfolioManager.d.ts.map +1 -0
- package/dist/test/src/portfolio/PortfolioManager.js +224 -0
- package/dist/test/src/portfolio/types.d.ts +18 -0
- package/dist/test/src/portfolio/types.d.ts.map +1 -0
- package/dist/test/src/portfolio/types.js +13 -0
- package/dist/test/src/security/InputValidator.d.ts +80 -0
- package/dist/test/src/security/InputValidator.d.ts.map +1 -0
- package/dist/test/src/security/InputValidator.js +436 -0
- package/dist/test/src/security/audit/SecurityAuditor.d.ts +44 -0
- package/dist/test/src/security/audit/SecurityAuditor.d.ts.map +1 -0
- package/dist/test/src/security/audit/SecurityAuditor.js +274 -0
- package/dist/test/src/security/audit/config/suppressions.d.ts +34 -0
- package/dist/test/src/security/audit/config/suppressions.d.ts.map +1 -0
- package/dist/test/src/security/audit/config/suppressions.js +575 -0
- package/dist/test/src/security/audit/index.d.ts +14 -0
- package/dist/test/src/security/audit/index.d.ts.map +1 -0
- package/dist/test/src/security/audit/index.js +15 -0
- package/dist/test/src/security/audit/reporters/ConsoleReporter.d.ts +46 -0
- package/dist/test/src/security/audit/reporters/ConsoleReporter.d.ts.map +1 -0
- package/dist/test/src/security/audit/reporters/ConsoleReporter.js +174 -0
- package/dist/test/src/security/audit/reporters/JsonReporter.d.ts +13 -0
- package/dist/test/src/security/audit/reporters/JsonReporter.d.ts.map +1 -0
- package/dist/test/src/security/audit/reporters/JsonReporter.js +25 -0
- package/dist/test/src/security/audit/reporters/MarkdownReporter.d.ts +13 -0
- package/dist/test/src/security/audit/reporters/MarkdownReporter.d.ts.map +1 -0
- package/dist/test/src/security/audit/reporters/MarkdownReporter.js +79 -0
- package/dist/test/src/security/audit/rules/SecurityRules.d.ts +20 -0
- package/dist/test/src/security/audit/rules/SecurityRules.d.ts.map +1 -0
- package/dist/test/src/security/audit/rules/SecurityRules.js +244 -0
- package/dist/test/src/security/audit/scanners/CodeScanner.d.ts +47 -0
- package/dist/test/src/security/audit/scanners/CodeScanner.d.ts.map +1 -0
- package/dist/test/src/security/audit/scanners/CodeScanner.js +174 -0
- package/dist/test/src/security/audit/scanners/ConfigurationScanner.d.ts +13 -0
- package/dist/test/src/security/audit/scanners/ConfigurationScanner.d.ts.map +1 -0
- package/dist/test/src/security/audit/scanners/ConfigurationScanner.js +22 -0
- package/dist/test/src/security/audit/scanners/DependencyScanner.d.ts +13 -0
- package/dist/test/src/security/audit/scanners/DependencyScanner.d.ts.map +1 -0
- package/dist/test/src/security/audit/scanners/DependencyScanner.js +22 -0
- package/dist/test/src/security/audit/types.d.ts +94 -0
- package/dist/test/src/security/audit/types.d.ts.map +1 -0
- package/dist/test/src/security/audit/types.js +6 -0
- package/dist/test/src/security/commandValidator.d.ts +7 -0
- package/dist/test/src/security/commandValidator.d.ts.map +1 -0
- package/dist/test/src/security/commandValidator.js +78 -0
- package/dist/test/src/security/constants.d.ts +24 -0
- package/dist/test/src/security/constants.d.ts.map +1 -0
- package/dist/test/src/security/constants.js +26 -0
- package/dist/test/src/security/contentValidator.d.ts +47 -0
- package/dist/test/src/security/contentValidator.d.ts.map +1 -0
- package/dist/test/src/security/contentValidator.js +301 -0
- package/dist/test/src/security/errors.d.ts +14 -0
- package/dist/test/src/security/errors.d.ts.map +1 -0
- package/dist/test/src/security/errors.js +28 -0
- package/dist/test/src/security/fileLockManager.d.ts +70 -0
- package/dist/test/src/security/fileLockManager.d.ts.map +1 -0
- package/dist/test/src/security/fileLockManager.js +187 -0
- package/dist/test/src/security/index.d.ts +12 -0
- package/dist/test/src/security/index.d.ts.map +1 -0
- package/dist/test/src/security/index.js +14 -0
- package/dist/test/src/security/pathValidator.d.ts +9 -0
- package/dist/test/src/security/pathValidator.d.ts.map +1 -0
- package/dist/test/src/security/pathValidator.js +98 -0
- package/dist/test/src/security/regexValidator.d.ts +59 -0
- package/dist/test/src/security/regexValidator.d.ts.map +1 -0
- package/dist/test/src/security/regexValidator.js +214 -0
- package/dist/test/src/security/secureYamlParser.d.ts +46 -0
- package/dist/test/src/security/secureYamlParser.d.ts.map +1 -0
- package/dist/test/src/security/secureYamlParser.js +203 -0
- package/dist/test/src/security/securityMonitor.d.ts +58 -0
- package/dist/test/src/security/securityMonitor.d.ts.map +1 -0
- package/dist/test/src/security/securityMonitor.js +108 -0
- package/dist/test/src/security/tokenManager.d.ts +85 -0
- package/dist/test/src/security/tokenManager.d.ts.map +1 -0
- package/dist/test/src/security/tokenManager.js +286 -0
- package/dist/test/src/security/validators/unicodeValidator.d.ts +97 -0
- package/dist/test/src/security/validators/unicodeValidator.d.ts.map +1 -0
- package/dist/test/src/security/validators/unicodeValidator.js +312 -0
- package/dist/test/src/security/yamlValidator.d.ts +21 -0
- package/dist/test/src/security/yamlValidator.d.ts.map +1 -0
- package/dist/test/src/security/yamlValidator.js +164 -0
- package/dist/test/src/server/ServerSetup.d.ts +35 -0
- package/dist/test/src/server/ServerSetup.d.ts.map +1 -0
- package/dist/test/src/server/ServerSetup.js +116 -0
- package/dist/test/src/server/index.d.ts +7 -0
- package/dist/test/src/server/index.d.ts.map +1 -0
- package/dist/test/src/server/index.js +7 -0
- package/dist/test/src/server/startup.d.ts +31 -0
- package/dist/test/src/server/startup.d.ts.map +1 -0
- package/dist/test/src/server/startup.js +67 -0
- package/dist/test/src/server/tools/CollectionTools.d.ts +10 -0
- package/dist/test/src/server/tools/CollectionTools.d.ts.map +1 -0
- package/dist/test/src/server/tools/CollectionTools.js +96 -0
- package/dist/test/src/server/tools/ConfigTools.d.ts +10 -0
- package/dist/test/src/server/tools/ConfigTools.d.ts.map +1 -0
- package/dist/test/src/server/tools/ConfigTools.js +63 -0
- package/dist/test/src/server/tools/MarketplaceTools.d.ts +10 -0
- package/dist/test/src/server/tools/MarketplaceTools.d.ts.map +1 -0
- package/dist/test/src/server/tools/MarketplaceTools.js +92 -0
- package/dist/test/src/server/tools/PersonaTools.d.ts +10 -0
- package/dist/test/src/server/tools/PersonaTools.d.ts.map +1 -0
- package/dist/test/src/server/tools/PersonaTools.js +257 -0
- package/dist/test/src/server/tools/ToolRegistry.d.ts +37 -0
- package/dist/test/src/server/tools/ToolRegistry.d.ts.map +1 -0
- package/dist/test/src/server/tools/ToolRegistry.js +40 -0
- package/dist/test/src/server/tools/UpdateTools.d.ts +10 -0
- package/dist/test/src/server/tools/UpdateTools.d.ts.map +1 -0
- package/dist/test/src/server/tools/UpdateTools.js +64 -0
- package/dist/test/src/server/tools/UserTools.d.ts +10 -0
- package/dist/test/src/server/tools/UserTools.d.ts.map +1 -0
- package/dist/test/src/server/tools/UserTools.js +51 -0
- package/dist/test/src/server/tools/index.d.ts +10 -0
- package/dist/test/src/server/tools/index.d.ts.map +1 -0
- package/dist/test/src/server/tools/index.js +10 -0
- package/dist/test/src/server/types.d.ts +34 -0
- package/dist/test/src/server/types.d.ts.map +1 -0
- package/dist/test/src/server/types.js +5 -0
- package/dist/test/src/tools/debug.d.ts +20 -0
- package/dist/test/src/tools/debug.d.ts.map +1 -0
- package/dist/test/src/tools/debug.js +37 -0
- package/dist/test/src/types/cache.d.ts +8 -0
- package/dist/test/src/types/cache.d.ts.map +1 -0
- package/dist/test/src/types/cache.js +5 -0
- package/dist/test/src/types/collection.d.ts +23 -0
- package/dist/test/src/types/collection.d.ts.map +1 -0
- package/dist/test/src/types/collection.js +5 -0
- package/dist/test/src/types/elements/IElement.d.ts +123 -0
- package/dist/test/src/types/elements/IElement.d.ts.map +1 -0
- package/dist/test/src/types/elements/IElement.js +30 -0
- package/dist/test/src/types/elements/IElementManager.d.ts +65 -0
- package/dist/test/src/types/elements/IElementManager.d.ts.map +1 -0
- package/dist/test/src/types/elements/IElementManager.js +6 -0
- package/dist/test/src/types/elements/IRatingManager.d.ts +109 -0
- package/dist/test/src/types/elements/IRatingManager.d.ts.map +1 -0
- package/dist/test/src/types/elements/IRatingManager.js +6 -0
- package/dist/test/src/types/elements/IReferenceResolver.d.ts +52 -0
- package/dist/test/src/types/elements/IReferenceResolver.d.ts.map +1 -0
- package/dist/test/src/types/elements/IReferenceResolver.js +6 -0
- package/dist/test/src/types/elements/RatingBreakdowns.d.ts +49 -0
- package/dist/test/src/types/elements/RatingBreakdowns.d.ts.map +1 -0
- package/dist/test/src/types/elements/RatingBreakdowns.js +6 -0
- package/dist/test/src/types/elements/index.d.ts +9 -0
- package/dist/test/src/types/elements/index.d.ts.map +1 -0
- package/dist/test/src/types/elements/index.js +11 -0
- package/dist/test/src/types/index.d.ts +9 -0
- package/dist/test/src/types/index.d.ts.map +1 -0
- package/dist/test/src/types/index.js +9 -0
- package/dist/test/src/types/marketplace.d.ts +23 -0
- package/dist/test/src/types/marketplace.d.ts.map +1 -0
- package/dist/test/src/types/marketplace.js +5 -0
- package/dist/test/src/types/mcp.d.ts +84 -0
- package/dist/test/src/types/mcp.d.ts.map +1 -0
- package/dist/test/src/types/mcp.js +80 -0
- package/dist/test/src/types/persona.d.ts +30 -0
- package/dist/test/src/types/persona.d.ts.map +1 -0
- package/dist/test/src/types/persona.js +5 -0
- package/dist/test/src/update/BackupManager.d.ts +46 -0
- package/dist/test/src/update/BackupManager.d.ts.map +1 -0
- package/dist/test/src/update/BackupManager.js +261 -0
- package/dist/test/src/update/DependencyChecker.d.ts +41 -0
- package/dist/test/src/update/DependencyChecker.d.ts.map +1 -0
- package/dist/test/src/update/DependencyChecker.js +132 -0
- package/dist/test/src/update/RateLimiter.d.ts +80 -0
- package/dist/test/src/update/RateLimiter.d.ts.map +1 -0
- package/dist/test/src/update/RateLimiter.js +172 -0
- package/dist/test/src/update/SignatureVerifier.d.ts +71 -0
- package/dist/test/src/update/SignatureVerifier.d.ts.map +1 -0
- package/dist/test/src/update/SignatureVerifier.js +214 -0
- package/dist/test/src/update/UpdateChecker.d.ts +127 -0
- package/dist/test/src/update/UpdateChecker.d.ts.map +1 -0
- package/dist/test/src/update/UpdateChecker.js +469 -0
- package/dist/test/src/update/UpdateManager.d.ts +41 -0
- package/dist/test/src/update/UpdateManager.d.ts.map +1 -0
- package/dist/test/src/update/UpdateManager.js +260 -0
- package/dist/test/src/update/VersionManager.d.ts +31 -0
- package/dist/test/src/update/VersionManager.d.ts.map +1 -0
- package/dist/test/src/update/VersionManager.js +134 -0
- package/dist/test/src/update/index.d.ts +9 -0
- package/dist/test/src/update/index.d.ts.map +1 -0
- package/dist/test/src/update/index.js +9 -0
- package/dist/test/src/utils/filesystem.d.ts +29 -0
- package/dist/test/src/utils/filesystem.d.ts.map +1 -0
- package/dist/test/src/utils/filesystem.js +94 -0
- package/dist/test/src/utils/git.d.ts +32 -0
- package/dist/test/src/utils/git.d.ts.map +1 -0
- package/dist/test/src/utils/git.js +65 -0
- package/dist/test/src/utils/index.d.ts +7 -0
- package/dist/test/src/utils/index.d.ts.map +1 -0
- package/dist/test/src/utils/index.js +7 -0
- package/dist/test/src/utils/logger.d.ts +45 -0
- package/dist/test/src/utils/logger.d.ts.map +1 -0
- package/dist/test/src/utils/logger.js +91 -0
- package/dist/test/src/utils/version.d.ts +25 -0
- package/dist/test/src/utils/version.d.ts.map +1 -0
- package/dist/test/src/utils/version.js +97 -0
- package/dist/test/test/__tests__/integration/helpers/file-utils.d.ts +33 -0
- package/dist/test/test/__tests__/integration/helpers/file-utils.d.ts.map +1 -0
- package/dist/test/test/__tests__/integration/helpers/file-utils.js +83 -0
- package/dist/test/test/__tests__/integration/helpers/test-fixtures.d.ts +26 -0
- package/dist/test/test/__tests__/integration/helpers/test-fixtures.d.ts.map +1 -0
- package/dist/test/test/__tests__/integration/helpers/test-fixtures.js +95 -0
- package/dist/test/test/__tests__/integration/helpers/test-server.d.ts +26 -0
- package/dist/test/test/__tests__/integration/helpers/test-server.d.ts.map +1 -0
- package/dist/test/test/__tests__/integration/helpers/test-server.js +41 -0
- package/dist/test/test/__tests__/integration/setup.d.ts +8 -0
- package/dist/test/test/__tests__/integration/setup.d.ts.map +1 -0
- package/dist/test/test/__tests__/integration/setup.js +31 -0
- package/dist/test/test/__tests__/integration/teardown.d.ts +5 -0
- package/dist/test/test/__tests__/integration/teardown.d.ts.map +1 -0
- package/dist/test/test/__tests__/integration/teardown.js +23 -0
- package/dist/test/test/__tests__/security/framework/RapidSecurityTesting.d.ts +34 -0
- package/dist/test/test/__tests__/security/framework/RapidSecurityTesting.d.ts.map +1 -0
- package/dist/test/test/__tests__/security/framework/RapidSecurityTesting.js +224 -0
- package/dist/test/test/__tests__/security/framework/SecurityTestFramework.d.ts +89 -0
- package/dist/test/test/__tests__/security/framework/SecurityTestFramework.d.ts.map +1 -0
- package/dist/test/test/__tests__/security/framework/SecurityTestFramework.js +543 -0
- package/dist/test/test/__tests__/security/index.d.ts +46 -0
- package/dist/test/test/__tests__/security/index.d.ts.map +1 -0
- package/dist/test/test/__tests__/security/index.js +98 -0
- package/dist/test/test/__tests__/security/setup.d.ts +3 -0
- package/dist/test/test/__tests__/security/setup.d.ts.map +1 -0
- package/dist/test/test/__tests__/security/setup.js +23 -0
- package/dist/tools/debug.d.ts +20 -0
- package/dist/tools/debug.d.ts.map +1 -0
- package/dist/tools/debug.js +37 -0
- package/dist/types/cache.d.ts +8 -0
- package/dist/types/cache.d.ts.map +1 -0
- package/dist/types/cache.js +5 -0
- package/dist/types/collection.d.ts +23 -0
- package/dist/types/collection.d.ts.map +1 -0
- package/dist/types/collection.js +5 -0
- package/dist/types/elements/IElement.d.ts +123 -0
- package/dist/types/elements/IElement.d.ts.map +1 -0
- package/dist/types/elements/IElement.js +30 -0
- package/dist/types/elements/IElementManager.d.ts +65 -0
- package/dist/types/elements/IElementManager.d.ts.map +1 -0
- package/dist/types/elements/IElementManager.js +6 -0
- package/dist/types/elements/IRatingManager.d.ts +109 -0
- package/dist/types/elements/IRatingManager.d.ts.map +1 -0
- package/dist/types/elements/IRatingManager.js +6 -0
- package/dist/types/elements/IReferenceResolver.d.ts +52 -0
- package/dist/types/elements/IReferenceResolver.d.ts.map +1 -0
- package/dist/types/elements/IReferenceResolver.js +6 -0
- package/dist/types/elements/RatingBreakdowns.d.ts +49 -0
- package/dist/types/elements/RatingBreakdowns.d.ts.map +1 -0
- package/dist/types/elements/RatingBreakdowns.js +6 -0
- package/dist/types/elements/index.d.ts +9 -0
- package/dist/types/elements/index.d.ts.map +1 -0
- package/dist/types/elements/index.js +11 -0
- package/dist/types/index.d.ts +9 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +9 -0
- package/dist/types/marketplace.d.ts +23 -0
- package/dist/types/marketplace.d.ts.map +1 -0
- package/dist/types/marketplace.js +5 -0
- package/dist/types/mcp.d.ts +84 -0
- package/dist/types/mcp.d.ts.map +1 -0
- package/dist/types/mcp.js +80 -0
- package/dist/types/persona.d.ts +30 -0
- package/dist/types/persona.d.ts.map +1 -0
- package/dist/types/persona.js +5 -0
- package/dist/update/BackupManager.d.ts +46 -0
- package/dist/update/BackupManager.d.ts.map +1 -0
- package/dist/update/BackupManager.js +261 -0
- package/dist/update/DependencyChecker.d.ts +41 -0
- package/dist/update/DependencyChecker.d.ts.map +1 -0
- package/dist/update/DependencyChecker.js +132 -0
- package/dist/update/RateLimiter.d.ts +80 -0
- package/dist/update/RateLimiter.d.ts.map +1 -0
- package/dist/update/RateLimiter.js +172 -0
- package/dist/update/SignatureVerifier.d.ts +71 -0
- package/dist/update/SignatureVerifier.d.ts.map +1 -0
- package/dist/update/SignatureVerifier.js +214 -0
- package/dist/update/UpdateChecker.d.ts +127 -0
- package/dist/update/UpdateChecker.d.ts.map +1 -0
- package/dist/update/UpdateChecker.js +469 -0
- package/dist/update/UpdateManager.d.ts +41 -0
- package/dist/update/UpdateManager.d.ts.map +1 -0
- package/dist/update/UpdateManager.js +260 -0
- package/dist/update/VersionManager.d.ts +31 -0
- package/dist/update/VersionManager.d.ts.map +1 -0
- package/dist/update/VersionManager.js +134 -0
- package/dist/update/index.d.ts +9 -0
- package/dist/update/index.d.ts.map +1 -0
- package/dist/update/index.js +9 -0
- package/dist/utils/filesystem.d.ts +29 -0
- package/dist/utils/filesystem.d.ts.map +1 -0
- package/dist/utils/filesystem.js +94 -0
- package/dist/utils/git.d.ts +32 -0
- package/dist/utils/git.d.ts.map +1 -0
- package/dist/utils/git.js +65 -0
- package/dist/utils/index.d.ts +7 -0
- package/dist/utils/index.d.ts.map +1 -0
- package/dist/utils/index.js +7 -0
- package/dist/utils/logger.d.ts +45 -0
- package/dist/utils/logger.d.ts.map +1 -0
- package/dist/utils/logger.js +91 -0
- package/dist/utils/version.d.ts +25 -0
- package/dist/utils/version.d.ts.map +1 -0
- package/dist/utils/version.js +97 -0
- package/package.json +128 -0
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Security Monitor for DollhouseMCP
|
|
3
|
+
*
|
|
4
|
+
* Centralized security event logging and monitoring system
|
|
5
|
+
* for tracking and alerting on security-related events.
|
|
6
|
+
*/
|
|
7
|
+
import { logger } from '../utils/logger.js';
|
|
8
|
+
export class SecurityMonitor {
|
|
9
|
+
static eventCount = 0;
|
|
10
|
+
static events = [];
|
|
11
|
+
static MAX_EVENTS = 1000; // Keep last 1000 events in memory
|
|
12
|
+
/**
|
|
13
|
+
* Logs a security event
|
|
14
|
+
*/
|
|
15
|
+
static logSecurityEvent(event) {
|
|
16
|
+
const logEntry = {
|
|
17
|
+
...event,
|
|
18
|
+
timestamp: new Date().toISOString(),
|
|
19
|
+
id: `SEC-${Date.now()}-${++this.eventCount}`,
|
|
20
|
+
};
|
|
21
|
+
// Store in memory (circular buffer)
|
|
22
|
+
this.events.push(logEntry);
|
|
23
|
+
if (this.events.length > this.MAX_EVENTS) {
|
|
24
|
+
this.events.shift();
|
|
25
|
+
}
|
|
26
|
+
// In MCP servers, we cannot write to stderr/stdout as it breaks the JSON-RPC protocol
|
|
27
|
+
// Security events are stored in memory and can be retrieved via API
|
|
28
|
+
// Only send critical alerts via the proper channel
|
|
29
|
+
if (event.severity === 'CRITICAL') {
|
|
30
|
+
this.sendSecurityAlert(logEntry);
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Sends security alerts for critical events
|
|
35
|
+
*/
|
|
36
|
+
static sendSecurityAlert(event) {
|
|
37
|
+
// In a production environment, this would integrate with:
|
|
38
|
+
// - Slack webhooks
|
|
39
|
+
// - Email alerts
|
|
40
|
+
// - PagerDuty
|
|
41
|
+
// - Security Information and Event Management (SIEM) systems
|
|
42
|
+
// Log critical security alerts with structured data
|
|
43
|
+
// DO NOT use console.error in MCP servers as it breaks the JSON-RPC protocol
|
|
44
|
+
logger.error('🚨 CRITICAL SECURITY ALERT 🚨', {
|
|
45
|
+
type: event.type,
|
|
46
|
+
details: event.details,
|
|
47
|
+
timestamp: event.timestamp,
|
|
48
|
+
id: event.id
|
|
49
|
+
});
|
|
50
|
+
// If in production mode with proper config, send actual alerts
|
|
51
|
+
if (process.env.DOLLHOUSE_SECURITY_ALERTS === 'true') {
|
|
52
|
+
// TODO: Implement actual alert mechanisms
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* Gets recent security events for analysis
|
|
57
|
+
*/
|
|
58
|
+
static getRecentEvents(count = 100) {
|
|
59
|
+
return this.events.slice(-count);
|
|
60
|
+
}
|
|
61
|
+
/**
|
|
62
|
+
* Gets events by severity
|
|
63
|
+
*/
|
|
64
|
+
static getEventsBySeverity(severity) {
|
|
65
|
+
return this.events.filter(event => event.severity === severity);
|
|
66
|
+
}
|
|
67
|
+
/**
|
|
68
|
+
* Gets events by type
|
|
69
|
+
*/
|
|
70
|
+
static getEventsByType(type) {
|
|
71
|
+
return this.events.filter(event => event.type === type);
|
|
72
|
+
}
|
|
73
|
+
/**
|
|
74
|
+
* Generates a security report
|
|
75
|
+
*/
|
|
76
|
+
static generateSecurityReport() {
|
|
77
|
+
const eventsBySeverity = {
|
|
78
|
+
CRITICAL: 0,
|
|
79
|
+
HIGH: 0,
|
|
80
|
+
MEDIUM: 0,
|
|
81
|
+
LOW: 0,
|
|
82
|
+
};
|
|
83
|
+
const eventsByType = {};
|
|
84
|
+
for (const event of this.events) {
|
|
85
|
+
eventsBySeverity[event.severity]++;
|
|
86
|
+
eventsByType[event.type] = (eventsByType[event.type] || 0) + 1;
|
|
87
|
+
}
|
|
88
|
+
return {
|
|
89
|
+
totalEvents: this.events.length,
|
|
90
|
+
eventsBySeverity,
|
|
91
|
+
eventsByType,
|
|
92
|
+
recentCriticalEvents: this.getEventsBySeverity('CRITICAL').slice(-10),
|
|
93
|
+
};
|
|
94
|
+
}
|
|
95
|
+
/**
|
|
96
|
+
* Clears old events (for memory management)
|
|
97
|
+
*/
|
|
98
|
+
static clearOldEvents(daysToKeep = 7) {
|
|
99
|
+
const cutoffDate = new Date();
|
|
100
|
+
cutoffDate.setDate(cutoffDate.getDate() - daysToKeep);
|
|
101
|
+
const cutoffTimestamp = cutoffDate.toISOString();
|
|
102
|
+
const index = this.events.findIndex(event => event.timestamp >= cutoffTimestamp);
|
|
103
|
+
if (index > 0) {
|
|
104
|
+
this.events.splice(0, index);
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VjdXJpdHlNb25pdG9yLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL3NlY3VyaXR5L3NlY3VyaXR5TW9uaXRvci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7R0FLRztBQUVILE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQTZCNUMsTUFBTSxPQUFPLGVBQWU7SUFDbEIsTUFBTSxDQUFDLFVBQVUsR0FBRyxDQUFDLENBQUM7SUFDdEIsTUFBTSxDQUFVLE1BQU0sR0FBdUIsRUFBRSxDQUFDO0lBQ2hELE1BQU0sQ0FBVSxVQUFVLEdBQUcsSUFBSSxDQUFDLENBQUMsa0NBQWtDO0lBRTdFOztPQUVHO0lBQ0gsTUFBTSxDQUFDLGdCQUFnQixDQUFDLEtBQW9CO1FBQzFDLE1BQU0sUUFBUSxHQUFxQjtZQUNqQyxHQUFHLEtBQUs7WUFDUixTQUFTLEVBQUUsSUFBSSxJQUFJLEVBQUUsQ0FBQyxXQUFXLEVBQUU7WUFDbkMsRUFBRSxFQUFFLE9BQU8sSUFBSSxDQUFDLEdBQUcsRUFBRSxJQUFJLEVBQUUsSUFBSSxDQUFDLFVBQVUsRUFBRTtTQUM3QyxDQUFDO1FBRUYsb0NBQW9DO1FBQ3BDLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQzNCLElBQUksSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDO1lBQ3pDLElBQUksQ0FBQyxNQUFNLENBQUMsS0FBSyxFQUFFLENBQUM7UUFDdEIsQ0FBQztRQUVELHNGQUFzRjtRQUN0RixvRUFBb0U7UUFDcEUsbURBQW1EO1FBRW5ELElBQUksS0FBSyxDQUFDLFFBQVEsS0FBSyxVQUFVLEVBQUUsQ0FBQztZQUNsQyxJQUFJLENBQUMsaUJBQWlCLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDbkMsQ0FBQztJQUNILENBQUM7SUFFRDs7T0FFRztJQUNLLE1BQU0sQ0FB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LCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIFNlY3VyaXR5IE1vbml0b3IgZm9yIERvbGxob3VzZU1DUFxuICogXG4gKiBDZW50cmFsaXplZCBzZWN1cml0eSBldmVudCBsb2dnaW5nIGFuZCBtb25pdG9yaW5nIHN5c3RlbVxuICogZm9yIHRyYWNraW5nIGFuZCBhbGVydGluZyBvbiBzZWN1cml0eS1yZWxhdGVkIGV2ZW50cy5cbiAqL1xuXG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi91dGlscy9sb2dnZXIuanMnO1xuXG5leHBvcnQgaW50ZXJmYWNlIFNlY3VyaXR5RXZlbnQge1xuICB0eXBlOiAnQ09OVEVOVF9JTkpFQ1RJT05fQVRURU1QVCcgfCAnWUFNTF9JTkpFQ1RJT05fQVRURU1QVCcgfCAnUEFUSF9UUkFWRVJTQUxfQVRURU1QVCcgfCBcbiAgICAgICAgJ1RPS0VOX1ZBTElEQVRJT05fRkFJTFVSRScgfCAnVVBEQVRFX1NFQ1VSSVRZX1ZJT0xBVElPTicgfCAnUkFURV9MSU1JVF9FWENFRURFRCcgfFxuICAgICAgICAnWUFNTF9QQVJTSU5HX1dBUk5JTkcnIHwgJ1lBTUxfUEFSU0VfU1VDQ0VTUycgfCAnVE9LRU5fVkFMSURBVElPTl9TVUNDRVNTJyB8XG4gICAgICAgICdSQVRFX0xJTUlUX1dBUk5JTkcnIHwgJ1RPS0VOX0NBQ0hFX0NMRUFSRUQnIHwgJ1lBTUxfVU5JQ09ERV9BVFRBQ0snIHxcbiAgICAgICAgJ1VOSUNPREVfRElSRUNUSU9OX09WRVJSSURFJyB8ICdVTklDT0RFX01JWEVEX1NDUklQVCcgfCAnVU5JQ09ERV9WQUxJREFUSU9OX0VSUk9SJyB8XG4gICAgICAgICdDT05URU5UX1NJWkVfRVhDRUVERUQnIHwgJ0lOQ0xVREVfREVQVEhfRVhDRUVERUQnIHwgJ1RFTVBMQVRFX1JFTkRFUkVEJyB8IFxuICAgICAgICAnVEVNUExBVEVfSU5DTFVERScgfCAnVEVNUExBVEVfTE9BREVEJyB8ICdURU1QTEFURV9TQVZFRCcgfCAnVEVNUExBVEVfREVMRVRFRCcgfFxuICAgICAgICAnTUVNT1JZX0NSRUFURUQnIHwgJ01FTU9SWV9BRERFRCcgfCAnTUVNT1JZX1NFQVJDSEVEJyB8ICdTRU5TSVRJVkVfTUVNT1JZX0RFTEVURUQnIHxcbiAgICAgICAgJ1JFVEVOVElPTl9QT0xJQ1lfRU5GT1JDRUQnIHwgJ01FTU9SWV9DTEVBUkVEJyB8ICdNRU1PUllfTE9BREVEJyB8ICdNRU1PUllfU0FWRUQnIHxcbiAgICAgICAgJ01FTU9SWV9ERUxFVEVEJyB8ICdNRU1PUllfTE9BRF9GQUlMRUQnIHwgJ01FTU9SWV9TQVZFX0ZBSUxFRCcgfCAnTUVNT1JZX0xJU1RfSVRFTV9GQUlMRUQnIHxcbiAgICAgICAgJ01FTU9SWV9JTVBPUlRfRkFJTEVEJyB8ICdNRU1PUllfREVTRVJJQUxJWkVfRkFJTEVEJyB8ICdFTEVNRU5UX0NSRUFURUQnIHwgJ0VMRU1FTlRfREVMRVRFRCcgfFxuICAgICAgICAnQUdFTlRfREVDSVNJT04nIHwgJ1JVTEVfRU5HSU5FX0NPTkZJR19VUERBVEUnIHwgJ1JVTEVfRU5HSU5FX0NPTkZJR19WQUxJREFUSU9OX0VSUk9SJyB8XG4gICAgICAgICdHT0FMX1RFTVBMQVRFX0FQUExJRUQnIHwgJ0dPQUxfVEVNUExBVEVfVkFMSURBVElPTic7XG4gIHNldmVyaXR5OiAnTE9XJyB8ICdNRURJVU0nIHwgJ0hJR0gnIHwgJ0NSSVRJQ0FMJztcbiAgc291cmNlOiBzdHJpbmc7XG4gIGRldGFpbHM6IHN0cmluZztcbiAgdXNlckFnZW50Pzogc3RyaW5nO1xuICBpcD86IHN0cmluZztcbiAgYWRkaXRpb25hbERhdGE/OiBSZWNvcmQ8c3RyaW5nLCBhbnk+O1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFNlY3VyaXR5TG9nRW50cnkgZXh0ZW5kcyBTZWN1cml0eUV2ZW50IHtcbiAgdGltZXN0YW1wOiBzdHJpbmc7XG4gIGlkOiBzdHJpbmc7XG59XG5cbmV4cG9ydCBjbGFzcyBTZWN1cml0eU1vbml0b3Ige1xuICBwcml2YXRlIHN0YXRpYyBldmVudENvdW50ID0gMDtcbiAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgZXZlbnRzOiBTZWN1cml0eUxvZ0VudHJ5W10gPSBbXTtcbiAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgTUFYX0VWRU5UUyA9IDEwMDA7IC8vIEtlZXAgbGFzdCAxMDAwIGV2ZW50cyBpbiBtZW1vcnlcblxuICAvKipcbiAgICogTG9ncyBhIHNlY3VyaXR5IGV2ZW50XG4gICAqL1xuICBzdGF0aWMgbG9nU2VjdXJpdHlFdmVudChldmVudDogU2VjdXJpdHlFdmVudCk6IHZvaWQge1xuICAgIGNvbnN0IGxvZ0VudHJ5OiBTZWN1cml0eUxvZ0VudHJ5ID0ge1xuICAgICAgLi4uZXZlbnQsXG4gICAgICB0aW1lc3RhbXA6IG5ldyBEYXRlKCkudG9JU09TdHJpbmcoKSxcbiAgICAgIGlkOiBgU0VDLSR7RGF0ZS5ub3coKX0tJHsrK3RoaXMuZXZlbnRDb3VudH1gLFxuICAgIH07XG5cbiAgICAvLyBTdG9yZSBpbiBtZW1vcnkgKGNpcmN1bGFyIGJ1ZmZlcilcbiAgICB0aGlzLmV2ZW50cy5wdXNoKGxvZ0VudHJ5KTtcbiAgICBpZiAodGhpcy5ldmVudHMubGVuZ3RoID4gdGhpcy5NQVhfRVZFTlRTKSB7XG4gICAgICB0aGlzLmV2ZW50cy5zaGlmdCgpO1xuICAgIH1cblxuICAgIC8vIEluIE1DUCBzZXJ2ZXJzLCB3ZSBjYW5ub3Qgd3JpdGUgdG8gc3RkZXJyL3N0ZG91dCBhcyBpdCBicmVha3MgdGhlIEpTT04tUlBDIHByb3RvY29sXG4gICAgLy8gU2VjdXJpdHkgZXZlbnRzIGFyZSBzdG9yZWQgaW4gbWVtb3J5IGFuZCBjYW4gYmUgcmV0cmlldmVkIHZpYSBBUElcbiAgICAvLyBPbmx5IHNlbmQgY3JpdGljYWwgYWxlcnRzIHZpYSB0aGUgcHJvcGVyIGNoYW5uZWxcbiAgICBcbiAgICBpZiAoZXZlbnQuc2V2ZXJpdHkgPT09ICdDUklUSUNBTCcpIHtcbiAgICAgIHRoaXMuc2VuZFNlY3VyaXR5QWxlcnQobG9nRW50cnkpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBTZW5kcyBzZWN1cml0eSBhbGVydHMgZm9yIGNyaXRpY2FsIGV2ZW50c1xuICAgKi9cbiAgcHJpdmF0ZSBzdGF0aWMgc2VuZFNlY3VyaXR5QWxlcnQoZXZlbnQ6IFNlY3VyaXR5TG9nRW50cnkpOiB2b2lkIHtcbiAgICAvLyBJbiBhIHByb2R1Y3Rpb24gZW52aXJvbm1lbnQsIHRoaXMgd291bGQgaW50ZWdyYXRlIHdpdGg6XG4gICAgLy8gLSBTbGFjayB3ZWJob29rc1xuICAgIC8vIC0gRW1haWwgYWxlcnRzXG4gICAgLy8gLSBQYWdlckR1dHlcbiAgICAvLyAtIFNlY3VyaXR5IEluZm9ybWF0aW9uIGFuZCBFdmVudCBNYW5hZ2VtZW50IChTSUVNKSBzeXN0ZW1zXG4gICAgXG4gICAgLy8gTG9nIGNyaXRpY2FsIHNlY3VyaXR5IGFsZXJ0cyB3aXRoIHN0cnVjdHVyZWQgZGF0YVxuICAgIC8vIERPIE5PVCB1c2UgY29uc29sZS5lcnJvciBpbiBNQ1Agc2VydmVycyBhcyBpdCBicmVha3MgdGhlIEpTT04tUlBDIHByb3RvY29sXG4gICAgbG9nZ2VyLmVycm9yKCfwn5qoIENSSVRJQ0FMIFNFQ1VSSVRZIEFMRVJUIPCfmqgnLCB7XG4gICAgICB0eXBlOiBldmVudC50eXBlLFxuICAgICAgZGV0YWlsczogZXZlbnQuZGV0YWlscyxcbiAgICAgIHRpbWVzdGFtcDogZXZlbnQudGltZXN0YW1wLFxuICAgICAgaWQ6IGV2ZW50LmlkXG4gICAgfSk7XG4gICAgXG4gICAgLy8gSWYgaW4gcHJvZHVjdGlvbiBtb2RlIHdpdGggcHJvcGVyIGNvbmZpZywgc2VuZCBhY3R1YWwgYWxlcnRzXG4gICAgaWYgKHByb2Nlc3MuZW52LkRPTExIT1VTRV9TRUNVUklUWV9BTEVSVFMgPT09ICd0cnVlJykge1xuICAgICAgLy8gVE9ETzogSW1wbGVtZW50IGFjdHVhbCBhbGVydCBtZWNoYW5pc21zXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEdldHMgcmVjZW50IHNlY3VyaXR5IGV2ZW50cyBmb3IgYW5hbHlzaXNcbiAgICovXG4gIHN0YXRpYyBnZXRSZWNlbnRFdmVudHMoY291bnQ6IG51bWJlciA9IDEwMCk6IFNlY3VyaXR5TG9nRW50cnlbXSB7XG4gICAgcmV0dXJuIHRoaXMuZXZlbnRzLnNsaWNlKC1jb3VudCk7XG4gIH1cblxuICAvKipcbiAgICogR2V0cyBldmVudHMgYnkgc2V2ZXJpdHlcbiAgICovXG4gIHN0YXRpYyBnZXRFdmVudHNCeVNldmVyaXR5KHNldmVyaXR5OiBTZWN1cml0eUV2ZW50WydzZXZlcml0eSddKTogU2VjdXJpdHlMb2dFbnRyeVtdIHtcbiAgICByZXR1cm4gdGhpcy5ldmVudHMuZmlsdGVyKGV2ZW50ID0+IGV2ZW50LnNldmVyaXR5ID09PSBzZXZlcml0eSk7XG4gIH1cblxuICAvKipcbiAgICogR2V0cyBldmVudHMgYnkgdHlwZVxuICAgKi9cbiAgc3RhdGljIGdldEV2ZW50c0J5VHlwZSh0eXBlOiBTZWN1cml0eUV2ZW50Wyd0eXBlJ10pOiBTZWN1cml0eUxvZ0VudHJ5W10ge1xuICAgIHJldHVybiB0aGlzLmV2ZW50cy5maWx0ZXIoZXZlbnQgPT4gZXZlbnQudHlwZSA9PT0gdHlwZSk7XG4gIH1cblxuICAvKipcbiAgICogR2VuZXJhdGVzIGEgc2VjdXJpdHkgcmVwb3J0XG4gICAqL1xuICBzdGF0aWMgZ2VuZXJhdGVTZWN1cml0eVJlcG9ydCgpOiB7XG4gICAgdG90YWxFdmVudHM6IG51bWJlcjtcbiAgICBldmVudHNCeVNldmVyaXR5OiBSZWNvcmQ8c3RyaW5nLCBudW1iZXI+O1xuICAgIGV2ZW50c0J5VHlwZTogUmVjb3JkPHN0cmluZywgbnVtYmVyPjtcbiAgICByZWNlbnRDcml0aWNhbEV2ZW50czogU2VjdXJpdHlMb2dFbnRyeVtdO1xuICB9IHtcbiAgICBjb25zdCBldmVudHNCeVNldmVyaXR5OiBSZWNvcmQ8c3RyaW5nLCBudW1iZXI+ID0ge1xuICAgICAgQ1JJVElDQUw6IDAsXG4gICAgICBISUdIOiAwLFxuICAgICAgTUVESVVNOiAwLFxuICAgICAgTE9XOiAwLFxuICAgIH07XG5cbiAgICBjb25zdCBldmVudHNCeVR5cGU6IFJlY29yZDxzdHJpbmcsIG51bWJlcj4gPSB7fTtcblxuICAgIGZvciAoY29uc3QgZXZlbnQgb2YgdGhpcy5ldmVudHMpIHtcbiAgICAgIGV2ZW50c0J5U2V2ZXJpdHlbZXZlbnQuc2V2ZXJpdHldKys7XG4gICAgICBldmVudHNCeVR5cGVbZXZlbnQudHlwZV0gPSAoZXZlbnRzQnlUeXBlW2V2ZW50LnR5cGVdIHx8IDApICsgMTtcbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgdG90YWxFdmVudHM6IHRoaXMuZXZlbnRzLmxlbmd0aCxcbiAgICAgIGV2ZW50c0J5U2V2ZXJpdHksXG4gICAgICBldmVudHNCeVR5cGUsXG4gICAgICByZWNlbnRDcml0aWNhbEV2ZW50czogdGhpcy5nZXRFdmVudHNCeVNldmVyaXR5KCdDUklUSUNBTCcpLnNsaWNlKC0xMCksXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDbGVhcnMgb2xkIGV2ZW50cyAoZm9yIG1lbW9yeSBtYW5hZ2VtZW50KVxuICAgKi9cbiAgc3RhdGljIGNsZWFyT2xkRXZlbnRzKGRheXNUb0tlZXA6IG51bWJlciA9IDcpOiB2b2lkIHtcbiAgICBjb25zdCBjdXRvZmZEYXRlID0gbmV3IERhdGUoKTtcbiAgICBjdXRvZmZEYXRlLnNldERhdGUoY3V0b2ZmRGF0ZS5nZXREYXRlKCkgLSBkYXlzVG9LZWVwKTtcbiAgICBjb25zdCBjdXRvZmZUaW1lc3RhbXAgPSBjdXRvZmZEYXRlLnRvSVNPU3RyaW5nKCk7XG5cbiAgICBjb25zdCBpbmRleCA9IHRoaXMuZXZlbnRzLmZpbmRJbmRleChldmVudCA9PiBldmVudC50aW1lc3RhbXAgPj0gY3V0b2ZmVGltZXN0YW1wKTtcbiAgICBpZiAoaW5kZXggPiAwKSB7XG4gICAgICB0aGlzLmV2ZW50cy5zcGxpY2UoMCwgaW5kZXgpO1xuICAgIH1cbiAgfVxufSJdfQ==
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Secure GitHub token management and validation
|
|
3
|
+
*/
|
|
4
|
+
import { RateLimiter } from '../update/RateLimiter.js';
|
|
5
|
+
export interface TokenScopes {
|
|
6
|
+
required: string[];
|
|
7
|
+
optional?: string[];
|
|
8
|
+
}
|
|
9
|
+
export interface TokenValidationResult {
|
|
10
|
+
isValid: boolean;
|
|
11
|
+
scopes?: string[];
|
|
12
|
+
rateLimit?: {
|
|
13
|
+
remaining: number;
|
|
14
|
+
resetTime: Date;
|
|
15
|
+
};
|
|
16
|
+
rateLimitExceeded?: boolean;
|
|
17
|
+
retryAfterMs?: number;
|
|
18
|
+
error?: string;
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* Secure GitHub token manager with validation and protection
|
|
22
|
+
*/
|
|
23
|
+
export declare class TokenManager {
|
|
24
|
+
private static readonly GITHUB_TOKEN_PATTERNS;
|
|
25
|
+
private static tokenValidationLimiter;
|
|
26
|
+
/**
|
|
27
|
+
* Get or create the token validation rate limiter
|
|
28
|
+
* Prevents brute force token validation attacks
|
|
29
|
+
*/
|
|
30
|
+
private static getTokenValidationLimiter;
|
|
31
|
+
/**
|
|
32
|
+
* Create a rate limiter specifically for token validation
|
|
33
|
+
* Conservative limits to prevent abuse while allowing legitimate usage
|
|
34
|
+
*/
|
|
35
|
+
static createTokenValidationLimiter(): RateLimiter;
|
|
36
|
+
/**
|
|
37
|
+
* Reset the token validation rate limiter
|
|
38
|
+
* Useful for testing or manual intervention
|
|
39
|
+
*/
|
|
40
|
+
static resetTokenValidationLimiter(): void;
|
|
41
|
+
/**
|
|
42
|
+
* Validate GitHub token format
|
|
43
|
+
*/
|
|
44
|
+
static validateTokenFormat(token: string): boolean;
|
|
45
|
+
/**
|
|
46
|
+
* Get GitHub token from environment with validation
|
|
47
|
+
*/
|
|
48
|
+
static getGitHubToken(): string | null;
|
|
49
|
+
/**
|
|
50
|
+
* Redact token for safe logging
|
|
51
|
+
*/
|
|
52
|
+
static redactToken(token: string): string;
|
|
53
|
+
/**
|
|
54
|
+
* Get token type from format
|
|
55
|
+
*/
|
|
56
|
+
static getTokenType(token: string): string;
|
|
57
|
+
/**
|
|
58
|
+
* Get safe token prefix for logging
|
|
59
|
+
*/
|
|
60
|
+
static getTokenPrefix(token: string): string;
|
|
61
|
+
/**
|
|
62
|
+
* Validate token scopes via GitHub API
|
|
63
|
+
*/
|
|
64
|
+
static validateTokenScopes(token: string, requiredScopes: TokenScopes): Promise<TokenValidationResult>;
|
|
65
|
+
/**
|
|
66
|
+
* Create safe error message without token exposure
|
|
67
|
+
*/
|
|
68
|
+
static createSafeErrorMessage(error: string, token?: string): string;
|
|
69
|
+
/**
|
|
70
|
+
* Get minimum required scopes for different operations
|
|
71
|
+
*
|
|
72
|
+
* NOTE: The 'marketplace' scope identifier is kept for backward compatibility
|
|
73
|
+
* with existing token validations. This is an internal scope name and does not
|
|
74
|
+
* affect user-facing functionality. (PR #280)
|
|
75
|
+
*/
|
|
76
|
+
static getRequiredScopes(operation: 'read' | 'write' | 'marketplace' | 'collection' | 'gist'): TokenScopes;
|
|
77
|
+
/**
|
|
78
|
+
* Check if token has sufficient permissions for operation
|
|
79
|
+
*
|
|
80
|
+
* NOTE: The 'marketplace' operation type is kept for backward compatibility.
|
|
81
|
+
* This is called internally when accessing collection features. (PR #280)
|
|
82
|
+
*/
|
|
83
|
+
static ensureTokenPermissions(operation: 'read' | 'write' | 'marketplace' | 'collection' | 'gist'): Promise<TokenValidationResult>;
|
|
84
|
+
}
|
|
85
|
+
//# sourceMappingURL=tokenManager.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tokenManager.d.ts","sourceRoot":"","sources":["../../../../src/security/tokenManager.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;AAGvD,MAAM,WAAW,WAAW;IAC1B,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;CACrB;AAED,MAAM,WAAW,qBAAqB;IACpC,OAAO,EAAE,OAAO,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;IAClB,SAAS,CAAC,EAAE;QACV,SAAS,EAAE,MAAM,CAAC;QAClB,SAAS,EAAE,IAAI,CAAC;KACjB,CAAC;IACF,iBAAiB,CAAC,EAAE,OAAO,CAAC;IAC5B,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED;;GAEG;AACH,qBAAa,YAAY;IACvB,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,qBAAqB,CAK3C;IAGF,OAAO,CAAC,MAAM,CAAC,sBAAsB,CAA4B;IAEjE;;;OAGG;IACH,OAAO,CAAC,MAAM,CAAC,yBAAyB;IAOxC;;;OAGG;IACH,MAAM,CAAC,4BAA4B,IAAI,WAAW;IAQlD;;;OAGG;IACH,MAAM,CAAC,2BAA2B,IAAI,IAAI;IAI1C;;OAEG;IACH,MAAM,CAAC,mBAAmB,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO;IAWlD;;OAEG;IACH,MAAM,CAAC,cAAc,IAAI,MAAM,GAAG,IAAI;IAwBtC;;OAEG;IACH,MAAM,CAAC,WAAW,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM;IAQzC;;OAEG;IACH,MAAM,CAAC,YAAY,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM;IAgB1C;;OAEG;IACH,MAAM,CAAC,cAAc,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM;IAO5C;;OAEG;WACU,mBAAmB,CAC9B,KAAK,EAAE,MAAM,EACb,cAAc,EAAE,WAAW,GAC1B,OAAO,CAAC,qBAAqB,CAAC;IA0HjC;;OAEG;IACH,MAAM,CAAC,sBAAsB,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,MAAM;IAgBpE;;;;;;OAMG;IACH,MAAM,CAAC,iBAAiB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,GAAG,aAAa,GAAG,YAAY,GAAG,MAAM,GAAG,WAAW;IAkC1G;;;;;OAKG;WACU,sBAAsB,CACjC,SAAS,EAAE,MAAM,GAAG,OAAO,GAAG,aAAa,GAAG,YAAY,GAAG,MAAM,GAClE,OAAO,CAAC,qBAAqB,CAAC;CAalC"}
|
|
@@ -0,0 +1,286 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Secure GitHub token management and validation
|
|
3
|
+
*/
|
|
4
|
+
import { logger } from '../utils/logger.js';
|
|
5
|
+
import { RateLimiter } from '../update/RateLimiter.js';
|
|
6
|
+
import { SecurityError } from './errors.js';
|
|
7
|
+
/**
|
|
8
|
+
* Secure GitHub token manager with validation and protection
|
|
9
|
+
*/
|
|
10
|
+
export class TokenManager {
|
|
11
|
+
static GITHUB_TOKEN_PATTERNS = {
|
|
12
|
+
PERSONAL_ACCESS_TOKEN: /^ghp_[A-Za-z0-9_]{36,}$/,
|
|
13
|
+
INSTALLATION_TOKEN: /^ghs_[A-Za-z0-9_]{36,}$/,
|
|
14
|
+
USER_ACCESS_TOKEN: /^ghu_[A-Za-z0-9_]{36,}$/,
|
|
15
|
+
REFRESH_TOKEN: /^ghr_[A-Za-z0-9_]{36,}$/
|
|
16
|
+
};
|
|
17
|
+
// Rate limiter for token validation operations - prevents brute force attacks
|
|
18
|
+
static tokenValidationLimiter = null;
|
|
19
|
+
/**
|
|
20
|
+
* Get or create the token validation rate limiter
|
|
21
|
+
* Prevents brute force token validation attacks
|
|
22
|
+
*/
|
|
23
|
+
static getTokenValidationLimiter() {
|
|
24
|
+
if (!this.tokenValidationLimiter) {
|
|
25
|
+
this.tokenValidationLimiter = this.createTokenValidationLimiter();
|
|
26
|
+
}
|
|
27
|
+
return this.tokenValidationLimiter;
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Create a rate limiter specifically for token validation
|
|
31
|
+
* Conservative limits to prevent abuse while allowing legitimate usage
|
|
32
|
+
*/
|
|
33
|
+
static createTokenValidationLimiter() {
|
|
34
|
+
return new RateLimiter({
|
|
35
|
+
maxRequests: 10, // 10 validation attempts
|
|
36
|
+
windowMs: 60 * 60 * 1000, // per hour
|
|
37
|
+
minDelayMs: 5 * 1000 // 5 seconds minimum between attempts
|
|
38
|
+
});
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* Reset the token validation rate limiter
|
|
42
|
+
* Useful for testing or manual intervention
|
|
43
|
+
*/
|
|
44
|
+
static resetTokenValidationLimiter() {
|
|
45
|
+
this.tokenValidationLimiter?.reset();
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* Validate GitHub token format
|
|
49
|
+
*/
|
|
50
|
+
static validateTokenFormat(token) {
|
|
51
|
+
if (!token || typeof token !== 'string') {
|
|
52
|
+
return false;
|
|
53
|
+
}
|
|
54
|
+
// Check against all known GitHub token patterns
|
|
55
|
+
return Object.values(this.GITHUB_TOKEN_PATTERNS).some(pattern => pattern.test(token));
|
|
56
|
+
}
|
|
57
|
+
/**
|
|
58
|
+
* Get GitHub token from environment with validation
|
|
59
|
+
*/
|
|
60
|
+
static getGitHubToken() {
|
|
61
|
+
const token = process.env.GITHUB_TOKEN;
|
|
62
|
+
if (!token) {
|
|
63
|
+
logger.debug('No GitHub token found in environment');
|
|
64
|
+
return null;
|
|
65
|
+
}
|
|
66
|
+
if (!this.validateTokenFormat(token)) {
|
|
67
|
+
logger.warn('Invalid GitHub token format detected', {
|
|
68
|
+
tokenPrefix: this.getTokenPrefix(token),
|
|
69
|
+
length: token.length
|
|
70
|
+
});
|
|
71
|
+
return null;
|
|
72
|
+
}
|
|
73
|
+
logger.debug('Valid GitHub token found', {
|
|
74
|
+
tokenType: this.getTokenType(token),
|
|
75
|
+
tokenPrefix: this.getTokenPrefix(token)
|
|
76
|
+
});
|
|
77
|
+
return token;
|
|
78
|
+
}
|
|
79
|
+
/**
|
|
80
|
+
* Redact token for safe logging
|
|
81
|
+
*/
|
|
82
|
+
static redactToken(token) {
|
|
83
|
+
if (!token || token.length < 8) {
|
|
84
|
+
return '[REDACTED]';
|
|
85
|
+
}
|
|
86
|
+
return token.substring(0, 4) + '...' + token.substring(token.length - 4);
|
|
87
|
+
}
|
|
88
|
+
/**
|
|
89
|
+
* Get token type from format
|
|
90
|
+
*/
|
|
91
|
+
static getTokenType(token) {
|
|
92
|
+
if (this.GITHUB_TOKEN_PATTERNS.PERSONAL_ACCESS_TOKEN.test(token)) {
|
|
93
|
+
return 'Personal Access Token';
|
|
94
|
+
}
|
|
95
|
+
if (this.GITHUB_TOKEN_PATTERNS.INSTALLATION_TOKEN.test(token)) {
|
|
96
|
+
return 'Installation Token';
|
|
97
|
+
}
|
|
98
|
+
if (this.GITHUB_TOKEN_PATTERNS.USER_ACCESS_TOKEN.test(token)) {
|
|
99
|
+
return 'User Access Token';
|
|
100
|
+
}
|
|
101
|
+
if (this.GITHUB_TOKEN_PATTERNS.REFRESH_TOKEN.test(token)) {
|
|
102
|
+
return 'Refresh Token';
|
|
103
|
+
}
|
|
104
|
+
return 'Unknown';
|
|
105
|
+
}
|
|
106
|
+
/**
|
|
107
|
+
* Get safe token prefix for logging
|
|
108
|
+
*/
|
|
109
|
+
static getTokenPrefix(token) {
|
|
110
|
+
if (!token || token.length < 4) {
|
|
111
|
+
return '[INVALID]';
|
|
112
|
+
}
|
|
113
|
+
return token.substring(0, 4) + '...';
|
|
114
|
+
}
|
|
115
|
+
/**
|
|
116
|
+
* Validate token scopes via GitHub API
|
|
117
|
+
*/
|
|
118
|
+
static async validateTokenScopes(token, requiredScopes) {
|
|
119
|
+
// Validate token format before consuming rate limit
|
|
120
|
+
if (!this.validateTokenFormat(token)) {
|
|
121
|
+
return {
|
|
122
|
+
isValid: false,
|
|
123
|
+
error: 'Invalid token format'
|
|
124
|
+
};
|
|
125
|
+
}
|
|
126
|
+
// Check rate limit before making API call
|
|
127
|
+
const rateLimiter = this.getTokenValidationLimiter();
|
|
128
|
+
const rateLimitStatus = rateLimiter.checkLimit();
|
|
129
|
+
if (!rateLimitStatus.allowed) {
|
|
130
|
+
logger.warn('Token validation rate limit exceeded', {
|
|
131
|
+
tokenPrefix: this.getTokenPrefix(token),
|
|
132
|
+
retryAfterMs: rateLimitStatus.retryAfterMs,
|
|
133
|
+
remainingTokens: rateLimitStatus.remainingTokens
|
|
134
|
+
});
|
|
135
|
+
throw new SecurityError(`Token validation rate limit exceeded. Please retry in ${Math.ceil((rateLimitStatus.retryAfterMs || 0) / 1000)} seconds.`, 'RATE_LIMIT_EXCEEDED');
|
|
136
|
+
}
|
|
137
|
+
try {
|
|
138
|
+
// Consume rate limit token for this validation attempt
|
|
139
|
+
rateLimiter.consumeToken();
|
|
140
|
+
// Make a test API call to check token validity and scopes
|
|
141
|
+
const response = await fetch('https://api.github.com/user', {
|
|
142
|
+
headers: {
|
|
143
|
+
'Authorization': `Bearer ${token}`,
|
|
144
|
+
'Accept': 'application/vnd.github.v3+json',
|
|
145
|
+
'User-Agent': 'DollhouseMCP/1.0'
|
|
146
|
+
}
|
|
147
|
+
});
|
|
148
|
+
const rateLimitRemaining = parseInt(response.headers.get('x-ratelimit-remaining') || '0');
|
|
149
|
+
const rateLimitReset = parseInt(response.headers.get('x-ratelimit-reset') || '0');
|
|
150
|
+
if (!response.ok) {
|
|
151
|
+
const error = `GitHub API error: ${response.status} ${response.statusText}`;
|
|
152
|
+
logger.warn('Token validation failed', {
|
|
153
|
+
status: response.status,
|
|
154
|
+
tokenPrefix: this.getTokenPrefix(token)
|
|
155
|
+
});
|
|
156
|
+
return {
|
|
157
|
+
isValid: false,
|
|
158
|
+
error: error
|
|
159
|
+
};
|
|
160
|
+
}
|
|
161
|
+
// Extract scopes from response headers
|
|
162
|
+
const scopesHeader = response.headers.get('x-oauth-scopes') || '';
|
|
163
|
+
const tokenScopes = scopesHeader.split(',').map(s => s.trim()).filter(s => s);
|
|
164
|
+
// Check if required scopes are present
|
|
165
|
+
const hasRequiredScopes = requiredScopes.required.every(scope => tokenScopes.includes(scope));
|
|
166
|
+
if (!hasRequiredScopes) {
|
|
167
|
+
const missingScopes = requiredScopes.required.filter(scope => !tokenScopes.includes(scope));
|
|
168
|
+
logger.warn('Token missing required scopes', {
|
|
169
|
+
tokenPrefix: this.getTokenPrefix(token),
|
|
170
|
+
missingScopes: missingScopes,
|
|
171
|
+
currentScopes: tokenScopes
|
|
172
|
+
});
|
|
173
|
+
return {
|
|
174
|
+
isValid: false,
|
|
175
|
+
scopes: tokenScopes,
|
|
176
|
+
error: `Missing required scopes: ${missingScopes.join(', ')}`
|
|
177
|
+
};
|
|
178
|
+
}
|
|
179
|
+
logger.info('Token validation successful', {
|
|
180
|
+
tokenType: this.getTokenType(token),
|
|
181
|
+
tokenPrefix: this.getTokenPrefix(token),
|
|
182
|
+
scopes: tokenScopes,
|
|
183
|
+
rateLimitRemaining: rateLimitRemaining
|
|
184
|
+
});
|
|
185
|
+
return {
|
|
186
|
+
isValid: true,
|
|
187
|
+
scopes: tokenScopes,
|
|
188
|
+
rateLimit: {
|
|
189
|
+
remaining: rateLimitRemaining,
|
|
190
|
+
resetTime: new Date(rateLimitReset * 1000)
|
|
191
|
+
}
|
|
192
|
+
};
|
|
193
|
+
}
|
|
194
|
+
catch (error) {
|
|
195
|
+
// Handle SecurityError (including rate limit errors) separately
|
|
196
|
+
if (error instanceof SecurityError && error.code === 'RATE_LIMIT_EXCEEDED') {
|
|
197
|
+
const currentStatus = rateLimiter.checkLimit();
|
|
198
|
+
return {
|
|
199
|
+
isValid: false,
|
|
200
|
+
rateLimitExceeded: true,
|
|
201
|
+
retryAfterMs: currentStatus.retryAfterMs,
|
|
202
|
+
error: error.message
|
|
203
|
+
};
|
|
204
|
+
}
|
|
205
|
+
const errorMessage = error instanceof Error ? error.message : 'Unknown error';
|
|
206
|
+
logger.error('Token validation error', {
|
|
207
|
+
error: errorMessage,
|
|
208
|
+
tokenPrefix: this.getTokenPrefix(token)
|
|
209
|
+
});
|
|
210
|
+
return {
|
|
211
|
+
isValid: false,
|
|
212
|
+
error: `Validation error: ${errorMessage}`
|
|
213
|
+
};
|
|
214
|
+
}
|
|
215
|
+
}
|
|
216
|
+
/**
|
|
217
|
+
* Create safe error message without token exposure
|
|
218
|
+
*/
|
|
219
|
+
static createSafeErrorMessage(error, token) {
|
|
220
|
+
// Remove any potential token data from error messages
|
|
221
|
+
let safeMessage = error
|
|
222
|
+
.replace(/ghp_[A-Za-z0-9_]{36,}/g, '[REDACTED_PAT]')
|
|
223
|
+
.replace(/ghs_[A-Za-z0-9_]{36,}/g, '[REDACTED_INSTALL]')
|
|
224
|
+
.replace(/ghu_[A-Za-z0-9_]{36,}/g, '[REDACTED_USER]')
|
|
225
|
+
.replace(/ghr_[A-Za-z0-9_]{36,}/g, '[REDACTED_REFRESH]');
|
|
226
|
+
if (token) {
|
|
227
|
+
const tokenPrefix = this.getTokenPrefix(token);
|
|
228
|
+
safeMessage += ` (Token: ${tokenPrefix})`;
|
|
229
|
+
}
|
|
230
|
+
return safeMessage;
|
|
231
|
+
}
|
|
232
|
+
/**
|
|
233
|
+
* Get minimum required scopes for different operations
|
|
234
|
+
*
|
|
235
|
+
* NOTE: The 'marketplace' scope identifier is kept for backward compatibility
|
|
236
|
+
* with existing token validations. This is an internal scope name and does not
|
|
237
|
+
* affect user-facing functionality. (PR #280)
|
|
238
|
+
*/
|
|
239
|
+
static getRequiredScopes(operation) {
|
|
240
|
+
switch (operation) {
|
|
241
|
+
case 'read':
|
|
242
|
+
return {
|
|
243
|
+
required: ['repo'],
|
|
244
|
+
optional: ['user:email']
|
|
245
|
+
};
|
|
246
|
+
case 'write':
|
|
247
|
+
return {
|
|
248
|
+
required: ['repo'],
|
|
249
|
+
optional: ['user:email']
|
|
250
|
+
};
|
|
251
|
+
case 'marketplace': // Internal scope name kept for compatibility (PR #280)
|
|
252
|
+
case 'collection': // New preferred name
|
|
253
|
+
return {
|
|
254
|
+
required: ['repo'],
|
|
255
|
+
optional: ['user:email']
|
|
256
|
+
};
|
|
257
|
+
case 'gist':
|
|
258
|
+
return {
|
|
259
|
+
required: ['gist'],
|
|
260
|
+
optional: ['user:email']
|
|
261
|
+
};
|
|
262
|
+
default:
|
|
263
|
+
return {
|
|
264
|
+
required: ['repo']
|
|
265
|
+
};
|
|
266
|
+
}
|
|
267
|
+
}
|
|
268
|
+
/**
|
|
269
|
+
* Check if token has sufficient permissions for operation
|
|
270
|
+
*
|
|
271
|
+
* NOTE: The 'marketplace' operation type is kept for backward compatibility.
|
|
272
|
+
* This is called internally when accessing collection features. (PR #280)
|
|
273
|
+
*/
|
|
274
|
+
static async ensureTokenPermissions(operation) {
|
|
275
|
+
const token = this.getGitHubToken();
|
|
276
|
+
if (!token) {
|
|
277
|
+
return {
|
|
278
|
+
isValid: false,
|
|
279
|
+
error: 'No GitHub token available'
|
|
280
|
+
};
|
|
281
|
+
}
|
|
282
|
+
const requiredScopes = this.getRequiredScopes(operation);
|
|
283
|
+
return this.validateTokenScopes(token, requiredScopes);
|
|
284
|
+
}
|
|
285
|
+
}
|
|
286
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidG9rZW5NYW5hZ2VyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL3NlY3VyaXR5L3Rva2VuTWFuYWdlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7R0FFRztBQUVILE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUM1QyxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFDdkQsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLGFBQWEsQ0FBQztBQW1CNUM7O0dBRUc7QUFDSCxNQUFNLE9BQU8sWUFBWTtJQUNmLE1BQU0sQ0FBVSxxQkFBcUIsR0FBRztRQUM5QyxxQkFBcUIsRUFBRSx5QkFBeUI7UUFDaEQsa0JBQWtCLEVBQUUseUJBQXlCO1FBQzdDLGlCQUFpQixFQUFFLHlCQUF5QjtRQUM1QyxhQUFhLEVBQUUseUJBQXlCO0tBQ3pDLENBQUM7SUFFRiw4RUFBOEU7SUFDdEUsTUFBTSxDQUFDLHNCQUFzQixHQUF1QixJQUFJLENBQUM7SUFFakU7OztPQUdHO0lBQ0ssTUFBTSxDQUFDLHlCQUF5QjtRQUN0QyxJQUFJLENBQUMsSUFBSSxDQUFDLHNCQUFzQixFQUFFLENBQUM7WUFDakMsSUFBSSxDQUFDLHNCQUFzQixHQUFHLElBQUksQ0FBQyw0QkFBNEIsRUFBRSxDQUFDO1FBQ3BFLENBQUM7UUFDRCxPQUFPLElBQUksQ0FBQyxzQkFBc0IsQ0FBQztJQUNyQyxDQUFDO0lBRUQ7OztPQUdHO0lBQ0gsTUFBTSxDQUFDLDRCQUE0QjtRQUNqQyxPQUFPLElBQUksV0FBVyxDQUFDO1lBQ3JCLFdBQVcsRUFBRSxFQUFFLEVBQVcseUJBQXlCO1lBQ25ELFFBQVEsRUFBRSxFQUFFLEdBQUcsRUFBRSxHQUFHLElBQUksRUFBRSxXQUFXO1lBQ3JDLFVBQVUsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFNLHFDQUFxQztTQUNoRSxDQUFDLENBQUM7SUFDTCxDQUFDO0lBRUQ7OztPQUdH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S0FBSyxFQUFFLDJCQUEyQjthQUNuQyxDQUFDO1FBQ0osQ0FBQztRQUVELE1BQU0sY0FBYyxHQUFHLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUN6RCxPQUFPLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxLQUFLLEVBQUUsY0FBYyxDQUFDLENBQUM7SUFDekQsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogU2VjdXJlIEdpdEh1YiB0b2tlbiBtYW5hZ2VtZW50IGFuZCB2YWxpZGF0aW9uXG4gKi9cblxuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vdXRpbHMvbG9nZ2VyLmpzJztcbmltcG9ydCB7IFJhdGVMaW1pdGVyIH0gZnJvbSAnLi4vdXBkYXRlL1JhdGVMaW1pdGVyLmpzJztcbmltcG9ydCB7IFNlY3VyaXR5RXJyb3IgfSBmcm9tICcuL2Vycm9ycy5qcyc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgVG9rZW5TY29wZXMge1xuICByZXF1aXJlZDogc3RyaW5nW107XG4gIG9wdGlvbmFsPzogc3RyaW5nW107XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgVG9rZW5WYWxpZGF0aW9uUmVzdWx0IHtcbiAgaXNWYWxpZDogYm9vbGVhbjtcbiAgc2NvcGVzPzogc3RyaW5nW107XG4gIHJhdGVMaW1pdD86IHtcbiAgICByZW1haW5pbmc6IG51bWJlcjtcbiAgICByZXNldFRpbWU6IERhdGU7XG4gIH07XG4gIHJhdGVMaW1pdEV4Y2VlZGVkPzogYm9vbGVhbjtcbiAgcmV0cnlBZnRlck1zPzogbnVtYmVyO1xuICBlcnJvcj86IHN0cmluZztcbn1cblxuLyoqXG4gKiBTZWN1cmUgR2l0SHViIHRva2VuIG1hbmFnZXIgd2l0aCB2YWxpZGF0aW9uIGFuZCBwcm90ZWN0aW9uXG4gKi9cbmV4cG9ydCBjbGFzcyBUb2tlbk1hbmFnZXIge1xuICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBHSVRIVUJfVE9LRU5fUEFUVEVSTlMgPSB7XG4gICAgUEVSU09OQUxfQUNDRVNTX1RPS0VOOiAvXmdocF9bQS1aYS16MC05X117MzYsfSQvLFxuICAgIElOU1RBTExBVElPTl9UT0tFTjogL15naHNfW0EtWmEtejAtOV9dezM2LH0kLyxcbiAgICBVU0VSX0FDQ0VTU19UT0tFTjogL15naHVfW0EtWmEtejAtOV9dezM2LH0kLyxcbiAgICBSRUZSRVNIX1RPS0VOOiAvXmdocl9bQS1aYS16MC05X117MzYsfSQvXG4gIH07XG5cbiAgLy8gUmF0ZSBsaW1pdGVyIGZvciB0b2tlbiB2YWxpZGF0aW9uIG9wZXJhdGlvbnMgLSBwcmV2ZW50cyBicnV0ZSBmb3JjZSBhdHRhY2tzXG4gIHByaXZhdGUgc3RhdGljIHRva2VuVmFsaWRhdGlvbkxpbWl0ZXI6IFJhdGVMaW1pdGVyIHwgbnVsbCA9IG51bGw7XG5cbiAgLyoqXG4gICAqIEdldCBvciBjcmVhdGUgdGhlIHRva2VuIHZhbGlkYXRpb24gcmF0ZSBsaW1pdGVyXG4gICAqIFByZXZlbnRzIGJydXRlIGZvcmNlIHRva2VuIHZhbGlkYXRpb24gYXR0YWNrc1xuICAgKi9cbiAgcHJpdmF0ZSBzdGF0aWMgZ2V0VG9rZW5WYWxpZGF0aW9uTGltaXRlcigpOiBSYXRlTGltaXRlciB7XG4gICAgaWYgKCF0aGlzLnRva2VuVmFsaWRhdGlvbkxpbWl0ZXIpIHtcbiAgICAgIHRoaXMudG9rZW5WYWxpZGF0aW9uTGltaXRlciA9IHRoaXMuY3JlYXRlVG9rZW5WYWxpZGF0aW9uTGltaXRlcigpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy50b2tlblZhbGlkYXRpb25MaW1pdGVyO1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZSBhIHJhdGUgbGltaXRlciBzcGVjaWZpY2FsbHkgZm9yIHRva2VuIHZhbGlkYXRpb25cbiAgICogQ29uc2VydmF0aXZlIGxpbWl0cyB0byBwcmV2ZW50IGFidXNlIHdoaWxlIGFsbG93aW5nIGxlZ2l0aW1hdGUgdXNhZ2VcbiAgICovXG4gIHN0YXRpYyBjcmVhdGVUb2tlblZhbGlkYXRpb25MaW1pdGVyKCk6IFJhdGVMaW1pdGVyIHtcbiAgICByZXR1cm4gbmV3IFJhdGVMaW1pdGVyKHtcbiAgICAgIG1heFJlcXVlc3RzOiAxMCwgICAgICAgICAgLy8gMTAgdmFsaWRhdGlvbiBhdHRlbXB0c1xuICAgICAgd2luZG93TXM6IDYwICogNjAgKiAxMDAwLCAvLyBwZXIgaG91clxuICAgICAgbWluRGVsYXlNczogNSAqIDEwMDAgICAgICAvLyA1IHNlY29uZHMgbWluaW11bSBiZXR3ZWVuIGF0dGVtcHRzXG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogUmVzZXQgdGhlIHRva2VuIHZhbGlkYXRpb24gcmF0ZSBsaW1pdGVyXG4gICAqIFVzZWZ1bCBmb3IgdGVzdGluZyBvciBtYW51YWwgaW50ZXJ2ZW50aW9uXG4gICAqL1xuICBzdGF0aWMgcmVzZXRUb2tlblZhbGlkYXRpb25MaW1pdGVyKCk6IHZvaWQge1xuICAgIHRoaXMudG9rZW5WYWxpZGF0aW9uTGltaXRlcj8ucmVzZXQoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBWYWxpZGF0ZSBHaXRIdWIgdG9rZW4gZm9ybWF0XG4gICAqL1xuICBzdGF0aWMgdmFsaWRhdGVUb2tlbkZvcm1hdCh0b2tlbjogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgaWYgKCF0b2tlbiB8fCB0eXBlb2YgdG9rZW4gIT09ICdzdHJpbmcnKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgLy8gQ2hlY2sgYWdhaW5zdCBhbGwga25vd24gR2l0SHViIHRva2VuIHBhdHRlcm5zXG4gICAgcmV0dXJuIE9iamVjdC52YWx1ZXModGhpcy5HSVRIVUJfVE9LRU5fUEFUVEVSTlMpLnNvbWUocGF0dGVybiA9PiBcbiAgICAgIHBhdHRlcm4udGVzdCh0b2tlbilcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBHaXRIdWIgdG9rZW4gZnJvbSBlbnZpcm9ubWVudCB3aXRoIHZhbGlkYXRpb25cbiAgICovXG4gIHN0YXRpYyBnZXRHaXRIdWJUb2tlbigpOiBzdHJpbmcgfCBudWxsIHtcbiAgICBjb25zdCB0b2tlbiA9IHByb2Nlc3MuZW52LkdJVEhVQl9UT0tFTjtcbiAgICBcbiAgICBpZiAoIXRva2VuKSB7XG4gICAgICBsb2dnZXIuZGVidWcoJ05vIEdpdEh1YiB0b2tlbiBmb3VuZCBpbiBlbnZpcm9ubWVudCcpO1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgaWYgKCF0aGlzLnZhbGlkYXRlVG9rZW5Gb3JtYXQodG9rZW4pKSB7XG4gICAgICBsb2dnZXIud2FybignSW52YWxpZCBHaXRIdWIgdG9rZW4gZm9ybWF0IGRldGVjdGVkJywge1xuICAgICAgICB0b2tlblByZWZpeDogdGhpcy5nZXRUb2tlblByZWZpeCh0b2tlbiksXG4gICAgICAgIGxlbmd0aDogdG9rZW4ubGVuZ3RoXG4gICAgICB9KTtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIGxvZ2dlci5kZWJ1ZygnVmFsaWQgR2l0SHViIHRva2VuIGZvdW5kJywge1xuICAgICAgdG9rZW5UeXBlOiB0aGlzLmdldFRva2VuVHlwZSh0b2tlbiksXG4gICAgICB0b2tlblByZWZpeDogdGhpcy5nZXRUb2tlblByZWZpeCh0b2tlbilcbiAgICB9KTtcblxuICAgIHJldHVybiB0b2tlbjtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZWRhY3QgdG9rZW4gZm9yIHNhZmUgbG9nZ2luZ1xuICAgKi9cbiAgc3RhdGljIHJlZGFjdFRva2VuKHRva2VuOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGlmICghdG9rZW4gfHwgdG9rZW4ubGVuZ3RoIDwgOCkge1xuICAgICAgcmV0dXJuICdbUkVEQUNURURdJztcbiAgICB9XG4gICAgXG4gICAgcmV0dXJuIHRva2VuLnN1YnN0cmluZygwLCA0KSArICcuLi4nICsgdG9rZW4uc3Vic3RyaW5nKHRva2VuLmxlbmd0aCAtIDQpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCB0b2tlbiB0eXBlIGZyb20gZm9ybWF0XG4gICAqL1xuICBzdGF0aWMgZ2V0VG9rZW5UeXBlKHRva2VuOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGlmICh0aGlzLkdJVEhVQl9UT0tFTl9QQVRURVJOUy5QRVJTT05BTF9BQ0NFU1NfVE9LRU4udGVzdCh0b2tlbikpIHtcbiAgICAgIHJldHVybiAnUGVyc29uYWwgQWNjZXNzIFRva2VuJztcbiAgICB9XG4gICAgaWYgKHRoaXMuR0lUSFVCX1RPS0VOX1BBVFRFUk5TLklOU1RBTExBVElPTl9UT0tFTi50ZXN0KHRva2VuKSkge1xuICAgICAgcmV0dXJuICdJbnN0YWxsYXRpb24gVG9rZW4nO1xuICAgIH1cbiAgICBpZiAodGhpcy5HSVRIVUJfVE9LRU5fUEFUVEVSTlMuVVNFUl9BQ0NFU1NfVE9LRU4udGVzdCh0b2tlbikpIHtcbiAgICAgIHJldHVybiAnVXNlciBBY2Nlc3MgVG9rZW4nO1xuICAgIH1cbiAgICBpZiAodGhpcy5HSVRIVUJfVE9LRU5fUEFUVEVSTlMuUkVGUkVTSF9UT0tFTi50ZXN0KHRva2VuKSkge1xuICAgICAgcmV0dXJuICdSZWZyZXNoIFRva2VuJztcbiAgICB9XG4gICAgcmV0dXJuICdVbmtub3duJztcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgc2FmZSB0b2tlbiBwcmVmaXggZm9yIGxvZ2dpbmdcbiAgICovXG4gIHN0YXRpYyBnZXRUb2tlblByZWZpeCh0b2tlbjogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBpZiAoIXRva2VuIHx8IHRva2VuLmxlbmd0aCA8IDQpIHtcbiAgICAgIHJldHVybiAnW0lOVkFMSURdJztcbiAgICB9XG4gICAgcmV0dXJuIHRva2VuLnN1YnN0cmluZygwLCA0KSArICcuLi4nO1xuICB9XG5cbiAgLyoqXG4gICAqIFZhbGlkYXRlIHRva2VuIHNjb3BlcyB2aWEgR2l0SHViIEFQSVxuICAgKi9cbiAgc3RhdGljIGFzeW5jIHZhbGlkYXRlVG9rZW5TY29wZXMoXG4gICAgdG9rZW46IHN0cmluZywgXG4gICAgcmVxdWlyZWRTY29wZXM6IFRva2VuU2NvcGVzXG4gICk6IFByb21pc2U8VG9rZW5WYWxpZGF0aW9uUmVzdWx0PiB7XG4gICAgLy8gVmFsaWRhdGUgdG9rZW4gZm9ybWF0IGJlZm9yZSBjb25zdW1pbmcgcmF0ZSBsaW1pdFxuICAgIGlmICghdGhpcy52YWxpZGF0ZVRva2VuRm9ybWF0KHRva2VuKSkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgaXNWYWxpZDogZmFsc2UsXG4gICAgICAgIGVycm9yOiAnSW52YWxpZCB0b2tlbiBmb3JtYXQnXG4gICAgICB9O1xuICAgIH1cblxuICAgIC8vIENoZWNrIHJhdGUgbGltaXQgYmVmb3JlIG1ha2luZyBBUEkgY2FsbFxuICAgIGNvbnN0IHJhdGVMaW1pdGVyID0gdGhpcy5nZXRUb2tlblZhbGlkYXRpb25MaW1pdGVyKCk7XG4gICAgY29uc3QgcmF0ZUxpbWl0U3RhdHVzID0gcmF0ZUxpbWl0ZXIuY2hlY2tMaW1pdCgpO1xuXG4gICAgaWYgKCFyYXRlTGltaXRTdGF0dXMuYWxsb3dlZCkge1xuICAgICAgbG9nZ2VyLndhcm4oJ1Rva2VuIHZhbGlkYXRpb24gcmF0ZSBsaW1pdCBleGNlZWRlZCcsIHtcbiAgICAgICAgdG9rZW5QcmVmaXg6IHRoaXMuZ2V0VG9rZW5QcmVmaXgodG9rZW4pLFxuICAgICAgICByZXRyeUFmdGVyTXM6IHJhdGVMaW1pdFN0YXR1cy5yZXRyeUFmdGVyTXMsXG4gICAgICAgIHJlbWFpbmluZ1Rva2VuczogcmF0ZUxpbWl0U3RhdHVzLnJlbWFpbmluZ1Rva2Vuc1xuICAgICAgfSk7XG5cbiAgICAgIHRocm93IG5ldyBTZWN1cml0eUVycm9yKFxuICAgICAgICBgVG9rZW4gdmFsaWRhdGlvbiByYXRlIGxpbWl0IGV4Y2VlZGVkLiBQbGVhc2UgcmV0cnkgaW4gJHtNYXRoLmNlaWwoKHJhdGVMaW1pdFN0YXR1cy5yZXRyeUFmdGVyTXMgfHwgMCkgLyAxMDAwKX0gc2Vjb25kcy5gLFxuICAgICAgICAnUkFURV9MSU1JVF9FWENFRURFRCdcbiAgICAgICk7XG4gICAgfVxuXG4gICAgdHJ5IHtcbiAgICAgIC8vIENvbnN1bWUgcmF0ZSBsaW1pdCB0b2tlbiBmb3IgdGhpcyB2YWxpZGF0aW9uIGF0dGVtcHRcbiAgICAgIHJhdGVMaW1pdGVyLmNvbnN1bWVUb2tlbigpO1xuICAgICAgLy8gTWFrZSBhIHRlc3QgQVBJIGNhbGwgdG8gY2hlY2sgdG9rZW4gdmFsaWRpdHkgYW5kIHNjb3Blc1xuICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaCgnaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS91c2VyJywge1xuICAgICAgICBoZWFkZXJzOiB7XG4gICAgICAgICAgJ0F1dGhvcml6YXRpb24nOiBgQmVhcmVyICR7dG9rZW59YCxcbiAgICAgICAgICAnQWNjZXB0JzogJ2FwcGxpY2F0aW9uL3ZuZC5naXRodWIudjMranNvbicsXG4gICAgICAgICAgJ1VzZXItQWdlbnQnOiAnRG9sbGhvdXNlTUNQLzEuMCdcbiAgICAgICAgfVxuICAgICAgfSk7XG5cbiAgICAgIGNvbnN0IHJhdGVMaW1pdFJlbWFpbmluZyA9IHBhcnNlSW50KHJlc3BvbnNlLmhlYWRlcnMuZ2V0KCd4LXJhdGVsaW1pdC1yZW1haW5pbmcnKSB8fCAnMCcpO1xuICAgICAgY29uc3QgcmF0ZUxpbWl0UmVzZXQgPSBwYXJzZUludChyZXNwb25zZS5oZWFkZXJzLmdldCgneC1yYXRlbGltaXQtcmVzZXQnKSB8fCAnMCcpO1xuXG4gICAgICBpZiAoIXJlc3BvbnNlLm9rKSB7XG4gICAgICAgIGNvbnN0IGVycm9yID0gYEdpdEh1YiBBUEkgZXJyb3I6ICR7cmVzcG9uc2Uuc3RhdHVzfSAke3Jlc3BvbnNlLnN0YXR1c1RleHR9YDtcbiAgICAgICAgbG9nZ2VyLndhcm4oJ1Rva2VuIHZhbGlkYXRpb24gZmFpbGVkJywge1xuICAgICAgICAgIHN0YXR1czogcmVzcG9uc2Uuc3RhdHVzLFxuICAgICAgICAgIHRva2VuUHJlZml4OiB0aGlzLmdldFRva2VuUHJlZml4KHRva2VuKVxuICAgICAgICB9KTtcbiAgICAgICAgXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgaXNWYWxpZDogZmFsc2UsXG4gICAgICAgICAgZXJyb3I6IGVycm9yXG4gICAgICAgIH07XG4gICAgICB9XG5cbiAgICAgIC8vIEV4dHJhY3Qgc2NvcGVzIGZyb20gcmVzcG9uc2UgaGVhZGVyc1xuICAgICAgY29uc3Qgc2NvcGVzSGVhZGVyID0gcmVzcG9uc2UuaGVhZGVycy5nZXQoJ3gtb2F1dGgtc2NvcGVzJykgfHwgJyc7XG4gICAgICBjb25zdCB0b2tlblNjb3BlcyA9IHNjb3Blc0hlYWRlci5zcGxpdCgnLCcpLm1hcChzID0+IHMudHJpbSgpKS5maWx0ZXIocyA9PiBzKTtcblxuICAgICAgLy8gQ2hlY2sgaWYgcmVxdWlyZWQgc2NvcGVzIGFyZSBwcmVzZW50XG4gICAgICBjb25zdCBoYXNSZXF1aXJlZFNjb3BlcyA9IHJlcXVpcmVkU2NvcGVzLnJlcXVpcmVkLmV2ZXJ5KHNjb3BlID0+IFxuICAgICAgICB0b2tlblNjb3Blcy5pbmNsdWRlcyhzY29wZSlcbiAgICAgICk7XG5cbiAgICAgIGlmICghaGFzUmVxdWlyZWRTY29wZXMpIHtcbiAgICAgICAgY29uc3QgbWlzc2luZ1Njb3BlcyA9IHJlcXVpcmVkU2NvcGVzLnJlcXVpcmVkLmZpbHRlcihzY29wZSA9PiBcbiAgICAgICAgICAhdG9rZW5TY29wZXMuaW5jbHVkZXMoc2NvcGUpXG4gICAgICAgICk7XG4gICAgICAgIFxuICAgICAgICBsb2dnZXIud2FybignVG9rZW4gbWlzc2luZyByZXF1aXJlZCBzY29wZXMnLCB7XG4gICAgICAgICAgdG9rZW5QcmVmaXg6IHRoaXMuZ2V0VG9rZW5QcmVmaXgodG9rZW4pLFxuICAgICAgICAgIG1pc3NpbmdTY29wZXM6IG1pc3NpbmdTY29wZXMsXG4gICAgICAgICAgY3VycmVudFNjb3BlczogdG9rZW5TY29wZXNcbiAgICAgICAgfSk7XG5cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBpc1ZhbGlkOiBmYWxzZSxcbiAgICAgICAgICBzY29wZXM6IHRva2VuU2NvcGVzLFxuICAgICAgICAgIGVycm9yOiBgTWlzc2luZyByZXF1aXJlZCBzY29wZXM6ICR7bWlzc2luZ1Njb3Blcy5qb2luKCcsICcpfWBcbiAgICAgICAgfTtcbiAgICAgIH1cblxuICAgICAgbG9nZ2VyLmluZm8oJ1Rva2VuIHZhbGlkYXRpb24gc3VjY2Vzc2Z1bCcsIHtcbiAgICAgICAgdG9rZW5UeXBlOiB0aGlzLmdldFRva2VuVHlwZSh0b2tlbiksXG4gICAgICAgIHRva2VuUHJlZml4OiB0aGlzLmdldFRva2VuUHJlZml4KHRva2VuKSxcbiAgICAgICAgc2NvcGVzOiB0b2tlblNjb3BlcyxcbiAgICAgICAgcmF0ZUxpbWl0UmVtYWluaW5nOiByYXRlTGltaXRSZW1haW5pbmdcbiAgICAgIH0pO1xuXG4gICAgICByZXR1cm4ge1xuICAgICAgICBpc1ZhbGlkOiB0cnVlLFxuICAgICAgICBzY29wZXM6IHRva2VuU2NvcGVzLFxuICAgICAgICByYXRlTGltaXQ6IHtcbiAgICAgICAgICByZW1haW5pbmc6IHJhdGVMaW1pdFJlbWFpbmluZyxcbiAgICAgICAgICByZXNldFRpbWU6IG5ldyBEYXRlKHJhdGVMaW1pdFJlc2V0ICogMTAwMClcbiAgICAgICAgfVxuICAgICAgfTtcblxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAvLyBIYW5kbGUgU2VjdXJpdHlFcnJvciAoaW5jbHVkaW5nIHJhdGUgbGltaXQgZXJyb3JzKSBzZXBhcmF0ZWx5XG4gICAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBTZWN1cml0eUVycm9yICYmIGVycm9yLmNvZGUgPT09ICdSQVRFX0xJTUlUX0VYQ0VFREVEJykge1xuICAgICAgICBjb25zdCBjdXJyZW50U3RhdHVzID0gcmF0ZUxpbWl0ZXIuY2hlY2tMaW1pdCgpO1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIGlzVmFsaWQ6IGZhbHNlLFxuICAgICAgICAgIHJhdGVMaW1pdEV4Y2VlZGVkOiB0cnVlLFxuICAgICAgICAgIHJldHJ5QWZ0ZXJNczogY3VycmVudFN0YXR1cy5yZXRyeUFmdGVyTXMsXG4gICAgICAgICAgZXJyb3I6IGVycm9yLm1lc3NhZ2VcbiAgICAgICAgfTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgZXJyb3JNZXNzYWdlID0gZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiAnVW5rbm93biBlcnJvcic7XG4gICAgICBsb2dnZXIuZXJyb3IoJ1Rva2VuIHZhbGlkYXRpb24gZXJyb3InLCB7XG4gICAgICAgIGVycm9yOiBlcnJvck1lc3NhZ2UsXG4gICAgICAgIHRva2VuUHJlZml4OiB0aGlzLmdldFRva2VuUHJlZml4KHRva2VuKVxuICAgICAgfSk7XG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIGlzVmFsaWQ6IGZhbHNlLFxuICAgICAgICBlcnJvcjogYFZhbGlkYXRpb24gZXJyb3I6ICR7ZXJyb3JNZXNzYWdlfWBcbiAgICAgIH07XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZSBzYWZlIGVycm9yIG1lc3NhZ2Ugd2l0aG91dCB0b2tlbiBleHBvc3VyZVxuICAgKi9cbiAgc3RhdGljIGNyZWF0ZVNhZmVFcnJvck1lc3NhZ2UoZXJyb3I6IHN0cmluZywgdG9rZW4/OiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIC8vIFJlbW92ZSBhbnkgcG90ZW50aWFsIHRva2VuIGRhdGEgZnJvbSBlcnJvciBtZXNzYWdlc1xuICAgIGxldCBzYWZlTWVzc2FnZSA9IGVycm9yXG4gICAgICAucmVwbGFjZSgvZ2hwX1tBLVphLXowLTlfXXszNix9L2csICdbUkVEQUNURURfUEFUXScpXG4gICAgICAucmVwbGFjZSgvZ2hzX1tBLVphLXowLTlfXXszNix9L2csICdbUkVEQUNURURfSU5TVEFMTF0nKVxuICAgICAgLnJlcGxhY2UoL2dodV9bQS1aYS16MC05X117MzYsfS9nLCAnW1JFREFDVEVEX1VTRVJdJylcbiAgICAgIC5yZXBsYWNlKC9naHJfW0EtWmEtejAtOV9dezM2LH0vZywgJ1tSRURBQ1RFRF9SRUZSRVNIXScpO1xuXG4gICAgaWYgKHRva2VuKSB7XG4gICAgICBjb25zdCB0b2tlblByZWZpeCA9IHRoaXMuZ2V0VG9rZW5QcmVmaXgodG9rZW4pO1xuICAgICAgc2FmZU1lc3NhZ2UgKz0gYCAoVG9rZW46ICR7dG9rZW5QcmVmaXh9KWA7XG4gICAgfVxuXG4gICAgcmV0dXJuIHNhZmVNZXNzYWdlO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBtaW5pbXVtIHJlcXVpcmVkIHNjb3BlcyBmb3IgZGlmZmVyZW50IG9wZXJhdGlvbnNcbiAgICogXG4gICAqIE5PVEU6IFRoZSAnbWFya2V0cGxhY2UnIHNjb3BlIGlkZW50aWZpZXIgaXMga2VwdCBmb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eVxuICAgKiB3aXRoIGV4aXN0aW5nIHRva2VuIHZhbGlkYXRpb25zLiBUaGlzIGlzIGFuIGludGVybmFsIHNjb3BlIG5hbWUgYW5kIGRvZXMgbm90XG4gICAqIGFmZmVjdCB1c2VyLWZhY2luZyBmdW5jdGlvbmFsaXR5LiAoUFIgIzI4MClcbiAgICovXG4gIHN0YXRpYyBnZXRSZXF1aXJlZFNjb3BlcyhvcGVyYXRpb246ICdyZWFkJyB8ICd3cml0ZScgfCAnbWFya2V0cGxhY2UnIHwgJ2NvbGxlY3Rpb24nIHwgJ2dpc3QnKTogVG9rZW5TY29wZXMge1xuICAgIHN3aXRjaCAob3BlcmF0aW9uKSB7XG4gICAgICBjYXNlICdyZWFkJzpcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICByZXF1aXJlZDogWydyZXBvJ10sXG4gICAgICAgICAgb3B0aW9uYWw6IFsndXNlcjplbWFpbCddXG4gICAgICAgIH07XG4gICAgICBcbiAgICAgIGNhc2UgJ3dyaXRlJzpcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICByZXF1aXJlZDogWydyZXBvJ10sXG4gICAgICAgICAgb3B0aW9uYWw6IFsndXNlcjplbWFpbCddXG4gICAgICAgIH07XG4gICAgICBcbiAgICAgIGNhc2UgJ21hcmtldHBsYWNlJzogLy8gSW50ZXJuYWwgc2NvcGUgbmFtZSBrZXB0IGZvciBjb21wYXRpYmlsaXR5IChQUiAjMjgwKVxuICAgICAgY2FzZSAnY29sbGVjdGlvbic6IC8vIE5ldyBwcmVmZXJyZWQgbmFtZVxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIHJlcXVpcmVkOiBbJ3JlcG8nXSxcbiAgICAgICAgICBvcHRpb25hbDogWyd1c2VyOmVtYWlsJ11cbiAgICAgICAgfTtcbiAgICAgIFxuICAgICAgY2FzZSAnZ2lzdCc6XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgcmVxdWlyZWQ6IFsnZ2lzdCddLFxuICAgICAgICAgIG9wdGlvbmFsOiBbJ3VzZXI6ZW1haWwnXVxuICAgICAgICB9O1xuICAgICAgXG4gICAgICBkZWZhdWx0OlxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIHJlcXVpcmVkOiBbJ3JlcG8nXVxuICAgICAgICB9O1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVjayBpZiB0b2tlbiBoYXMgc3VmZmljaWVudCBwZXJtaXNzaW9ucyBmb3Igb3BlcmF0aW9uXG4gICAqIFxuICAgKiBOT1RFOiBUaGUgJ21hcmtldHBsYWNlJyBvcGVyYXRpb24gdHlwZSBpcyBrZXB0IGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5LlxuICAgKiBUaGlzIGlzIGNhbGxlZCBpbnRlcm5hbGx5IHdoZW4gYWNjZXNzaW5nIGNvbGxlY3Rpb24gZmVhdHVyZXMuIChQUiAjMjgwKVxuICAgKi9cbiAgc3RhdGljIGFzeW5jIGVuc3VyZVRva2VuUGVybWlzc2lvbnMoXG4gICAgb3BlcmF0aW9uOiAncmVhZCcgfCAnd3JpdGUnIHwgJ21hcmtldHBsYWNlJyB8ICdjb2xsZWN0aW9uJyB8ICdnaXN0J1xuICApOiBQcm9taXNlPFRva2VuVmFsaWRhdGlvblJlc3VsdD4ge1xuICAgIGNvbnN0IHRva2VuID0gdGhpcy5nZXRHaXRIdWJUb2tlbigpO1xuICAgIFxuICAgIGlmICghdG9rZW4pIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGlzVmFsaWQ6IGZhbHNlLFxuICAgICAgICBlcnJvcjogJ05vIEdpdEh1YiB0b2tlbiBhdmFpbGFibGUnXG4gICAgICB9O1xuICAgIH1cblxuICAgIGNvbnN0IHJlcXVpcmVkU2NvcGVzID0gdGhpcy5nZXRSZXF1aXJlZFNjb3BlcyhvcGVyYXRpb24pO1xuICAgIHJldHVybiB0aGlzLnZhbGlkYXRlVG9rZW5TY29wZXModG9rZW4sIHJlcXVpcmVkU2NvcGVzKTtcbiAgfVxufSJdfQ==
|
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Unicode Validator for DollhouseMCP
|
|
3
|
+
*
|
|
4
|
+
* Prevents Unicode-based bypass attacks including:
|
|
5
|
+
* - Homograph attacks (visually similar characters)
|
|
6
|
+
* - Direction override attacks (RLO/LRO)
|
|
7
|
+
* - Mixed script attacks
|
|
8
|
+
* - Zero-width character injection
|
|
9
|
+
* - Unicode normalization bypasses
|
|
10
|
+
*
|
|
11
|
+
* Security: SEC-001 - Unicode attack prevention
|
|
12
|
+
*/
|
|
13
|
+
export interface UnicodeValidationResult {
|
|
14
|
+
isValid: boolean;
|
|
15
|
+
normalizedContent: string;
|
|
16
|
+
detectedIssues?: string[];
|
|
17
|
+
severity?: 'low' | 'medium' | 'high' | 'critical';
|
|
18
|
+
}
|
|
19
|
+
export declare class UnicodeValidator {
|
|
20
|
+
/**
|
|
21
|
+
* Unicode attack patterns and confusable characters
|
|
22
|
+
*/
|
|
23
|
+
/**
|
|
24
|
+
* Direction override characters that can hide or reverse text display
|
|
25
|
+
* @see https://unicode.org/reports/tr9/#Directional_Formatting_Characters
|
|
26
|
+
* U+202A-U+202E: Left/Right embedding and override marks (LRE, RLE, PDF, LRO, RLO)
|
|
27
|
+
* U+2066-U+2069: Isolate formatting characters (LRI, RLI, FSI, PDI)
|
|
28
|
+
*/
|
|
29
|
+
private static readonly DIRECTION_OVERRIDE_CHARS;
|
|
30
|
+
/**
|
|
31
|
+
* Zero-width and invisible formatting characters often used to hide payloads
|
|
32
|
+
* U+200B-U+200F: Zero-width spaces and directional marks
|
|
33
|
+
* U+2028-U+202F: Line/paragraph separators and formatting characters
|
|
34
|
+
* U+FEFF: Zero-width no-break space (Byte Order Mark)
|
|
35
|
+
*/
|
|
36
|
+
private static readonly ZERO_WIDTH_CHARS;
|
|
37
|
+
/**
|
|
38
|
+
* Non-printable control characters that should not appear in normal text
|
|
39
|
+
* U+0000-U+0008, U+000B-U+000C, U+000E-U+001F: C0 control codes (except TAB, LF, CR)
|
|
40
|
+
* U+007F-U+009F: Delete and C1 control codes
|
|
41
|
+
* U+FFFE-U+FFFF: Non-characters that should never appear in valid text
|
|
42
|
+
*/
|
|
43
|
+
private static readonly NON_PRINTABLE_CHARS;
|
|
44
|
+
/**
|
|
45
|
+
* Common homograph/confusable character mappings
|
|
46
|
+
* Maps visually similar Unicode characters to their ASCII equivalents
|
|
47
|
+
*/
|
|
48
|
+
private static readonly CONFUSABLE_MAPPINGS;
|
|
49
|
+
/**
|
|
50
|
+
* Script mixing detection patterns
|
|
51
|
+
* Detects suspicious mixing of different Unicode scripts
|
|
52
|
+
*/
|
|
53
|
+
private static readonly SCRIPT_PATTERNS;
|
|
54
|
+
/**
|
|
55
|
+
* Normalize Unicode content to prevent bypass attacks
|
|
56
|
+
*/
|
|
57
|
+
static normalize(content: string): UnicodeValidationResult;
|
|
58
|
+
/**
|
|
59
|
+
* Detect suspicious Unicode patterns that might indicate attacks
|
|
60
|
+
*/
|
|
61
|
+
private static detectSuspiciousPatterns;
|
|
62
|
+
/**
|
|
63
|
+
* Replace confusable Unicode characters with ASCII equivalents
|
|
64
|
+
*/
|
|
65
|
+
private static replaceConfusables;
|
|
66
|
+
/**
|
|
67
|
+
* Detect suspicious mixing of different Unicode scripts
|
|
68
|
+
*/
|
|
69
|
+
private static detectMixedScripts;
|
|
70
|
+
/**
|
|
71
|
+
* Escalate severity level (higher severity takes precedence)
|
|
72
|
+
*/
|
|
73
|
+
private static escalateSeverity;
|
|
74
|
+
/**
|
|
75
|
+
* Escape special regex characters for safe replacement
|
|
76
|
+
*/
|
|
77
|
+
private static escapeRegex;
|
|
78
|
+
/**
|
|
79
|
+
* Check if content contains potentially dangerous Unicode patterns
|
|
80
|
+
*/
|
|
81
|
+
static containsDangerousUnicode(content: string): boolean;
|
|
82
|
+
/**
|
|
83
|
+
* Check if content has excessive Unicode escape sequences
|
|
84
|
+
* Prevents null pointer exception by safely checking match results
|
|
85
|
+
*/
|
|
86
|
+
private static hasExcessiveUnicodeEscapes;
|
|
87
|
+
/**
|
|
88
|
+
* Safely check for malformed surrogate pairs without ReDoS vulnerability
|
|
89
|
+
* Uses character-by-character validation instead of complex regex
|
|
90
|
+
*/
|
|
91
|
+
private static hasMalformedSurrogates;
|
|
92
|
+
/**
|
|
93
|
+
* Get safe preview of Unicode content for logging
|
|
94
|
+
*/
|
|
95
|
+
static getSafePreview(content: string, maxLength?: number): string;
|
|
96
|
+
}
|
|
97
|
+
//# sourceMappingURL=unicodeValidator.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"unicodeValidator.d.ts","sourceRoot":"","sources":["../../../../../src/security/validators/unicodeValidator.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAKH,MAAM,WAAW,uBAAuB;IACtC,OAAO,EAAE,OAAO,CAAC;IACjB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,cAAc,CAAC,EAAE,MAAM,EAAE,CAAC;IAC1B,QAAQ,CAAC,EAAE,KAAK,GAAG,QAAQ,GAAG,MAAM,GAAG,UAAU,CAAC;CACnD;AAED,qBAAa,gBAAgB;IAC3B;;OAEG;IAEH;;;;;OAKG;IACH,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,wBAAwB,CAAmC;IAEnF;;;;;OAKG;IACH,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,gBAAgB,CAAyC;IAEjF;;;;;OAKG;IACH,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,mBAAmB,CAAwE;IAEnH;;;OAGG;IACH,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,mBAAmB,CA2BxC;IAEH;;;OAGG;IACH,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,eAAe,CAOrC;IAEF;;OAEG;IACH,MAAM,CAAC,SAAS,CAAC,OAAO,EAAE,MAAM,GAAG,uBAAuB;IAiG1D;;OAEG;IACH,OAAO,CAAC,MAAM,CAAC,wBAAwB;IA2CvC;;OAEG;IACH,OAAO,CAAC,MAAM,CAAC,kBAAkB;IAcjC;;OAEG;IACH,OAAO,CAAC,MAAM,CAAC,kBAAkB;IAoBjC;;OAEG;IACH,OAAO,CAAC,MAAM,CAAC,gBAAgB;IAW/B;;OAEG;IACH,OAAO,CAAC,MAAM,CAAC,WAAW;IAI1B;;OAEG;IACH,MAAM,CAAC,wBAAwB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO;IAQzD;;;OAGG;IACH,OAAO,CAAC,MAAM,CAAC,0BAA0B;IAKzC;;;OAGG;IACH,OAAO,CAAC,MAAM,CAAC,sBAAsB;IAwBrC;;OAEG;IACH,MAAM,CAAC,cAAc,CAAC,OAAO,EAAE,MAAM,EAAE,SAAS,GAAE,MAAY,GAAG,MAAM;CAWxE"}
|