@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,80 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Input validation and sanitization functions
|
|
3
|
+
*/
|
|
4
|
+
/**
|
|
5
|
+
* Enhanced input validation for MCP tools
|
|
6
|
+
*/
|
|
7
|
+
export declare class MCPInputValidator {
|
|
8
|
+
/**
|
|
9
|
+
* Validate a persona identifier (name or filename)
|
|
10
|
+
*/
|
|
11
|
+
static validatePersonaIdentifier(identifier: string): string;
|
|
12
|
+
/**
|
|
13
|
+
* Validate search query for collection
|
|
14
|
+
*/
|
|
15
|
+
static validateSearchQuery(query: string): string;
|
|
16
|
+
/**
|
|
17
|
+
* Validate collection path
|
|
18
|
+
*/
|
|
19
|
+
static validateCollectionPath(path: string): string;
|
|
20
|
+
/**
|
|
21
|
+
* Validate URL for import operations
|
|
22
|
+
*/
|
|
23
|
+
static validateImportUrl(url: string): string;
|
|
24
|
+
/**
|
|
25
|
+
* Validate expiry days for sharing
|
|
26
|
+
*/
|
|
27
|
+
static validateExpiryDays(days: number): number;
|
|
28
|
+
/**
|
|
29
|
+
* Validate boolean confirmation parameters
|
|
30
|
+
*/
|
|
31
|
+
static validateConfirmation(confirm: boolean, operationName: string): boolean;
|
|
32
|
+
/**
|
|
33
|
+
* Validate field name for edit operations
|
|
34
|
+
*/
|
|
35
|
+
static validateEditField(field: string): string;
|
|
36
|
+
/**
|
|
37
|
+
* Check if hostname is a private IP address (IPv4 and IPv6)
|
|
38
|
+
*/
|
|
39
|
+
private static isPrivateIP;
|
|
40
|
+
/**
|
|
41
|
+
* Check for encoded private IP addresses that could bypass basic detection
|
|
42
|
+
*/
|
|
43
|
+
private static isEncodedPrivateIP;
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* Validate and sanitize a filename
|
|
47
|
+
*/
|
|
48
|
+
export declare function validateFilename(filename: string): string;
|
|
49
|
+
/**
|
|
50
|
+
* Validate and sanitize a path
|
|
51
|
+
*/
|
|
52
|
+
export declare function validatePath(inputPath: string, baseDir?: string): string;
|
|
53
|
+
/**
|
|
54
|
+
* Validate and sanitize a username
|
|
55
|
+
*/
|
|
56
|
+
export declare function validateUsername(username: string): string;
|
|
57
|
+
/**
|
|
58
|
+
* Validate a category
|
|
59
|
+
*/
|
|
60
|
+
export declare function validateCategory(category: string): string;
|
|
61
|
+
/**
|
|
62
|
+
* Validate content size
|
|
63
|
+
*/
|
|
64
|
+
export declare function validateContentSize(content: string, maxSize?: number): void;
|
|
65
|
+
/**
|
|
66
|
+
* Comprehensive input validation before pattern matching
|
|
67
|
+
* Validates all content types with appropriate limits
|
|
68
|
+
*/
|
|
69
|
+
export interface ContentValidationOptions {
|
|
70
|
+
maxContentLength?: number;
|
|
71
|
+
maxYamlLength?: number;
|
|
72
|
+
maxMetadataFieldLength?: number;
|
|
73
|
+
maxFileSize?: number;
|
|
74
|
+
}
|
|
75
|
+
export declare function validateInputLengths(content: string, contentType: 'full' | 'yaml' | 'metadata' | 'field', options?: ContentValidationOptions): void;
|
|
76
|
+
/**
|
|
77
|
+
* General input sanitization
|
|
78
|
+
*/
|
|
79
|
+
export declare function sanitizeInput(input: string, maxLength?: number): string;
|
|
80
|
+
//# sourceMappingURL=InputValidator.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"InputValidator.d.ts","sourceRoot":"","sources":["../../../../src/security/InputValidator.ts"],"names":[],"mappings":"AAAA;;GAEG;AAyBH;;GAEG;AACH,qBAAa,iBAAiB;IAC5B;;OAEG;IACH,MAAM,CAAC,yBAAyB,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM;IAkB5D;;OAEG;IACH,MAAM,CAAC,mBAAmB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM;IA4BjD;;OAEG;IACH,MAAM,CAAC,sBAAsB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM;IAoDnD;;OAEG;IACH,MAAM,CAAC,iBAAiB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM;IA8D7C;;OAEG;IACH,MAAM,CAAC,kBAAkB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM;IAgB/C;;OAEG;IACH,MAAM,CAAC,oBAAoB,CAAC,OAAO,EAAE,OAAO,EAAE,aAAa,EAAE,MAAM,GAAG,OAAO;IAY7E;;OAEG;IACH,MAAM,CAAC,iBAAiB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM;IAkB/C;;OAEG;IACH,OAAO,CAAC,MAAM,CAAC,WAAW;IAgD1B;;OAEG;IACH,OAAO,CAAC,MAAM,CAAC,kBAAkB;CA+BlC;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAiBzD;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,MAAM,CAwCxE;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAUzD;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAgBzD;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,GAAE,MAA2C,GAAG,IAAI,CAS/G;AAED;;;GAGG;AACH,MAAM,WAAW,wBAAwB;IACvC,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,sBAAsB,CAAC,EAAE,MAAM,CAAC;IAChC,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,wBAAgB,oBAAoB,CAClC,OAAO,EAAE,MAAM,EACf,WAAW,EAAE,MAAM,GAAG,MAAM,GAAG,UAAU,GAAG,OAAO,EACnD,OAAO,GAAE,wBAA6B,GACrC,IAAI,CA2CN;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAC,KAAK,EAAE,MAAM,EAAE,SAAS,GAAE,MAAa,GAAG,MAAM,CAa7E"}
|
|
@@ -0,0 +1,436 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Input validation and sanitization functions
|
|
3
|
+
*/
|
|
4
|
+
import * as path from 'path';
|
|
5
|
+
import { SECURITY_LIMITS, VALIDATION_PATTERNS } from './constants.js';
|
|
6
|
+
import { VALID_CATEGORIES } from '../config/constants.js';
|
|
7
|
+
import { RegexValidator } from './regexValidator.js';
|
|
8
|
+
// Pre-compiled regex patterns for better performance
|
|
9
|
+
// These patterns are used repeatedly and benefit from pre-compilation
|
|
10
|
+
const CONTROL_CHARS_REGEX = /[\x00-\x1F\x7F]/g;
|
|
11
|
+
const HTML_DANGEROUS_REGEX = /[<>'"&]/g;
|
|
12
|
+
const SHELL_METACHAR_REGEX = /[;&|`$()!\\~*?{}]/g;
|
|
13
|
+
const RTL_ZEROWIDTH_REGEX = /[\u202E\uFEFF]/g;
|
|
14
|
+
const COLLECTION_PATH_CHAR_REGEX = /[a-zA-Z0-9\/\-_.]/;
|
|
15
|
+
const VALID_COLLECTION_PATH_REGEX = /^[a-zA-Z0-9\/\-_.]*$/;
|
|
16
|
+
const IPV4_REGEX = /^(\d+)\.(\d+)\.(\d+)\.(\d+)$/;
|
|
17
|
+
const DECIMAL_IP_REGEX = /^\d{8,10}$/;
|
|
18
|
+
const HEX_IP_REGEX = /^0x[0-9a-f]{1,8}$/i;
|
|
19
|
+
const OCTAL_IP_REGEX = /^0[0-7]{8,11}$/;
|
|
20
|
+
const FILENAME_DANGEROUS_REGEX = /[\/\\:*?"<>|]/g;
|
|
21
|
+
const FILENAME_LEADING_DOTS_REGEX = /^\.+/;
|
|
22
|
+
const PATH_NORMALIZE_REGEX = /^\/{1,100}|\/{1,100}$/g;
|
|
23
|
+
const PATH_MULTIPLE_SLASHES_REGEX = /\/{1,100}/g;
|
|
24
|
+
const URL_PLUS_DECODE_REGEX = /\+/g;
|
|
25
|
+
/**
|
|
26
|
+
* Enhanced input validation for MCP tools
|
|
27
|
+
*/
|
|
28
|
+
export class MCPInputValidator {
|
|
29
|
+
/**
|
|
30
|
+
* Validate a persona identifier (name or filename)
|
|
31
|
+
*/
|
|
32
|
+
static validatePersonaIdentifier(identifier) {
|
|
33
|
+
if (!identifier || typeof identifier !== 'string') {
|
|
34
|
+
throw new Error('Persona identifier must be a non-empty string');
|
|
35
|
+
}
|
|
36
|
+
if (identifier.length > 100) {
|
|
37
|
+
throw new Error('Persona identifier too long (max 100 characters)');
|
|
38
|
+
}
|
|
39
|
+
// Allow persona names and filenames
|
|
40
|
+
const sanitized = sanitizeInput(identifier, 100);
|
|
41
|
+
if (!sanitized) {
|
|
42
|
+
throw new Error('Persona identifier contains only invalid characters');
|
|
43
|
+
}
|
|
44
|
+
return sanitized;
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* Validate search query for collection
|
|
48
|
+
*/
|
|
49
|
+
static validateSearchQuery(query) {
|
|
50
|
+
if (!query || typeof query !== 'string') {
|
|
51
|
+
throw new Error('Search query must be a non-empty string');
|
|
52
|
+
}
|
|
53
|
+
if (query.length < 2) {
|
|
54
|
+
throw new Error('Search query too short (minimum 2 characters)');
|
|
55
|
+
}
|
|
56
|
+
if (query.length > 200) {
|
|
57
|
+
throw new Error('Search query too long (max 200 characters)');
|
|
58
|
+
}
|
|
59
|
+
// Sanitize but preserve spaces for search
|
|
60
|
+
const sanitized = query
|
|
61
|
+
.replace(CONTROL_CHARS_REGEX, '') // Remove control characters
|
|
62
|
+
.replace(HTML_DANGEROUS_REGEX, '') // Remove HTML-dangerous characters
|
|
63
|
+
.replace(SHELL_METACHAR_REGEX, '') // Remove shell metacharacters (expanded)
|
|
64
|
+
.replace(RTL_ZEROWIDTH_REGEX, '') // Remove RTL override and zero-width chars
|
|
65
|
+
.trim();
|
|
66
|
+
if (!sanitized) {
|
|
67
|
+
throw new Error('Search query contains only invalid characters');
|
|
68
|
+
}
|
|
69
|
+
return sanitized;
|
|
70
|
+
}
|
|
71
|
+
/**
|
|
72
|
+
* Validate collection path
|
|
73
|
+
*/
|
|
74
|
+
static validateCollectionPath(path) {
|
|
75
|
+
if (!path || typeof path !== 'string') {
|
|
76
|
+
throw new Error('Collection path must be a non-empty string');
|
|
77
|
+
}
|
|
78
|
+
if (path.length > 500) {
|
|
79
|
+
throw new Error('Collection path too long (max 500 characters)');
|
|
80
|
+
}
|
|
81
|
+
// GitHub API paths should be safe filename patterns
|
|
82
|
+
// Use single regex test for better performance (avoids O(n) character-by-character check)
|
|
83
|
+
if (!VALID_COLLECTION_PATH_REGEX.test(path)) {
|
|
84
|
+
// Only do character-by-character check if validation fails, to provide detailed error message
|
|
85
|
+
for (let i = 0; i < path.length; i++) {
|
|
86
|
+
const char = path[i];
|
|
87
|
+
if (!COLLECTION_PATH_CHAR_REGEX.test(char)) {
|
|
88
|
+
throw new Error(`Invalid character '${char}' in collection path at position ${i + 1}`);
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
// Fallback error if we somehow don't find the invalid character
|
|
92
|
+
throw new Error('Invalid characters in collection path');
|
|
93
|
+
}
|
|
94
|
+
// Prevent path traversal in GitHub paths (comprehensive check)
|
|
95
|
+
const pathLower = path.toLowerCase();
|
|
96
|
+
const encodedPath = decodeURIComponent(path.replace(URL_PLUS_DECODE_REGEX, ' ')); // Decode URL encoding
|
|
97
|
+
// Check for various path traversal patterns
|
|
98
|
+
const traversalPatterns = [
|
|
99
|
+
'..', // Basic traversal
|
|
100
|
+
'./', // Current directory
|
|
101
|
+
'/../', // Directory traversal with slashes
|
|
102
|
+
'\\', // Backslash (Windows-style)
|
|
103
|
+
'%2e%2e', // URL-encoded ..
|
|
104
|
+
'%2e%2e%2f', // URL-encoded ../
|
|
105
|
+
'%2e%2e%5c', // URL-encoded ..\
|
|
106
|
+
'%252e%252e', // Double URL-encoded ..
|
|
107
|
+
'..%2f', // Mixed encoding
|
|
108
|
+
'..%5c', // Mixed encoding with backslash
|
|
109
|
+
'..../', // Dotdot bypass attempt
|
|
110
|
+
'..;/', // Semicolon bypass attempt
|
|
111
|
+
];
|
|
112
|
+
for (const pattern of traversalPatterns) {
|
|
113
|
+
if (pathLower.includes(pattern) || encodedPath.toLowerCase().includes(pattern)) {
|
|
114
|
+
throw new Error('Path traversal not allowed in collection path');
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
return path;
|
|
118
|
+
}
|
|
119
|
+
/**
|
|
120
|
+
* Validate URL for import operations
|
|
121
|
+
*/
|
|
122
|
+
static validateImportUrl(url) {
|
|
123
|
+
if (!url || typeof url !== 'string') {
|
|
124
|
+
throw new Error('URL must be a non-empty string');
|
|
125
|
+
}
|
|
126
|
+
if (url.length > 2000) {
|
|
127
|
+
throw new Error('URL too long (max 2000 characters)');
|
|
128
|
+
}
|
|
129
|
+
// Reject protocol-relative URLs that could bypass validation
|
|
130
|
+
if (url.startsWith('//')) {
|
|
131
|
+
throw new Error('Protocol-relative URLs are not allowed');
|
|
132
|
+
}
|
|
133
|
+
try {
|
|
134
|
+
// Decode URL to prevent encoding-based bypasses
|
|
135
|
+
let decodedUrl = url;
|
|
136
|
+
try {
|
|
137
|
+
decodedUrl = decodeURIComponent(url);
|
|
138
|
+
}
|
|
139
|
+
catch {
|
|
140
|
+
// If decoding fails, use original URL
|
|
141
|
+
}
|
|
142
|
+
const parsed = new URL(decodedUrl);
|
|
143
|
+
// Protocol validation
|
|
144
|
+
if (!['http:', 'https:'].includes(parsed.protocol)) {
|
|
145
|
+
throw new Error('Only HTTP(S) URLs are allowed');
|
|
146
|
+
}
|
|
147
|
+
// Enhanced SSRF protection with IDN normalization
|
|
148
|
+
let hostname = parsed.hostname.toLowerCase();
|
|
149
|
+
// Handle IDN (International Domain Names) by converting to ASCII
|
|
150
|
+
try {
|
|
151
|
+
const idnNormalized = new URL(`http://${hostname}`).hostname;
|
|
152
|
+
hostname = idnNormalized;
|
|
153
|
+
}
|
|
154
|
+
catch (idnError) {
|
|
155
|
+
// If IDN conversion fails, reject the URL for security
|
|
156
|
+
throw new Error('Invalid hostname: IDN conversion failed - potentially malicious domain name');
|
|
157
|
+
}
|
|
158
|
+
// Check for private IPs (now with IDN-normalized hostname)
|
|
159
|
+
if (this.isPrivateIP(hostname)) {
|
|
160
|
+
throw new Error('Private network URLs are not allowed');
|
|
161
|
+
}
|
|
162
|
+
// Additional SSRF checks for encoded IPs
|
|
163
|
+
if (this.isEncodedPrivateIP(hostname)) {
|
|
164
|
+
throw new Error('Encoded private network URLs are not allowed');
|
|
165
|
+
}
|
|
166
|
+
return url;
|
|
167
|
+
}
|
|
168
|
+
catch (error) {
|
|
169
|
+
if (error instanceof Error && (error.message.includes('Private network') || error.message.includes('Encoded private'))) {
|
|
170
|
+
throw error;
|
|
171
|
+
}
|
|
172
|
+
const errorMessage = error instanceof Error ? error.message : 'Unknown error';
|
|
173
|
+
throw new Error(`Invalid URL format: ${errorMessage}`);
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
/**
|
|
177
|
+
* Validate expiry days for sharing
|
|
178
|
+
*/
|
|
179
|
+
static validateExpiryDays(days) {
|
|
180
|
+
if (typeof days !== 'number') {
|
|
181
|
+
throw new Error('Expiry days must be a valid number');
|
|
182
|
+
}
|
|
183
|
+
if (isNaN(days) || !isFinite(days)) {
|
|
184
|
+
throw new Error('Expiry days must be a valid number');
|
|
185
|
+
}
|
|
186
|
+
if (days < 1 || days > 365) {
|
|
187
|
+
throw new Error('Expiry days must be between 1 and 365');
|
|
188
|
+
}
|
|
189
|
+
return Math.floor(days);
|
|
190
|
+
}
|
|
191
|
+
/**
|
|
192
|
+
* Validate boolean confirmation parameters
|
|
193
|
+
*/
|
|
194
|
+
static validateConfirmation(confirm, operationName) {
|
|
195
|
+
if (typeof confirm !== 'boolean') {
|
|
196
|
+
throw new Error(`${operationName} confirmation must be a boolean value`);
|
|
197
|
+
}
|
|
198
|
+
if (!confirm) {
|
|
199
|
+
throw new Error(`${operationName} operation requires explicit confirmation (true)`);
|
|
200
|
+
}
|
|
201
|
+
return confirm;
|
|
202
|
+
}
|
|
203
|
+
/**
|
|
204
|
+
* Validate field name for edit operations
|
|
205
|
+
*/
|
|
206
|
+
static validateEditField(field) {
|
|
207
|
+
if (!field || typeof field !== 'string') {
|
|
208
|
+
throw new Error('Field name must be a non-empty string');
|
|
209
|
+
}
|
|
210
|
+
const validFields = [
|
|
211
|
+
'name', 'description', 'category', 'instructions',
|
|
212
|
+
'triggers', 'version', 'author', 'tags'
|
|
213
|
+
];
|
|
214
|
+
const normalizedField = field.toLowerCase().trim();
|
|
215
|
+
if (!validFields.includes(normalizedField)) {
|
|
216
|
+
throw new Error(`Invalid field name. Must be one of: ${validFields.join(', ')}`);
|
|
217
|
+
}
|
|
218
|
+
return normalizedField;
|
|
219
|
+
}
|
|
220
|
+
/**
|
|
221
|
+
* Check if hostname is a private IP address (IPv4 and IPv6)
|
|
222
|
+
*/
|
|
223
|
+
static isPrivateIP(hostname) {
|
|
224
|
+
// Check for localhost variations
|
|
225
|
+
if (['localhost', '127.0.0.1', '::1'].includes(hostname)) {
|
|
226
|
+
return true;
|
|
227
|
+
}
|
|
228
|
+
// Check for private IPv4 ranges
|
|
229
|
+
const ipv4Match = hostname.match(IPV4_REGEX);
|
|
230
|
+
if (ipv4Match) {
|
|
231
|
+
const [, a, b, c, d] = ipv4Match.map(Number);
|
|
232
|
+
// 10.0.0.0/8
|
|
233
|
+
if (a === 10)
|
|
234
|
+
return true;
|
|
235
|
+
// 172.16.0.0/12
|
|
236
|
+
if (a === 172 && b >= 16 && b <= 31)
|
|
237
|
+
return true;
|
|
238
|
+
// 192.168.0.0/16
|
|
239
|
+
if (a === 192 && b === 168)
|
|
240
|
+
return true;
|
|
241
|
+
// 169.254.0.0/16 (link-local)
|
|
242
|
+
if (a === 169 && b === 254)
|
|
243
|
+
return true;
|
|
244
|
+
}
|
|
245
|
+
// Check for private IPv6 ranges
|
|
246
|
+
const ipv6Lower = hostname.toLowerCase();
|
|
247
|
+
// fc00::/7 - Unique Local Addresses (ULA)
|
|
248
|
+
if (ipv6Lower.startsWith('fc') || ipv6Lower.startsWith('fd')) {
|
|
249
|
+
return true;
|
|
250
|
+
}
|
|
251
|
+
// fe80::/10 - Link-Local Addresses
|
|
252
|
+
// IPv6 link-local addresses are fe80::/10, meaning the valid range is fe80 through febf
|
|
253
|
+
const fe80Range = parseInt(ipv6Lower.substring(0, 4), 16);
|
|
254
|
+
if (fe80Range >= 0xfe80 && fe80Range <= 0xfebf) {
|
|
255
|
+
return true;
|
|
256
|
+
}
|
|
257
|
+
// Additional IPv6 localhost formats
|
|
258
|
+
if (['::1', '0:0:0:0:0:0:0:1'].includes(ipv6Lower)) {
|
|
259
|
+
return true;
|
|
260
|
+
}
|
|
261
|
+
return false;
|
|
262
|
+
}
|
|
263
|
+
/**
|
|
264
|
+
* Check for encoded private IP addresses that could bypass basic detection
|
|
265
|
+
*/
|
|
266
|
+
static isEncodedPrivateIP(hostname) {
|
|
267
|
+
// Check for decimal encoded IPs (e.g., 2130706433 = 127.0.0.1)
|
|
268
|
+
if (DECIMAL_IP_REGEX.test(hostname)) {
|
|
269
|
+
const num = parseInt(hostname, 10);
|
|
270
|
+
if (num >= 0 && num <= 4294967295) { // Valid IPv4 range
|
|
271
|
+
// Convert to IP format and check if private
|
|
272
|
+
const ip = [(num >>> 24) & 255, (num >>> 16) & 255, (num >>> 8) & 255, num & 255].join('.');
|
|
273
|
+
return this.isPrivateIP(ip);
|
|
274
|
+
}
|
|
275
|
+
}
|
|
276
|
+
// Check for hex encoded IPs (e.g., 0x7f000001 = 127.0.0.1)
|
|
277
|
+
if (HEX_IP_REGEX.test(hostname)) {
|
|
278
|
+
const num = parseInt(hostname, 16);
|
|
279
|
+
if (num >= 0 && num <= 4294967295) {
|
|
280
|
+
const ip = [(num >>> 24) & 255, (num >>> 16) & 255, (num >>> 8) & 255, num & 255].join('.');
|
|
281
|
+
return this.isPrivateIP(ip);
|
|
282
|
+
}
|
|
283
|
+
}
|
|
284
|
+
// Check for octal encoded IPs (e.g., 017700000001 = 127.0.0.1)
|
|
285
|
+
if (OCTAL_IP_REGEX.test(hostname)) {
|
|
286
|
+
const num = parseInt(hostname, 8);
|
|
287
|
+
if (num >= 0 && num <= 4294967295) {
|
|
288
|
+
const ip = [(num >>> 24) & 255, (num >>> 16) & 255, (num >>> 8) & 255, num & 255].join('.');
|
|
289
|
+
return this.isPrivateIP(ip);
|
|
290
|
+
}
|
|
291
|
+
}
|
|
292
|
+
return false;
|
|
293
|
+
}
|
|
294
|
+
}
|
|
295
|
+
/**
|
|
296
|
+
* Validate and sanitize a filename
|
|
297
|
+
*/
|
|
298
|
+
export function validateFilename(filename) {
|
|
299
|
+
if (!filename || typeof filename !== 'string') {
|
|
300
|
+
throw new Error('Filename must be a non-empty string');
|
|
301
|
+
}
|
|
302
|
+
if (filename.length > SECURITY_LIMITS.MAX_FILENAME_LENGTH) {
|
|
303
|
+
throw new Error(`Filename too long (max ${SECURITY_LIMITS.MAX_FILENAME_LENGTH} characters)`);
|
|
304
|
+
}
|
|
305
|
+
// Remove any path separators and dangerous characters
|
|
306
|
+
const sanitized = filename.replace(FILENAME_DANGEROUS_REGEX, '').replace(FILENAME_LEADING_DOTS_REGEX, '');
|
|
307
|
+
if (!RegexValidator.validate(sanitized, VALIDATION_PATTERNS.SAFE_FILENAME, { maxLength: SECURITY_LIMITS.MAX_FILENAME_LENGTH })) {
|
|
308
|
+
throw new Error('Invalid filename format. Use alphanumeric characters, hyphens, underscores, and dots only.');
|
|
309
|
+
}
|
|
310
|
+
return sanitized;
|
|
311
|
+
}
|
|
312
|
+
/**
|
|
313
|
+
* Validate and sanitize a path
|
|
314
|
+
*/
|
|
315
|
+
export function validatePath(inputPath, baseDir) {
|
|
316
|
+
if (!inputPath || typeof inputPath !== 'string') {
|
|
317
|
+
throw new Error('Path must be a non-empty string');
|
|
318
|
+
}
|
|
319
|
+
// If baseDir is provided and inputPath is absolute, reject it
|
|
320
|
+
if (baseDir && path.isAbsolute(inputPath)) {
|
|
321
|
+
throw new Error('Absolute paths not allowed when base directory is specified');
|
|
322
|
+
}
|
|
323
|
+
// Remove leading/trailing slashes and normalize
|
|
324
|
+
// Length limits added to prevent ReDoS attacks
|
|
325
|
+
const normalized = inputPath.replace(PATH_NORMALIZE_REGEX, '').replace(PATH_MULTIPLE_SLASHES_REGEX, '/');
|
|
326
|
+
if (!VALIDATION_PATTERNS.SAFE_PATH.test(normalized)) {
|
|
327
|
+
throw new Error('Invalid path format. Use alphanumeric characters, hyphens, underscores, dots, and forward slashes only.');
|
|
328
|
+
}
|
|
329
|
+
// Check for path traversal attempts
|
|
330
|
+
if (normalized.includes('..') || normalized.includes('./') || normalized.includes('/.')) {
|
|
331
|
+
throw new Error('Path traversal not allowed');
|
|
332
|
+
}
|
|
333
|
+
// Validate path depth
|
|
334
|
+
const depth = normalized.split('/').length;
|
|
335
|
+
if (depth > SECURITY_LIMITS.MAX_PATH_DEPTH) {
|
|
336
|
+
throw new Error(`Path too deep (max ${SECURITY_LIMITS.MAX_PATH_DEPTH} levels)`);
|
|
337
|
+
}
|
|
338
|
+
// If baseDir provided, ensure path is within it
|
|
339
|
+
if (baseDir) {
|
|
340
|
+
const resolvedPath = path.resolve(baseDir, normalized);
|
|
341
|
+
const resolvedBase = path.resolve(baseDir);
|
|
342
|
+
if (!resolvedPath.startsWith(resolvedBase)) {
|
|
343
|
+
throw new Error('Path traversal attempt detected');
|
|
344
|
+
}
|
|
345
|
+
}
|
|
346
|
+
return normalized;
|
|
347
|
+
}
|
|
348
|
+
/**
|
|
349
|
+
* Validate and sanitize a username
|
|
350
|
+
*/
|
|
351
|
+
export function validateUsername(username) {
|
|
352
|
+
if (!username || typeof username !== 'string') {
|
|
353
|
+
throw new Error('Username must be a non-empty string');
|
|
354
|
+
}
|
|
355
|
+
if (!VALIDATION_PATTERNS.SAFE_USERNAME.test(username)) {
|
|
356
|
+
throw new Error('Invalid username format. Use alphanumeric characters, hyphens, underscores, and dots only.');
|
|
357
|
+
}
|
|
358
|
+
return username.toLowerCase();
|
|
359
|
+
}
|
|
360
|
+
/**
|
|
361
|
+
* Validate a category
|
|
362
|
+
*/
|
|
363
|
+
export function validateCategory(category) {
|
|
364
|
+
if (!category || typeof category !== 'string') {
|
|
365
|
+
throw new Error('Category must be a non-empty string');
|
|
366
|
+
}
|
|
367
|
+
if (!RegexValidator.validate(category, VALIDATION_PATTERNS.SAFE_CATEGORY, { maxLength: 50 })) {
|
|
368
|
+
throw new Error('Invalid category format. Use alphabetic characters, hyphens, and underscores only.');
|
|
369
|
+
}
|
|
370
|
+
const normalized = category.toLowerCase();
|
|
371
|
+
if (!VALID_CATEGORIES.includes(normalized)) {
|
|
372
|
+
throw new Error(`Invalid category. Must be one of: ${VALID_CATEGORIES.join(', ')}`);
|
|
373
|
+
}
|
|
374
|
+
return normalized;
|
|
375
|
+
}
|
|
376
|
+
/**
|
|
377
|
+
* Validate content size
|
|
378
|
+
*/
|
|
379
|
+
export function validateContentSize(content, maxSize = SECURITY_LIMITS.MAX_CONTENT_LENGTH) {
|
|
380
|
+
if (!content || typeof content !== 'string') {
|
|
381
|
+
throw new Error('Content must be a non-empty string');
|
|
382
|
+
}
|
|
383
|
+
const sizeBytes = Buffer.byteLength(content, 'utf8');
|
|
384
|
+
if (sizeBytes > maxSize) {
|
|
385
|
+
throw new Error(`Content too large (${sizeBytes} bytes, max ${maxSize} bytes)`);
|
|
386
|
+
}
|
|
387
|
+
}
|
|
388
|
+
export function validateInputLengths(content, contentType, options = {}) {
|
|
389
|
+
const limits = {
|
|
390
|
+
maxContentLength: options.maxContentLength ?? SECURITY_LIMITS.MAX_CONTENT_LENGTH,
|
|
391
|
+
maxYamlLength: options.maxYamlLength ?? SECURITY_LIMITS.MAX_YAML_LENGTH,
|
|
392
|
+
maxMetadataFieldLength: options.maxMetadataFieldLength ?? SECURITY_LIMITS.MAX_METADATA_FIELD_LENGTH,
|
|
393
|
+
maxFileSize: options.maxFileSize ?? SECURITY_LIMITS.MAX_FILE_SIZE
|
|
394
|
+
};
|
|
395
|
+
// Validate based on content type
|
|
396
|
+
switch (contentType) {
|
|
397
|
+
case 'full':
|
|
398
|
+
if (content.length > limits.maxContentLength) {
|
|
399
|
+
throw new Error(`Content exceeds maximum length of ${limits.maxContentLength} characters (${content.length} provided)`);
|
|
400
|
+
}
|
|
401
|
+
break;
|
|
402
|
+
case 'yaml':
|
|
403
|
+
if (content.length > limits.maxYamlLength) {
|
|
404
|
+
throw new Error(`YAML content exceeds maximum length of ${limits.maxYamlLength} characters (${content.length} provided)`);
|
|
405
|
+
}
|
|
406
|
+
break;
|
|
407
|
+
case 'metadata':
|
|
408
|
+
// For metadata, check overall size
|
|
409
|
+
if (content.length > limits.maxYamlLength) {
|
|
410
|
+
throw new Error(`Metadata exceeds maximum length of ${limits.maxYamlLength} characters (${content.length} provided)`);
|
|
411
|
+
}
|
|
412
|
+
break;
|
|
413
|
+
case 'field':
|
|
414
|
+
if (content.length > limits.maxMetadataFieldLength) {
|
|
415
|
+
throw new Error(`Field exceeds maximum length of ${limits.maxMetadataFieldLength} characters (${content.length} provided)`);
|
|
416
|
+
}
|
|
417
|
+
break;
|
|
418
|
+
}
|
|
419
|
+
}
|
|
420
|
+
/**
|
|
421
|
+
* General input sanitization
|
|
422
|
+
*/
|
|
423
|
+
export function sanitizeInput(input, maxLength = 1000) {
|
|
424
|
+
if (!input || typeof input !== 'string') {
|
|
425
|
+
return '';
|
|
426
|
+
}
|
|
427
|
+
// Remove potentially dangerous characters and limit length
|
|
428
|
+
return input
|
|
429
|
+
.replace(CONTROL_CHARS_REGEX, '') // Remove control characters
|
|
430
|
+
.replace(HTML_DANGEROUS_REGEX, '') // Remove HTML-dangerous characters
|
|
431
|
+
.replace(SHELL_METACHAR_REGEX, '') // Remove shell metacharacters (expanded)
|
|
432
|
+
.replace(RTL_ZEROWIDTH_REGEX, '') // Remove RTL override and zero-width chars
|
|
433
|
+
.substring(0, maxLength)
|
|
434
|
+
.trim();
|
|
435
|
+
}
|
|
436
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiSW5wdXRWYWxpZGF0b3IuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvc2VjdXJpdHkvSW5wdXRWYWxpZGF0b3IudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7O0dBRUc7QUFFSCxPQUFPLEtBQUssSUFBSSxNQUFNLE1BQU0sQ0FBQztBQUM3QixPQUFPLEVBQUUsZUFBZSxFQUFFLG1CQUFtQixFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDdEUsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDMUQsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBRXJELHFEQUFxRDtBQUNyRCxzRUFBc0U7QUFDdEUsTUFBTSxtQkFBbUIsR0FBRyxrQkFBa0IsQ0FBQztBQUMvQyxNQUFNLG9CQUFvQixHQUFHLFVBQVUsQ0FBQztBQUN4QyxNQUFNLG9CQUFvQixHQUFHLG9CQUFvQixDQUFDO0FBQ2xELE1BQU0sbUJBQW1CLEdBQUcsaUJBQWlCLENBQUM7QUFDOUMsTUFBTSwwQkFBMEIsR0FBRyxtQkFBbUIsQ0FBQztBQUN2RCxNQUFNLDJCQUEyQixHQUFHLHNCQUFzQixDQUFDO0FBQzNELE1BQU0sVUFBVSxHQUFHLDhCQUE4QixDQUFDO0FBQ2xELE1BQU0sZ0JBQWdCLEdBQUcsWUFBWSxDQUFDO0FBQ3RDLE1BQU0sWUFBWSxHQUFHLG9CQUFvQixDQUFDO0FBQzFDLE1BQU0sY0FBYyxHQUFHLGdCQUFnQixDQUFDO0FBQ3hDLE1BQU0sd0JBQXdCLEdBQUcsZ0JBQWdCLENBQUM7QUFDbEQsTUFBTSwyQkFBMkIsR0FBRyxNQUFNLENBQUM7QUFDM0MsTUFBTSxvQkFBb0IsR0FBRyx3QkFBd0IsQ0FBQztBQUN0RCxNQUFNLDJCQUEyQixHQUFHLFlBQVksQ0FBQztBQUNqRCxNQUFNLHFCQUFxQixHQUFHLEtBQUssQ0FBQztBQUVwQzs7R0FFRztBQUNILE1BQU0sT0FBTyxpQkFBaUI7SUFDNUI7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U0FDM0UsT0FBTyxDQUFDLG1CQUFtQixFQUFFLEVBQUUsQ0FBQyxDQUFDLDJDQUEyQztTQUM1RSxTQUFTLENBQUMsQ0FBQyxFQUFFLFNBQVMsQ0FBQztTQUN2QixJQUFJLEVBQUUsQ0FBQztBQUNaLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIElucHV0IHZhbGlkYXRpb24gYW5kIHNhbml0aXphdGlvbiBmdW5jdGlvbnNcbiAqL1xuXG5pbXBvcnQgKiBhcyBwYXRoIGZyb20gJ3BhdGgnO1xuaW1wb3J0IHsgU0VDVVJJVFlfTElNSVRTLCBWQUxJREFUSU9OX1BBVFRFUk5TIH0gZnJvbSAnLi9jb25zdGFudHMuanMnO1xuaW1wb3J0IHsgVkFMSURfQ0FURUdPUklFUyB9IGZyb20gJy4uL2NvbmZpZy9jb25zdGFudHMuanMnO1xuaW1wb3J0IHsgUmVnZXhWYWxpZGF0b3IgfSBmcm9tICcuL3JlZ2V4VmFsaWRhdG9yLmpzJztcblxuLy8gUHJlLWNvbXBpbGVkIHJlZ2V4IHBhdHRlcm5zIGZvciBiZXR0ZXIgcGVyZm9ybWFuY2Vcbi8vIFRoZXNlIHBhdHRlcm5zIGFyZSB1c2VkIHJlcGVhdGVkbHkgYW5kIGJlbmVmaXQgZnJvbSBwcmUtY29tcGlsYXRpb25cbmNvbnN0IENPTlRST0xfQ0hBUlNfUkVHRVggPSAvW1xceDAwLVxceDFGXFx4N0ZdL2c7XG5jb25zdCBIVE1MX0RBTkdFUk9VU19SRUdFWCA9IC9bPD4nXCImXS9nO1xuY29uc3QgU0hFTExfTUVUQUNIQVJfUkVHRVggPSAvWzsmfGAkKCkhXFxcXH4qP3t9XS9nO1xuY29uc3QgUlRMX1pFUk9XSURUSF9SRUdFWCA9IC9bXFx1MjAyRVxcdUZFRkZdL2c7XG5jb25zdCBDT0xMRUNUSU9OX1BBVEhfQ0hBUl9SRUdFWCA9IC9bYS16QS1aMC05XFwvXFwtXy5dLztcbmNvbnN0IFZBTElEX0NPTExFQ1RJT05fUEFUSF9SRUdFWCA9IC9eW2EtekEtWjAtOVxcL1xcLV8uXSokLztcbmNvbnN0IElQVjRfUkVHRVggPSAvXihcXGQrKVxcLihcXGQrKVxcLihcXGQrKVxcLihcXGQrKSQvO1xuY29uc3QgREVDSU1BTF9JUF9SRUdFWCA9IC9eXFxkezgsMTB9JC87XG5jb25zdCBIRVhfSVBfUkVHRVggPSAvXjB4WzAtOWEtZl17MSw4fSQvaTtcbmNvbnN0IE9DVEFMX0lQX1JFR0VYID0gL14wWzAtN117OCwxMX0kLztcbmNvbnN0IEZJTEVOQU1FX0RBTkdFUk9VU19SRUdFWCA9IC9bXFwvXFxcXDoqP1wiPD58XS9nO1xuY29uc3QgRklMRU5BTUVfTEVBRElOR19ET1RTX1JFR0VYID0gL15cXC4rLztcbmNvbnN0IFBBVEhfTk9STUFMSVpFX1JFR0VYID0gL15cXC97MSwxMDB9fFxcL3sxLDEwMH0kL2c7XG5jb25zdCBQQVRIX01VTFRJUExFX1NMQVNIRVNfUkVHRVggPSAvXFwvezEsMTAwfS9nO1xuY29uc3QgVVJMX1BMVVNfREVDT0RFX1JFR0VYID0gL1xcKy9nO1xuXG4vKipcbiAqIEVuaGFuY2VkIGlucHV0IHZhbGlkYXRpb24gZm9yIE1DUCB0b29sc1xuICovXG5leHBvcnQgY2xhc3MgTUNQSW5wdXRWYWxpZGF0b3Ige1xuICAvKipcbiAgICogVmFsaWRhdGUgYSBwZXJzb25hIGlkZW50aWZpZXIgKG5hbWUgb3IgZmlsZW5hbWUpXG4gICAqL1xuICBzdGF0aWMgdmFsaWRhdGVQZXJzb25hSWRlbnRpZmllcihpZGVudGlmaWVyOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGlmICghaWRlbnRpZmllciB8fCB0eXBlb2YgaWRlbnRpZmllciAhPT0gJ3N0cmluZycpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignUGVyc29uYSBpZGVudGlmaWVyIG11c3QgYmUgYSBub24tZW1wdHkgc3RyaW5nJyk7XG4gICAgfVxuXG4gICAgaWYgKGlkZW50aWZpZXIubGVuZ3RoID4gMTAwKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1BlcnNvbmEgaWRlbnRpZmllciB0b28gbG9uZyAobWF4IDEwMCBjaGFyYWN0ZXJzKScpO1xuICAgIH1cblxuICAgIC8vIEFsbG93IHBlcnNvbmEgbmFtZXMgYW5kIGZpbGVuYW1lc1xuICAgIGNvbnN0IHNhbml0aXplZCA9IHNhbml0aXplSW5wdXQoaWRlbnRpZmllciwgMTAwKTtcbiAgICBpZiAoIXNhbml0aXplZCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdQZXJzb25hIGlkZW50aWZpZXIgY29udGFpbnMgb25seSBpbnZhbGlkIGNoYXJhY3RlcnMnKTtcbiAgICB9XG5cbiAgICByZXR1cm4gc2FuaXRpemVkO1xuICB9XG5cbiAgLyoqXG4gICAqIFZhbGlkYXRlIHNlYXJjaCBxdWVyeSBmb3IgY29sbGVjdGlvblxuICAgKi9cbiAgc3RhdGljIHZhbGlkYXRlU2VhcmNoUXVlcnkocXVlcnk6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgaWYgKCFxdWVyeSB8fCB0eXBlb2YgcXVlcnkgIT09ICdzdHJpbmcnKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1NlYXJjaCBxdWVyeSBtdXN0IGJlIGEgbm9uLWVtcHR5IHN0cmluZycpO1xuICAgIH1cblxuICAgIGlmIChxdWVyeS5sZW5ndGggPCAyKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1NlYXJjaCBxdWVyeSB0b28gc2hvcnQgKG1pbmltdW0gMiBjaGFyYWN0ZXJzKScpO1xuICAgIH1cblxuICAgIGlmIChxdWVyeS5sZW5ndGggPiAyMDApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignU2VhcmNoIHF1ZXJ5IHRvbyBsb25nIChtYXggMjAwIGNoYXJhY3RlcnMpJyk7XG4gICAgfVxuXG4gICAgLy8gU2FuaXRpemUgYnV0IHByZXNlcnZlIHNwYWNlcyBmb3Igc2VhcmNoXG4gICAgY29uc3Qgc2FuaXRpemVkID0gcXVlcnlcbiAgICAgIC5yZXBsYWNlKENPTlRST0xfQ0hBUlNfUkVHRVgsICcnKSAvLyBSZW1vdmUgY29udHJvbCBjaGFyYWN0ZXJzXG4gICAgICAucmVwbGFjZShIVE1MX0RBTkdFUk9VU19SRUdFWCwgJycpIC8vIFJlbW92ZSBIVE1MLWRhbmdlcm91cyBjaGFyYWN0ZXJzXG4gICAgICAucmVwbGFjZShTSEVMTF9NRVRBQ0hBUl9SRUdFWCwgJycpIC8vIFJlbW92ZSBzaGVsbCBtZXRhY2hhcmFjdGVycyAoZXhwYW5kZWQpXG4gICAgICAucmVwbGFjZShSVExfWkVST1dJRFRIX1JFR0VYLCAnJykgLy8gUmVtb3ZlIFJUTCBvdmVycmlkZSBhbmQgemVyby13aWR0aCBjaGFyc1xuICAgICAgLnRyaW0oKTtcblxuICAgIGlmICghc2FuaXRpemVkKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1NlYXJjaCBxdWVyeSBjb250YWlucyBvbmx5IGludmFsaWQgY2hhcmFjdGVycycpO1xuICAgIH1cblxuICAgIHJldHVybiBzYW5pdGl6ZWQ7XG4gIH1cblxuICAvKipcbiAgICogVmFsaWRhdGUgY29sbGVjdGlvbiBwYXRoXG4gICAqL1xuICBzdGF0aWMgdmFsaWRhdGVDb2xsZWN0aW9uUGF0aChwYXRoOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGlmICghcGF0aCB8fCB0eXBlb2YgcGF0aCAhPT0gJ3N0cmluZycpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignQ29sbGVjdGlvbiBwYXRoIG11c3QgYmUgYSBub24tZW1wdHkgc3RyaW5nJyk7XG4gICAgfVxuXG4gICAgaWYgKHBhdGgubGVuZ3RoID4gNTAwKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0NvbGxlY3Rpb24gcGF0aCB0b28gbG9uZyAobWF4IDUwMCBjaGFyYWN0ZXJzKScpO1xuICAgIH1cblxuICAgIC8vIEdpdEh1YiBBUEkgcGF0aHMgc2hvdWxkIGJlIHNhZmUgZmlsZW5hbWUgcGF0dGVybnNcbiAgICAvLyBVc2Ugc2luZ2xlIHJlZ2V4IHRlc3QgZm9yIGJldHRlciBwZXJmb3JtYW5jZSAoYXZvaWRzIE8obikgY2hhcmFjdGVyLWJ5LWNoYXJhY3RlciBjaGVjaylcbiAgICBpZiAoIVZBTElEX0NPTExFQ1RJT05fUEFUSF9SRUdFWC50ZXN0KHBhdGgpKSB7XG4gICAgICAvLyBPbmx5IGRvIGNoYXJhY3Rlci1ieS1jaGFyYWN0ZXIgY2hlY2sgaWYgdmFsaWRhdGlvbiBmYWlscywgdG8gcHJvdmlkZSBkZXRhaWxlZCBlcnJvciBtZXNzYWdlXG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHBhdGgubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgY29uc3QgY2hhciA9IHBhdGhbaV07XG4gICAgICAgIGlmICghQ09MTEVDVElPTl9QQVRIX0NIQVJfUkVHRVgudGVzdChjaGFyKSkge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBjaGFyYWN0ZXIgJyR7Y2hhcn0nIGluIGNvbGxlY3Rpb24gcGF0aCBhdCBwb3NpdGlvbiAke2kgKyAxfWApO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICAvLyBGYWxsYmFjayBlcnJvciBpZiB3ZSBzb21laG93IGRvbid0IGZpbmQgdGhlIGludmFsaWQgY2hhcmFjdGVyXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgY2hhcmFjdGVycyBpbiBjb2xsZWN0aW9uIHBhdGgnKTtcbiAgICB9XG5cbiAgICAvLyBQcmV2ZW50IHBhdGggdHJhdmVyc2FsIGluIEdpdEh1YiBwYXRocyAoY29tcHJlaGVuc2l2ZSBjaGVjaylcbiAgICBjb25zdCBwYXRoTG93ZXIgPSBwYXRoLnRvTG93ZXJDYXNlKCk7XG4gICAgY29uc3QgZW5jb2RlZFBhdGggPSBkZWNvZGVVUklDb21wb25lbnQocGF0aC5yZXBsYWNlKFVSTF9QTFVTX0RFQ09ERV9SRUdFWCwgJyAnKSk7IC8vIERlY29kZSBVUkwgZW5jb2RpbmdcbiAgICBcbiAgICAvLyBDaGVjayBmb3IgdmFyaW91cyBwYXRoIHRyYXZlcnNhbCBwYXR0ZXJuc1xuICAgIGNvbnN0IHRyYXZlcnNhbFBhdHRlcm5zID0gW1xuICAgICAgJy4uJywgICAgICAgICAgLy8gQmFzaWMgdHJhdmVyc2FsXG4gICAgICAnLi8nLCAgICAgICAgICAvLyBDdXJyZW50IGRpcmVjdG9yeVxuICAgICAgJy8uLi8nLCAgICAgICAgLy8gRGlyZWN0b3J5IHRyYXZlcnNhbCB3aXRoIHNsYXNoZXNcbiAgICAgICdcXFxcJywgICAgICAgICAgLy8gQmFja3NsYXNoIChXaW5kb3dzLXN0eWxlKVxuICAgICAgJyUyZSUyZScsICAgICAgLy8gVVJMLWVuY29kZWQgLi5cbiAgICAgICclMmUlMmUlMmYnLCAgIC8vIFVSTC1lbmNvZGVkIC4uL1xuICAgICAgJyUyZSUyZSU1YycsICAgLy8gVVJMLWVuY29kZWQgLi5cXFxuICAgICAgJyUyNTJlJTI1MmUnLCAgLy8gRG91YmxlIFVSTC1lbmNvZGVkIC4uXG4gICAgICAnLi4lMmYnLCAgICAgICAvLyBNaXhlZCBlbmNvZGluZ1xuICAgICAgJy4uJTVjJywgICAgICAgLy8gTWl4ZWQgZW5jb2Rpbmcgd2l0aCBiYWNrc2xhc2hcbiAgICAgICcuLi4uLycsICAgICAgIC8vIERvdGRvdCBieXBhc3MgYXR0ZW1wdFxuICAgICAgJy4uOy8nLCAgICAgICAgLy8gU2VtaWNvbG9uIGJ5cGFzcyBhdHRlbXB0XG4gICAgXTtcbiAgICBcbiAgICBmb3IgKGNvbnN0IHBhdHRlcm4gb2YgdHJhdmVyc2FsUGF0dGVybnMpIHtcbiAgICAgIGlmIChwYXRoTG93ZXIuaW5jbHVkZXMocGF0dGVybikgfHwgZW5jb2RlZFBhdGgudG9Mb3dlckNhc2UoKS5pbmNsdWRlcyhwYXR0ZXJuKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1BhdGggdHJhdmVyc2FsIG5vdCBhbGxvd2VkIGluIGNvbGxlY3Rpb24gcGF0aCcpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBwYXRoO1xuICB9XG5cbiAgLyoqXG4gICAqIFZhbGlkYXRlIFVSTCBmb3IgaW1wb3J0IG9wZXJhdGlvbnNcbiAgICovXG4gIHN0YXRpYyB2YWxpZGF0ZUltcG9ydFVybCh1cmw6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgaWYgKCF1cmwgfHwgdHlwZW9mIHVybCAhPT0gJ3N0cmluZycpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignVVJMIG11c3QgYmUgYSBub24tZW1wdHkgc3RyaW5nJyk7XG4gICAgfVxuXG4gICAgaWYgKHVybC5sZW5ndGggPiAyMDAwKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1VSTCB0b28gbG9uZyAobWF4IDIwMDAgY2hhcmFjdGVycyknKTtcbiAgICB9XG5cbiAgICAvLyBSZWplY3QgcHJvdG9jb2wtcmVsYXRpdmUgVVJMcyB0aGF0IGNvdWxkIGJ5cGFzcyB2YWxpZGF0aW9uXG4gICAgaWYgKHVybC5zdGFydHNXaXRoKCcvLycpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1Byb3RvY29sLXJlbGF0aXZlIFVSTHMgYXJlIG5vdCBhbGxvd2VkJyk7XG4gICAgfVxuXG4gICAgdHJ5IHtcbiAgICAgIC8vIERlY29kZSBVUkwgdG8gcHJldmVudCBlbmNvZGluZy1iYXNlZCBieXBhc3Nlc1xuICAgICAgbGV0IGRlY29kZWRVcmwgPSB1cmw7XG4gICAgICB0cnkge1xuICAgICAgICBkZWNvZGVkVXJsID0gZGVjb2RlVVJJQ29tcG9uZW50KHVybCk7XG4gICAgICB9IGNhdGNoIHtcbiAgICAgICAgLy8gSWYgZGVjb2RpbmcgZmFpbHMsIHVzZSBvcmlnaW5hbCBVUkxcbiAgICAgIH1cbiAgICAgIFxuICAgICAgY29uc3QgcGFyc2VkID0gbmV3IFVSTChkZWNvZGVkVXJsKTtcbiAgICAgIFxuICAgICAgLy8gUHJvdG9jb2wgdmFsaWRhdGlvblxuICAgICAgaWYgKCFbJ2h0dHA6JywgJ2h0dHBzOiddLmluY2x1ZGVzKHBhcnNlZC5wcm90b2NvbCkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdPbmx5IEhUVFAoUykgVVJMcyBhcmUgYWxsb3dlZCcpO1xuICAgICAgfVxuICAgICAgXG4gICAgICAvLyBFbmhhbmNlZCBTU1JGIHByb3RlY3Rpb24gd2l0aCBJRE4gbm9ybWFsaXphdGlvblxuICAgICAgbGV0IGhvc3RuYW1lID0gcGFyc2VkLmhvc3RuYW1lLnRvTG93ZXJDYXNlKCk7XG4gICAgICBcbiAgICAgIC8vIEhhbmRsZSBJRE4gKEludGVybmF0aW9uYWwgRG9tYWluIE5hbWVzKSBieSBjb252ZXJ0aW5nIHRvIEFTQ0lJXG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCBpZG5Ob3JtYWxpemVkID0gbmV3IFVSTChgaHR0cDovLyR7aG9zdG5hbWV9YCkuaG9zdG5hbWU7XG4gICAgICAgIGhvc3RuYW1lID0gaWRuTm9ybWFsaXplZDtcbiAgICAgIH0gY2F0Y2ggKGlkbkVycm9yKSB7XG4gICAgICAgIC8vIElmIElETiBjb252ZXJzaW9uIGZhaWxzLCByZWplY3QgdGhlIFVSTCBmb3Igc2VjdXJpdHlcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIGhvc3RuYW1lOiBJRE4gY29udmVyc2lvbiBmYWlsZWQgLSBwb3RlbnRpYWxseSBtYWxpY2lvdXMgZG9tYWluIG5hbWUnKTtcbiAgICAgIH1cbiAgICAgIFxuICAgICAgLy8gQ2hlY2sgZm9yIHByaXZhdGUgSVBzIChub3cgd2l0aCBJRE4tbm9ybWFsaXplZCBob3N0bmFtZSlcbiAgICAgIGlmICh0aGlzLmlzUHJpdmF0ZUlQKGhvc3RuYW1lKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1ByaXZhdGUgbmV0d29yayBVUkxzIGFyZSBub3QgYWxsb3dlZCcpO1xuICAgICAgfVxuICAgICAgXG4gICAgICAvLyBBZGRpdGlvbmFsIFNTUkYgY2hlY2tzIGZvciBlbmNvZGVkIElQc1xuICAgICAgaWYgKHRoaXMuaXNFbmNvZGVkUHJpdmF0ZUlQKGhvc3RuYW1lKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0VuY29kZWQgcHJpdmF0ZSBuZXR3b3JrIFVSTHMgYXJlIG5vdCBhbGxvd2VkJyk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB1cmw7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIEVycm9yICYmIChlcnJvci5tZXNzYWdlLmluY2x1ZGVzKCdQcml2YXRlIG5ldHdvcmsnKSB8fCBlcnJvci5tZXNzYWdlLmluY2x1ZGVzKCdFbmNvZGVkIHByaXZhdGUnKSkpIHtcbiAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICB9XG4gICAgICBjb25zdCBlcnJvck1lc3NhZ2UgPSBlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6ICdVbmtub3duIGVycm9yJztcbiAgICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBVUkwgZm9ybWF0OiAke2Vycm9yTWVzc2FnZX1gKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogVmFsaWRhdGUgZXhwaXJ5IGRheXMgZm9yIHNoYXJpbmdcbiAgICovXG4gIHN0YXRpYyB2YWxpZGF0ZUV4cGlyeURheXMoZGF5czogbnVtYmVyKTogbnVtYmVyIHtcbiAgICBpZiAodHlwZW9mIGRheXMgIT09ICdudW1iZXInKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0V4cGlyeSBkYXlzIG11c3QgYmUgYSB2YWxpZCBudW1iZXInKTtcbiAgICB9XG4gICAgXG4gICAgaWYgKGlzTmFOKGRheXMpIHx8ICFpc0Zpbml0ZShkYXlzKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdFeHBpcnkgZGF5cyBtdXN0IGJlIGEgdmFsaWQgbnVtYmVyJyk7XG4gICAgfVxuXG4gICAgaWYgKGRheXMgPCAxIHx8IGRheXMgPiAzNjUpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignRXhwaXJ5IGRheXMgbXVzdCBiZSBiZXR3ZWVuIDEgYW5kIDM2NScpO1xuICAgIH1cblxuICAgIHJldHVybiBNYXRoLmZsb29yKGRheXMpO1xuICB9XG5cbiAgLyoqXG4gICAqIFZhbGlkYXRlIGJvb2xlYW4gY29uZmlybWF0aW9uIHBhcmFtZXRlcnNcbiAgICovXG4gIHN0YXRpYyB2YWxpZGF0ZUNvbmZpcm1hdGlvbihjb25maXJtOiBib29sZWFuLCBvcGVyYXRpb25OYW1lOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICBpZiAodHlwZW9mIGNvbmZpcm0gIT09ICdib29sZWFuJykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGAke29wZXJhdGlvbk5hbWV9IGNvbmZpcm1hdGlvbiBtdXN0IGJlIGEgYm9vbGVhbiB2YWx1ZWApO1xuICAgIH1cblxuICAgIGlmICghY29uZmlybSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGAke29wZXJhdGlvbk5hbWV9IG9wZXJhdGlvbiByZXF1aXJlcyBleHBsaWNpdCBjb25maXJtYXRpb24gKHRydWUpYCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGNvbmZpcm07XG4gIH1cblxuICAvKipcbiAgICogVmFsaWRhdGUgZmllbGQgbmFtZSBmb3IgZWRpdCBvcGVyYXRpb25zXG4gICAqL1xuICBzdGF0aWMgdmFsaWRhdGVFZGl0RmllbGQoZmllbGQ6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgaWYgKCFmaWVsZCB8fCB0eXBlb2YgZmllbGQgIT09ICdzdHJpbmcnKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ZpZWxkIG5hbWUgbXVzdCBiZSBhIG5vbi1lbXB0eSBzdHJpbmcnKTtcbiAgICB9XG5cbiAgICBjb25zdCB2YWxpZEZpZWxkcyA9IFtcbiAgICAgICduYW1lJywgJ2Rlc2NyaXB0aW9uJywgJ2NhdGVnb3J5JywgJ2luc3RydWN0aW9ucycsIFxuICAgICAgJ3RyaWdnZXJzJywgJ3ZlcnNpb24nLCAnYXV0aG9yJywgJ3RhZ3MnXG4gICAgXTtcblxuICAgIGNvbnN0IG5vcm1hbGl6ZWRGaWVsZCA9IGZpZWxkLnRvTG93ZXJDYXNlKCkudHJpbSgpO1xuICAgIGlmICghdmFsaWRGaWVsZHMuaW5jbHVkZXMobm9ybWFsaXplZEZpZWxkKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIGZpZWxkIG5hbWUuIE11c3QgYmUgb25lIG9mOiAke3ZhbGlkRmllbGRzLmpvaW4oJywgJyl9YCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIG5vcm1hbGl6ZWRGaWVsZDtcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVjayBpZiBob3N0bmFtZSBpcyBhIHByaXZhdGUgSVAgYWRkcmVzcyAoSVB2NCBhbmQgSVB2NilcbiAgICovXG4gIHByaXZhdGUgc3RhdGljIGlzUHJpdmF0ZUlQKGhvc3RuYW1lOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICAvLyBDaGVjayBmb3IgbG9jYWxob3N0IHZhcmlhdGlvbnNcbiAgICBpZiAoWydsb2NhbGhvc3QnLCAnMTI3LjAuMC4xJywgJzo6MSddLmluY2x1ZGVzKGhvc3RuYW1lKSkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgLy8gQ2hlY2sgZm9yIHByaXZhdGUgSVB2NCByYW5nZXNcbiAgICBjb25zdCBpcHY0TWF0Y2ggPSBob3N0bmFtZS5tYXRjaChJUFY0X1JFR0VYKTtcbiAgICBcbiAgICBpZiAoaXB2NE1hdGNoKSB7XG4gICAgICBjb25zdCBbLCBhLCBiLCBjLCBkXSA9IGlwdjRNYXRjaC5tYXAoTnVtYmVyKTtcbiAgICAgIFxuICAgICAgLy8gMTAuMC4wLjAvOFxuICAgICAgaWYgKGEgPT09IDEwKSByZXR1cm4gdHJ1ZTtcbiAgICAgIFxuICAgICAgLy8gMTcyLjE2LjAuMC8xMlxuICAgICAgaWYgKGEgPT09IDE3MiAmJiBiID49IDE2ICYmIGIgPD0gMzEpIHJldHVybiB0cnVlO1xuICAgICAgXG4gICAgICAvLyAxOTIuMTY4LjAuMC8xNlxuICAgICAgaWYgKGEgPT09IDE5MiAmJiBiID09PSAxNjgpIHJldHVybiB0cnVlO1xuICAgICAgXG4gICAgICAvLyAxNjkuMjU0LjAuMC8xNiAobGluay1sb2NhbClcbiAgICAgIGlmIChhID09PSAxNjkgJiYgYiA9PT0gMjU0KSByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICAvLyBDaGVjayBmb3IgcHJpdmF0ZSBJUHY2IHJhbmdlc1xuICAgIGNvbnN0IGlwdjZMb3dlciA9IGhvc3RuYW1lLnRvTG93ZXJDYXNlKCk7XG4gICAgXG4gICAgLy8gZmMwMDo6LzcgLSBVbmlxdWUgTG9jYWwgQWRkcmVzc2VzIChVTEEpXG4gICAgaWYgKGlwdjZMb3dlci5zdGFydHNXaXRoKCdmYycpIHx8IGlwdjZMb3dlci5zdGFydHNXaXRoKCdmZCcpKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgXG4gICAgLy8gZmU4MDo6LzEwIC0gTGluay1Mb2NhbCBBZGRyZXNzZXNcbiAgICAvLyBJUHY2IGxpbmstbG9jYWwgYWRkcmVzc2VzIGFyZSBmZTgwOjovMTAsIG1lYW5pbmcgdGhlIHZhbGlkIHJhbmdlIGlzIGZlODAgdGhyb3VnaCBmZWJmXG4gICAgY29uc3QgZmU4MFJhbmdlID0gcGFyc2VJbnQoaXB2Nkxvd2VyLnN1YnN0cmluZygwLCA0KSwgMTYpO1xuICAgIGlmIChmZTgwUmFuZ2UgPj0gMHhmZTgwICYmIGZlODBSYW5nZSA8PSAweGZlYmYpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICBcbiAgICAvLyBBZGRpdGlvbmFsIElQdjYgbG9jYWxob3N0IGZvcm1hdHNcbiAgICBpZiAoWyc6OjEnLCAnMDowOjA6MDowOjA6MDoxJ10uaW5jbHVkZXMoaXB2Nkxvd2VyKSkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrIGZvciBlbmNvZGVkIHByaXZhdGUgSVAgYWRkcmVzc2VzIHRoYXQgY291bGQgYnlwYXNzIGJhc2ljIGRldGVjdGlvblxuICAgKi9cbiAgcHJpdmF0ZSBzdGF0aWMgaXNFbmNvZGVkUHJpdmF0ZUlQKGhvc3RuYW1lOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICAvLyBDaGVjayBmb3IgZGVjaW1hbCBlbmNvZGVkIElQcyAoZS5nLiwgMjEzMDcwNjQzMyA9IDEyNy4wLjAuMSlcbiAgICBpZiAoREVDSU1BTF9JUF9SRUdFWC50ZXN0KGhvc3RuYW1lKSkge1xuICAgICAgY29uc3QgbnVtID0gcGFyc2VJbnQoaG9zdG5hbWUsIDEwKTtcbiAgICAgIGlmIChudW0gPj0gMCAmJiBudW0gPD0gNDI5NDk2NzI5NSkgeyAvLyBWYWxpZCBJUHY0IHJhbmdlXG4gICAgICAgIC8vIENvbnZlcnQgdG8gSVAgZm9ybWF0IGFuZCBjaGVjayBpZiBwcml2YXRlXG4gICAgICAgIGNvbnN0IGlwID0gWyhudW0gPj4+IDI0KSAmIDI1NSwgKG51bSA+Pj4gMTYpICYgMjU1LCAobnVtID4+PiA4KSAmIDI1NSwgbnVtICYgMjU1XS5qb2luKCcuJyk7XG4gICAgICAgIHJldHVybiB0aGlzLmlzUHJpdmF0ZUlQKGlwKTtcbiAgICAgIH1cbiAgICB9XG4gICAgXG4gICAgLy8gQ2hlY2sgZm9yIGhleCBlbmNvZGVkIElQcyAoZS5nLiwgMHg3ZjAwMDAwMSA9IDEyNy4wLjAuMSlcbiAgICBpZiAoSEVYX0lQX1JFR0VYLnRlc3QoaG9zdG5hbWUpKSB7XG4gICAgICBjb25zdCBudW0gPSBwYXJzZUludChob3N0bmFtZSwgMTYpO1xuICAgICAgaWYgKG51bSA+PSAwICYmIG51bSA8PSA0Mjk0OTY3Mjk1KSB7XG4gICAgICAgIGNvbnN0IGlwID0gWyhudW0gPj4+IDI0KSAmIDI1NSwgKG51bSA+Pj4gMTYpICYgMjU1LCAobnVtID4+PiA4KSAmIDI1NSwgbnVtICYgMjU1XS5qb2luKCcuJyk7XG4gICAgICAgIHJldHVybiB0aGlzLmlzUHJpdmF0ZUlQKGlwKTtcbiAgICAgIH1cbiAgICB9XG4gICAgXG4gICAgLy8gQ2hlY2sgZm9yIG9jdGFsIGVuY29kZWQgSVBzIChlLmcuLCAwMTc3MDAwMDAwMDEgPSAxMjcuMC4wLjEpXG4gICAgaWYgKE9DVEFMX0lQX1JFR0VYLnRlc3QoaG9zdG5hbWUpKSB7XG4gICAgICBjb25zdCBudW0gPSBwYXJzZUludChob3N0bmFtZSwgOCk7XG4gICAgICBpZiAobnVtID49IDAgJiYgbnVtIDw9IDQyOTQ5NjcyOTUpIHtcbiAgICAgICAgY29uc3QgaXAgPSBbKG51bSA+Pj4gMjQpICYgMjU1LCAobnVtID4+PiAxNikgJiAyNTUsIChudW0gPj4+IDgpICYgMjU1LCBudW0gJiAyNTVdLmpvaW4oJy4nKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuaXNQcml2YXRlSVAoaXApO1xuICAgICAgfVxuICAgIH1cbiAgICBcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbn1cblxuLyoqXG4gKiBWYWxpZGF0ZSBhbmQgc2FuaXRpemUgYSBmaWxlbmFtZVxuICovXG5leHBvcnQgZnVuY3Rpb24gdmFsaWRhdGVGaWxlbmFtZShmaWxlbmFtZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgaWYgKCFmaWxlbmFtZSB8fCB0eXBlb2YgZmlsZW5hbWUgIT09ICdzdHJpbmcnKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdGaWxlbmFtZSBtdXN0IGJlIGEgbm9uLWVtcHR5IHN0cmluZycpO1xuICB9XG4gIFxuICBpZiAoZmlsZW5hbWUubGVuZ3RoID4gU0VDVVJJVFlfTElNSVRTLk1BWF9GSUxFTkFNRV9MRU5HVEgpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYEZpbGVuYW1lIHRvbyBsb25nIChtYXggJHtTRUNVUklUWV9MSU1JVFMuTUFYX0ZJTEVOQU1FX0xFTkdUSH0gY2hhcmFjdGVycylgKTtcbiAgfVxuICBcbiAgLy8gUmVtb3ZlIGFueSBwYXRoIHNlcGFyYXRvcnMgYW5kIGRhbmdlcm91cyBjaGFyYWN0ZXJzXG4gIGNvbnN0IHNhbml0aXplZCA9IGZpbGVuYW1lLnJlcGxhY2UoRklMRU5BTUVfREFOR0VST1VTX1JFR0VYLCAnJykucmVwbGFjZShGSUxFTkFNRV9MRUFESU5HX0RPVFNfUkVHRVgsICcnKTtcbiAgXG4gIGlmICghUmVnZXhWYWxpZGF0b3IudmFsaWRhdGUoc2FuaXRpemVkLCBWQUxJREFUSU9OX1BBVFRFUk5TLlNBRkVfRklMRU5BTUUsIHsgbWF4TGVuZ3RoOiBTRUNVUklUWV9MSU1JVFMuTUFYX0ZJTEVOQU1FX0xFTkdUSCB9KSkge1xuICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBmaWxlbmFtZSBmb3JtYXQuIFVzZSBhbHBoYW51bWVyaWMgY2hhcmFjdGVycywgaHlwaGVucywgdW5kZXJzY29yZXMsIGFuZCBkb3RzIG9ubHkuJyk7XG4gIH1cbiAgXG4gIHJldHVybiBzYW5pdGl6ZWQ7XG59XG5cbi8qKlxuICogVmFsaWRhdGUgYW5kIHNhbml0aXplIGEgcGF0aFxuICovXG5leHBvcnQgZnVuY3Rpb24gdmFsaWRhdGVQYXRoKGlucHV0UGF0aDogc3RyaW5nLCBiYXNlRGlyPzogc3RyaW5nKTogc3RyaW5nIHtcbiAgaWYgKCFpbnB1dFBhdGggfHwgdHlwZW9mIGlucHV0UGF0aCAhPT0gJ3N0cmluZycpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ1BhdGggbXVzdCBiZSBhIG5vbi1lbXB0eSBzdHJpbmcnKTtcbiAgfVxuICBcbiAgLy8gSWYgYmFzZURpciBpcyBwcm92aWRlZCBhbmQgaW5wdXRQYXRoIGlzIGFic29sdXRlLCByZWplY3QgaXRcbiAgaWYgKGJhc2VEaXIgJiYgcGF0aC5pc0Fic29sdXRlKGlucHV0UGF0aCkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ0Fic29sdXRlIHBhdGhzIG5vdCBhbGxvd2VkIHdoZW4gYmFzZSBkaXJlY3RvcnkgaXMgc3BlY2lmaWVkJyk7XG4gIH1cbiAgXG4gIC8vIFJlbW92ZSBsZWFkaW5nL3RyYWlsaW5nIHNsYXNoZXMgYW5kIG5vcm1hbGl6ZVxuICAvLyBMZW5ndGggbGltaXRzIGFkZGVkIHRvIHByZXZlbnQgUmVEb1MgYXR0YWNrc1xuICBjb25zdCBub3JtYWxpemVkID0gaW5wdXRQYXRoLnJlcGxhY2UoUEFUSF9OT1JNQUxJWkVfUkVHRVgsICcnKS5yZXBsYWNlKFBBVEhfTVVMVElQTEVfU0xBU0hFU19SRUdFWCwgJy8nKTtcbiAgXG4gIGlmICghVkFMSURBVElPTl9QQVRURVJOUy5TQUZFX1BBVEgudGVzdChub3JtYWxpemVkKSkge1xuICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBwYXRoIGZvcm1hdC4gVXNlIGFscGhhbnVtZXJpYyBjaGFyYWN0ZXJzLCBoeXBoZW5zLCB1bmRlcnNjb3JlcywgZG90cywgYW5kIGZvcndhcmQgc2xhc2hlcyBvbmx5LicpO1xuICB9XG4gIFxuICAvLyBDaGVjayBmb3IgcGF0aCB0cmF2ZXJzYWwgYXR0ZW1wdHNcbiAgaWYgKG5vcm1hbGl6ZWQuaW5jbHVkZXMoJy4uJykgfHwgbm9ybWFsaXplZC5pbmNsdWRlcygnLi8nKSB8fCBub3JtYWxpemVkLmluY2x1ZGVzKCcvLicpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdQYXRoIHRyYXZlcnNhbCBub3QgYWxsb3dlZCcpO1xuICB9XG4gIFxuICAvLyBWYWxpZGF0ZSBwYXRoIGRlcHRoXG4gIGNvbnN0IGRlcHRoID0gbm9ybWFsaXplZC5zcGxpdCgnLycpLmxlbmd0aDtcbiAgaWYgKGRlcHRoID4gU0VDVVJJVFlfTElNSVRTLk1BWF9QQVRIX0RFUFRIKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBQYXRoIHRvbyBkZWVwIChtYXggJHtTRUNVUklUWV9MSU1JVFMuTUFYX1BBVEhfREVQVEh9IGxldmVscylgKTtcbiAgfVxuICBcbiAgLy8gSWYgYmFzZURpciBwcm92aWRlZCwgZW5zdXJlIHBhdGggaXMgd2l0aGluIGl0XG4gIGlmIChiYXNlRGlyKSB7XG4gICAgY29uc3QgcmVzb2x2ZWRQYXRoID0gcGF0aC5yZXNvbHZlKGJhc2VEaXIsIG5vcm1hbGl6ZWQpO1xuICAgIGNvbnN0IHJlc29sdmVkQmFzZSA9IHBhdGgucmVzb2x2ZShiYXNlRGlyKTtcbiAgICBcbiAgICBpZiAoIXJlc29sdmVkUGF0aC5zdGFydHNXaXRoKHJlc29sdmVkQmFzZSkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignUGF0aCB0cmF2ZXJzYWwgYXR0ZW1wdCBkZXRlY3RlZCcpO1xuICAgIH1cbiAgfVxuICBcbiAgcmV0dXJuIG5vcm1hbGl6ZWQ7XG59XG5cbi8qKlxuICogVmFsaWRhdGUgYW5kIHNhbml0aXplIGEgdXNlcm5hbWVcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHZhbGlkYXRlVXNlcm5hbWUodXNlcm5hbWU6IHN0cmluZyk6IHN0cmluZyB7XG4gIGlmICghdXNlcm5hbWUgfHwgdHlwZW9mIHVzZXJuYW1lICE9PSAnc3RyaW5nJykge1xuICAgIHRocm93IG5ldyBFcnJvcignVXNlcm5hbWUgbXVzdCBiZSBhIG5vbi1lbXB0eSBzdHJpbmcnKTtcbiAgfVxuICBcbiAgaWYgKCFWQUxJREFUSU9OX1BBVFRFUk5TLlNBRkVfVVNFUk5BTUUudGVzdCh1c2VybmFtZSkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgdXNlcm5hbWUgZm9ybWF0LiBVc2UgYWxwaGFudW1lcmljIGNoYXJhY3RlcnMsIGh5cGhlbnMsIHVuZGVyc2NvcmVzLCBhbmQgZG90cyBvbmx5LicpO1xuICB9XG4gIFxuICByZXR1cm4gdXNlcm5hbWUudG9Mb3dlckNhc2UoKTtcbn1cblxuLyoqXG4gKiBWYWxpZGF0ZSBhIGNhdGVnb3J5XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB2YWxpZGF0ZUNhdGVnb3J5KGNhdGVnb3J5OiBzdHJpbmcpOiBzdHJpbmcge1xuICBpZiAoIWNhdGVnb3J5IHx8IHR5cGVvZiBjYXRlZ29yeSAhPT0gJ3N0cmluZycpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ0NhdGVnb3J5IG11c3QgYmUgYSBub24tZW1wdHkgc3RyaW5nJyk7XG4gIH1cbiAgXG4gIGlmICghUmVnZXhWYWxpZGF0b3IudmFsaWRhdGUoY2F0ZWdvcnksIFZBTElEQVRJT05fUEFUVEVSTlMuU0FGRV9DQVRFR09SWSwgeyBtYXhMZW5ndGg6IDUwIH0pKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIGNhdGVnb3J5IGZvcm1hdC4gVXNlIGFscGhhYmV0aWMgY2hhcmFjdGVycywgaHlwaGVucywgYW5kIHVuZGVyc2NvcmVzIG9ubHkuJyk7XG4gIH1cbiAgXG4gIGNvbnN0IG5vcm1hbGl6ZWQgPSBjYXRlZ29yeS50b0xvd2VyQ2FzZSgpO1xuICBcbiAgaWYgKCFWQUxJRF9DQVRFR09SSUVTLmluY2x1ZGVzKG5vcm1hbGl6ZWQpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIGNhdGVnb3J5LiBNdXN0IGJlIG9uZSBvZjogJHtWQUxJRF9DQVRFR09SSUVTLmpvaW4oJywgJyl9YCk7XG4gIH1cbiAgXG4gIHJldHVybiBub3JtYWxpemVkO1xufVxuXG4vKipcbiAqIFZhbGlkYXRlIGNvbnRlbnQgc2l6ZVxuICovXG5leHBvcnQgZnVuY3Rpb24gdmFsaWRhdGVDb250ZW50U2l6ZShjb250ZW50OiBzdHJpbmcsIG1heFNpemU6IG51bWJlciA9IFNFQ1VSSVRZX0xJTUlUUy5NQVhfQ09OVEVOVF9MRU5HVEgpOiB2b2lkIHtcbiAgaWYgKCFjb250ZW50IHx8IHR5cGVvZiBjb250ZW50ICE9PSAnc3RyaW5nJykge1xuICAgIHRocm93IG5ldyBFcnJvcignQ29udGVudCBtdXN0IGJlIGEgbm9uLWVtcHR5IHN0cmluZycpO1xuICB9XG4gIFxuICBjb25zdCBzaXplQnl0ZXMgPSBCdWZmZXIuYnl0ZUxlbmd0aChjb250ZW50LCAndXRmOCcpO1xuICBpZiAoc2l6ZUJ5dGVzID4gbWF4U2l6ZSkge1xuICAgIHRocm93IG5ldyBFcnJvcihgQ29udGVudCB0b28gbGFyZ2UgKCR7c2l6ZUJ5dGVzfSBieXRlcywgbWF4ICR7bWF4U2l6ZX0gYnl0ZXMpYCk7XG4gIH1cbn1cblxuLyoqXG4gKiBDb21wcmVoZW5zaXZlIGlucHV0IHZhbGlkYXRpb24gYmVmb3JlIHBhdHRlcm4gbWF0Y2hpbmdcbiAqIFZhbGlkYXRlcyBhbGwgY29udGVudCB0eXBlcyB3aXRoIGFwcHJvcHJpYXRlIGxpbWl0c1xuICovXG5leHBvcnQgaW50ZXJmYWNlIENvbnRlbnRWYWxpZGF0aW9uT3B0aW9ucyB7XG4gIG1heENvbnRlbnRMZW5ndGg/OiBudW1iZXI7XG4gIG1heFlhbWxMZW5ndGg/OiBudW1iZXI7XG4gIG1heE1ldGFkYXRhRmllbGRMZW5ndGg/OiBudW1iZXI7XG4gIG1heEZpbGVTaXplPzogbnVtYmVyO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gdmFsaWRhdGVJbnB1dExlbmd0aHMoXG4gIGNvbnRlbnQ6IHN0cmluZyxcbiAgY29udGVudFR5cGU6ICdmdWxsJyB8ICd5YW1sJyB8ICdtZXRhZGF0YScgfCAnZmllbGQnLFxuICBvcHRpb25zOiBDb250ZW50VmFsaWRhdGlvbk9wdGlvbnMgPSB7fVxuKTogdm9pZCB7XG4gIGNvbnN0IGxpbWl0cyA9IHtcbiAgICBtYXhDb250ZW50TGVuZ3RoOiBvcHRpb25zLm1heENvbnRlbnRMZW5ndGggPz8gU0VDVVJJVFlfTElNSVRTLk1BWF9DT05URU5UX0xFTkdUSCxcbiAgICBtYXhZYW1sTGVuZ3RoOiBvcHRpb25zLm1heFlhbWxMZW5ndGggPz8gU0VDVVJJVFlfTElNSVRTLk1BWF9ZQU1MX0xFTkdUSCxcbiAgICBtYXhNZXRhZGF0YUZpZWxkTGVuZ3RoOiBvcHRpb25zLm1heE1ldGFkYXRhRmllbGRMZW5ndGggPz8gU0VDVVJJVFlfTElNSVRTLk1BWF9NRVRBREFUQV9GSUVMRF9MRU5HVEgsXG4gICAgbWF4RmlsZVNpemU6IG9wdGlvbnMubWF4RmlsZVNpemUgPz8gU0VDVVJJVFlfTElNSVRTLk1BWF9GSUxFX1NJWkVcbiAgfTtcblxuICAvLyBWYWxpZGF0ZSBiYXNlZCBvbiBjb250ZW50IHR5cGVcbiAgc3dpdGNoIChjb250ZW50VHlwZSkge1xuICAgIGNhc2UgJ2Z1bGwnOlxuICAgICAgaWYgKGNvbnRlbnQubGVuZ3RoID4gbGltaXRzLm1heENvbnRlbnRMZW5ndGgpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgIGBDb250ZW50IGV4Y2VlZHMgbWF4aW11bSBsZW5ndGggb2YgJHtsaW1pdHMubWF4Q29udGVudExlbmd0aH0gY2hhcmFjdGVycyAoJHtjb250ZW50Lmxlbmd0aH0gcHJvdmlkZWQpYFxuICAgICAgICApO1xuICAgICAgfVxuICAgICAgYnJlYWs7XG4gICAgXG4gICAgY2FzZSAneWFtbCc6XG4gICAgICBpZiAoY29udGVudC5sZW5ndGggPiBsaW1pdHMubWF4WWFtbExlbmd0aCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgYFlBTUwgY29udGVudCBleGNlZWRzIG1heGltdW0gbGVuZ3RoIG9mICR7bGltaXRzLm1heFlhbWxMZW5ndGh9IGNoYXJhY3RlcnMgKCR7Y29udGVudC5sZW5ndGh9IHByb3ZpZGVkKWBcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIGJyZWFrO1xuICAgIFxuICAgIGNhc2UgJ21ldGFkYXRhJzpcbiAgICAgIC8vIEZvciBtZXRhZGF0YSwgY2hlY2sgb3ZlcmFsbCBzaXplXG4gICAgICBpZiAoY29udGVudC5sZW5ndGggPiBsaW1pdHMubWF4WWFtbExlbmd0aCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgYE1ldGFkYXRhIGV4Y2VlZHMgbWF4aW11bSBsZW5ndGggb2YgJHtsaW1pdHMubWF4WWFtbExlbmd0aH0gY2hhcmFjdGVycyAoJHtjb250ZW50Lmxlbmd0aH0gcHJvdmlkZWQpYFxuICAgICAgICApO1xuICAgICAgfVxuICAgICAgYnJlYWs7XG4gICAgXG4gICAgY2FzZSAnZmllbGQnOlxuICAgICAgaWYgKGNvbnRlbnQubGVuZ3RoID4gbGltaXRzLm1heE1ldGFkYXRhRmllbGRMZW5ndGgpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgIGBGaWVsZCBleGNlZWRzIG1heGltdW0gbGVuZ3RoIG9mICR7bGltaXRzLm1heE1ldGFkYXRhRmllbGRMZW5ndGh9IGNoYXJhY3RlcnMgKCR7Y29udGVudC5sZW5ndGh9IHByb3ZpZGVkKWBcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIGJyZWFrO1xuICB9XG59XG5cbi8qKlxuICogR2VuZXJhbCBpbnB1dCBzYW5pdGl6YXRpb25cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNhbml0aXplSW5wdXQoaW5wdXQ6IHN0cmluZywgbWF4TGVuZ3RoOiBudW1iZXIgPSAxMDAwKTogc3RyaW5nIHtcbiAgaWYgKCFpbnB1dCB8fCB0eXBlb2YgaW5wdXQgIT09ICdzdHJpbmcnKSB7XG4gICAgcmV0dXJuICcnO1xuICB9XG4gIFxuICAvLyBSZW1vdmUgcG90ZW50aWFsbHkgZGFuZ2Vyb3VzIGNoYXJhY3RlcnMgYW5kIGxpbWl0IGxlbmd0aFxuICByZXR1cm4gaW5wdXRcbiAgICAucmVwbGFjZShDT05UUk9MX0NIQVJTX1JFR0VYLCAnJykgLy8gUmVtb3ZlIGNvbnRyb2wgY2hhcmFjdGVyc1xuICAgIC5yZXBsYWNlKEhUTUxfREFOR0VST1VTX1JFR0VYLCAnJykgLy8gUmVtb3ZlIEhUTUwtZGFuZ2Vyb3VzIGNoYXJhY3RlcnNcbiAgICAucmVwbGFjZShTSEVMTF9NRVRBQ0hBUl9SRUdFWCwgJycpIC8vIFJlbW92ZSBzaGVsbCBtZXRhY2hhcmFjdGVycyAoZXhwYW5kZWQpXG4gICAgLnJlcGxhY2UoUlRMX1pFUk9XSURUSF9SRUdFWCwgJycpIC8vIFJlbW92ZSBSVEwgb3ZlcnJpZGUgYW5kIHplcm8td2lkdGggY2hhcnNcbiAgICAuc3Vic3RyaW5nKDAsIG1heExlbmd0aClcbiAgICAudHJpbSgpO1xufSJdfQ==
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Security Auditor - Core orchestrator for security scanning
|
|
3
|
+
* Implements automated security auditing for DollhouseMCP (Issue #53)
|
|
4
|
+
*/
|
|
5
|
+
import type { SecurityAuditConfig, ScanResult } from './types.js';
|
|
6
|
+
export declare class SecurityAuditor {
|
|
7
|
+
private config;
|
|
8
|
+
private scanners;
|
|
9
|
+
private suppressions;
|
|
10
|
+
constructor(config: SecurityAuditConfig);
|
|
11
|
+
/**
|
|
12
|
+
* Initialize enabled scanners based on configuration
|
|
13
|
+
*/
|
|
14
|
+
private initializeScanners;
|
|
15
|
+
/**
|
|
16
|
+
* Load suppression rules from configuration
|
|
17
|
+
*/
|
|
18
|
+
private loadSuppressions;
|
|
19
|
+
/**
|
|
20
|
+
* Run security audit on the project
|
|
21
|
+
*/
|
|
22
|
+
audit(projectRoot?: string): Promise<ScanResult>;
|
|
23
|
+
/**
|
|
24
|
+
* Filter out suppressed findings
|
|
25
|
+
*/
|
|
26
|
+
private filterSuppressions;
|
|
27
|
+
/**
|
|
28
|
+
* Create scan result summary
|
|
29
|
+
*/
|
|
30
|
+
private createScanResult;
|
|
31
|
+
/**
|
|
32
|
+
* Generate reports in configured formats
|
|
33
|
+
*/
|
|
34
|
+
private generateReports;
|
|
35
|
+
/**
|
|
36
|
+
* Determine if the build should fail based on findings
|
|
37
|
+
*/
|
|
38
|
+
private shouldFailBuild;
|
|
39
|
+
/**
|
|
40
|
+
* Get default configuration
|
|
41
|
+
*/
|
|
42
|
+
static getDefaultConfig(): SecurityAuditConfig;
|
|
43
|
+
}
|
|
44
|
+
//# sourceMappingURL=SecurityAuditor.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SecurityAuditor.d.ts","sourceRoot":"","sources":["../../../../../src/security/audit/SecurityAuditor.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,KAAK,EACV,mBAAmB,EAEnB,UAAU,EAIX,MAAM,YAAY,CAAC;AAWpB,qBAAa,eAAe;IAC1B,OAAO,CAAC,MAAM,CAAsB;IACpC,OAAO,CAAC,QAAQ,CAAyB;IACzC,OAAO,CAAC,YAAY,CAAuC;gBAE/C,MAAM,EAAE,mBAAmB;IAMvC;;OAEG;IACH,OAAO,CAAC,kBAAkB;IAiB1B;;OAEG;IACH,OAAO,CAAC,gBAAgB;IAYxB;;OAEG;IACG,KAAK,CAAC,WAAW,GAAE,MAAsB,GAAG,OAAO,CAAC,UAAU,CAAC;IA6CrE;;OAEG;IACH,OAAO,CAAC,kBAAkB;IAkE1B;;OAEG;IACH,OAAO,CAAC,gBAAgB;IAsCxB;;OAEG;YACW,eAAe;IA6B7B;;OAEG;IACH,OAAO,CAAC,eAAe;IAoBvB;;OAEG;IACH,MAAM,CAAC,gBAAgB,IAAI,mBAAmB;CAmC/C"}
|