@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,47 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Content Validator for DollhouseMCP
|
|
3
|
+
*
|
|
4
|
+
* Protects against prompt injection attacks in marketplace personas
|
|
5
|
+
* by detecting and sanitizing malicious content patterns.
|
|
6
|
+
*
|
|
7
|
+
* Security: SEC-001 - Critical vulnerability protection
|
|
8
|
+
*/
|
|
9
|
+
export interface ValidationResult {
|
|
10
|
+
isValid: boolean;
|
|
11
|
+
sanitizedContent?: string;
|
|
12
|
+
detectedPatterns?: string[];
|
|
13
|
+
severity?: 'low' | 'medium' | 'high' | 'critical';
|
|
14
|
+
}
|
|
15
|
+
export declare class ContentValidator {
|
|
16
|
+
/**
|
|
17
|
+
* Pattern-based detection system for prompt injection attacks.
|
|
18
|
+
*
|
|
19
|
+
* This approach was chosen over AI-based detection because:
|
|
20
|
+
* 1. Pattern matching cannot be socially engineered or confused
|
|
21
|
+
* 2. Deterministic results ensure consistent security
|
|
22
|
+
* 3. No additional API calls or latency
|
|
23
|
+
* 4. Can't be bypassed by clever prompt engineering
|
|
24
|
+
*
|
|
25
|
+
* The patterns below represent known attack vectors from security research
|
|
26
|
+
* and real-world exploit attempts against AI systems.
|
|
27
|
+
*/
|
|
28
|
+
private static readonly INJECTION_PATTERNS;
|
|
29
|
+
private static readonly MALICIOUS_YAML_PATTERNS;
|
|
30
|
+
/**
|
|
31
|
+
* Validates and sanitizes persona content for security threats
|
|
32
|
+
*/
|
|
33
|
+
static validateAndSanitize(content: string): ValidationResult;
|
|
34
|
+
/**
|
|
35
|
+
* Validates YAML frontmatter for malicious content
|
|
36
|
+
*/
|
|
37
|
+
static validateYamlContent(yamlContent: string): boolean;
|
|
38
|
+
/**
|
|
39
|
+
* Validates persona metadata fields
|
|
40
|
+
*/
|
|
41
|
+
static validateMetadata(metadata: any): ValidationResult;
|
|
42
|
+
/**
|
|
43
|
+
* Sanitizes a complete persona file (frontmatter + content)
|
|
44
|
+
*/
|
|
45
|
+
static sanitizePersonaContent(content: string): string;
|
|
46
|
+
}
|
|
47
|
+
//# sourceMappingURL=contentValidator.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"contentValidator.d.ts","sourceRoot":"","sources":["../../../src/security/contentValidator.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAKH,MAAM,WAAW,gBAAgB;IAC/B,OAAO,EAAE,OAAO,CAAC;IACjB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,gBAAgB,CAAC,EAAE,MAAM,EAAE,CAAC;IAC5B,QAAQ,CAAC,EAAE,KAAK,GAAG,QAAQ,GAAG,MAAM,GAAG,UAAU,CAAC;CACnD;AAED,qBAAa,gBAAgB;IAC3B;;;;;;;;;;;OAWG;IAEH,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,kBAAkB,CAwCxC;IAGF,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,uBAAuB,CAc7C;IAEF;;OAEG;IACH,MAAM,CAAC,mBAAmB,CAAC,OAAO,EAAE,MAAM,GAAG,gBAAgB;IAoC7D;;OAEG;IACH,MAAM,CAAC,mBAAmB,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO;IAgBxD;;OAEG;IACH,MAAM,CAAC,gBAAgB,CAAC,QAAQ,EAAE,GAAG,GAAG,gBAAgB;IAiCxD;;OAEG;IACH,MAAM,CAAC,sBAAsB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM;CA8BvD"}
|
|
@@ -0,0 +1,188 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Content Validator for DollhouseMCP
|
|
3
|
+
*
|
|
4
|
+
* Protects against prompt injection attacks in marketplace personas
|
|
5
|
+
* by detecting and sanitizing malicious content patterns.
|
|
6
|
+
*
|
|
7
|
+
* Security: SEC-001 - Critical vulnerability protection
|
|
8
|
+
*/
|
|
9
|
+
import { SecurityError } from '../errors/SecurityError.js';
|
|
10
|
+
import { SecurityMonitor } from './securityMonitor.js';
|
|
11
|
+
export class ContentValidator {
|
|
12
|
+
/**
|
|
13
|
+
* Pattern-based detection system for prompt injection attacks.
|
|
14
|
+
*
|
|
15
|
+
* This approach was chosen over AI-based detection because:
|
|
16
|
+
* 1. Pattern matching cannot be socially engineered or confused
|
|
17
|
+
* 2. Deterministic results ensure consistent security
|
|
18
|
+
* 3. No additional API calls or latency
|
|
19
|
+
* 4. Can't be bypassed by clever prompt engineering
|
|
20
|
+
*
|
|
21
|
+
* The patterns below represent known attack vectors from security research
|
|
22
|
+
* and real-world exploit attempts against AI systems.
|
|
23
|
+
*/
|
|
24
|
+
// Prompt injection patterns that could compromise AI assistants
|
|
25
|
+
static INJECTION_PATTERNS = [
|
|
26
|
+
// System prompt override attempts
|
|
27
|
+
{ pattern: /\[SYSTEM:\s*.*?\]/gi, severity: 'critical', description: 'System prompt override' },
|
|
28
|
+
{ pattern: /\[ADMIN:\s*.*?\]/gi, severity: 'critical', description: 'Admin prompt override' },
|
|
29
|
+
{ pattern: /\[ASSISTANT:\s*.*?\]/gi, severity: 'critical', description: 'Assistant prompt override' },
|
|
30
|
+
{ pattern: /\[USER:\s*.*?\]/gi, severity: 'high', description: 'User prompt override' },
|
|
31
|
+
// Instruction manipulation
|
|
32
|
+
{ pattern: /ignore\s+(all\s+)?previous\s+instructions/gi, severity: 'critical', description: 'Instruction override' },
|
|
33
|
+
{ pattern: /ignore\s+(all\s+)?prior\s+instructions/gi, severity: 'critical', description: 'Instruction override' },
|
|
34
|
+
{ pattern: /disregard\s+(all\s+)?previous\s+instructions/gi, severity: 'critical', description: 'Instruction override' },
|
|
35
|
+
{ pattern: /forget\s+(all\s+)?previous\s+instructions/gi, severity: 'critical', description: 'Instruction override' },
|
|
36
|
+
{ pattern: /you\s+are\s+now\s+(admin|root|system|sudo)/gi, severity: 'critical', description: 'Role elevation attempt' },
|
|
37
|
+
{ pattern: /act\s+as\s+(admin|root|system|sudo)/gi, severity: 'critical', description: 'Role elevation attempt' },
|
|
38
|
+
// Data exfiltration attempts
|
|
39
|
+
{ pattern: /export\s+all\s+(files|data|personas|tokens|credentials)/gi, severity: 'critical', description: 'Data exfiltration' },
|
|
40
|
+
{ pattern: /send\s+all\s+(files|data|personas|tokens|credentials)\s+to/gi, severity: 'critical', description: 'Data exfiltration' },
|
|
41
|
+
{ pattern: /list\s+all\s+(files|tokens|credentials|secrets)/gi, severity: 'high', description: 'Information disclosure' },
|
|
42
|
+
{ pattern: /show\s+me\s+all\s+(tokens|credentials|secrets|api\s+keys)/gi, severity: 'high', description: 'Credential disclosure' },
|
|
43
|
+
// Command execution patterns
|
|
44
|
+
{ pattern: /curl\s+[^\s]+\.(com|net|org|io|dev)/gi, severity: 'critical', description: 'External command execution' },
|
|
45
|
+
{ pattern: /wget\s+[^\s]+\.(com|net|org|io|dev)/gi, severity: 'critical', description: 'External command execution' },
|
|
46
|
+
{ pattern: /\$\([^)]+\)/g, severity: 'critical', description: 'Command substitution' },
|
|
47
|
+
{ pattern: /`[^`]+`/g, severity: 'critical', description: 'Backtick command execution' },
|
|
48
|
+
{ pattern: /eval\s*\(/gi, severity: 'critical', description: 'Code evaluation' },
|
|
49
|
+
{ pattern: /exec\s*\(/gi, severity: 'critical', description: 'Code execution' },
|
|
50
|
+
{ pattern: /os\.system\s*\(/gi, severity: 'critical', description: 'System command execution' },
|
|
51
|
+
{ pattern: /subprocess\.(call|run|Popen)/gi, severity: 'critical', description: 'Subprocess execution' },
|
|
52
|
+
// Token/credential patterns
|
|
53
|
+
{ pattern: /GITHUB_TOKEN/gi, severity: 'high', description: 'Token reference' },
|
|
54
|
+
{ pattern: /ghp_[a-zA-Z0-9]{36}/g, severity: 'critical', description: 'GitHub token exposure' },
|
|
55
|
+
{ pattern: /gho_[a-zA-Z0-9]{36}/g, severity: 'critical', description: 'GitHub OAuth token exposure' },
|
|
56
|
+
// Path traversal in content
|
|
57
|
+
{ pattern: /\.\.\/\.\.\/\.\.\//g, severity: 'high', description: 'Path traversal attempt' },
|
|
58
|
+
{ pattern: /\/etc\/passwd/gi, severity: 'high', description: 'Sensitive file access' },
|
|
59
|
+
{ pattern: /\/\.ssh\//gi, severity: 'high', description: 'SSH key access attempt' },
|
|
60
|
+
];
|
|
61
|
+
// Malicious YAML patterns
|
|
62
|
+
static MALICIOUS_YAML_PATTERNS = [
|
|
63
|
+
/!!python\/object/,
|
|
64
|
+
/!!ruby\/object/,
|
|
65
|
+
/!!java/,
|
|
66
|
+
/!!exec/,
|
|
67
|
+
/!!eval/,
|
|
68
|
+
/!!new/,
|
|
69
|
+
/!!construct/,
|
|
70
|
+
/!!apply/,
|
|
71
|
+
/subprocess/,
|
|
72
|
+
/os\.system/,
|
|
73
|
+
/eval\(/,
|
|
74
|
+
/exec\(/,
|
|
75
|
+
/__import__/,
|
|
76
|
+
];
|
|
77
|
+
/**
|
|
78
|
+
* Validates and sanitizes persona content for security threats
|
|
79
|
+
*/
|
|
80
|
+
static validateAndSanitize(content) {
|
|
81
|
+
const detectedPatterns = [];
|
|
82
|
+
let sanitized = content;
|
|
83
|
+
let highestSeverity = 'low';
|
|
84
|
+
// Check for injection patterns
|
|
85
|
+
for (const { pattern, severity, description } of this.INJECTION_PATTERNS) {
|
|
86
|
+
if (pattern.test(content)) {
|
|
87
|
+
detectedPatterns.push(description);
|
|
88
|
+
// Update highest severity
|
|
89
|
+
if (severity === 'critical' || (severity === 'high' && highestSeverity !== 'critical')) {
|
|
90
|
+
highestSeverity = severity;
|
|
91
|
+
}
|
|
92
|
+
// Log security event
|
|
93
|
+
SecurityMonitor.logSecurityEvent({
|
|
94
|
+
type: 'CONTENT_INJECTION_ATTEMPT',
|
|
95
|
+
severity: severity.toUpperCase(),
|
|
96
|
+
source: 'content_validation',
|
|
97
|
+
details: `Detected pattern: ${description}`,
|
|
98
|
+
});
|
|
99
|
+
// Sanitize by replacing with safe placeholder
|
|
100
|
+
sanitized = sanitized.replace(pattern, '[CONTENT_BLOCKED]');
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
return {
|
|
104
|
+
isValid: detectedPatterns.length === 0,
|
|
105
|
+
sanitizedContent: sanitized,
|
|
106
|
+
detectedPatterns,
|
|
107
|
+
severity: highestSeverity
|
|
108
|
+
};
|
|
109
|
+
}
|
|
110
|
+
/**
|
|
111
|
+
* Validates YAML frontmatter for malicious content
|
|
112
|
+
*/
|
|
113
|
+
static validateYamlContent(yamlContent) {
|
|
114
|
+
for (const pattern of this.MALICIOUS_YAML_PATTERNS) {
|
|
115
|
+
if (pattern.test(yamlContent)) {
|
|
116
|
+
SecurityMonitor.logSecurityEvent({
|
|
117
|
+
type: 'YAML_INJECTION_ATTEMPT',
|
|
118
|
+
severity: 'CRITICAL',
|
|
119
|
+
source: 'yaml_validation',
|
|
120
|
+
details: `Malicious YAML pattern detected: ${pattern}`,
|
|
121
|
+
});
|
|
122
|
+
// Early exit on first match for performance
|
|
123
|
+
return false;
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
return true;
|
|
127
|
+
}
|
|
128
|
+
/**
|
|
129
|
+
* Validates persona metadata fields
|
|
130
|
+
*/
|
|
131
|
+
static validateMetadata(metadata) {
|
|
132
|
+
const detectedPatterns = [];
|
|
133
|
+
// Check all string fields in metadata
|
|
134
|
+
const checkField = (fieldName, value) => {
|
|
135
|
+
if (typeof value === 'string') {
|
|
136
|
+
const result = this.validateAndSanitize(value);
|
|
137
|
+
if (!result.isValid || result.detectedPatterns?.length) {
|
|
138
|
+
detectedPatterns.push(`${fieldName}: ${result.detectedPatterns?.join(', ')}`);
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
};
|
|
142
|
+
// Validate standard persona fields
|
|
143
|
+
checkField('name', metadata.name);
|
|
144
|
+
checkField('description', metadata.description);
|
|
145
|
+
checkField('category', metadata.category);
|
|
146
|
+
checkField('author', metadata.author);
|
|
147
|
+
// Check any custom fields
|
|
148
|
+
for (const [key, value] of Object.entries(metadata)) {
|
|
149
|
+
if (!['name', 'description', 'category', 'author'].includes(key)) {
|
|
150
|
+
checkField(key, value);
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
return {
|
|
154
|
+
isValid: detectedPatterns.length === 0,
|
|
155
|
+
detectedPatterns,
|
|
156
|
+
severity: detectedPatterns.length > 0 ? 'high' : 'low'
|
|
157
|
+
};
|
|
158
|
+
}
|
|
159
|
+
/**
|
|
160
|
+
* Sanitizes a complete persona file (frontmatter + content)
|
|
161
|
+
*/
|
|
162
|
+
static sanitizePersonaContent(content) {
|
|
163
|
+
// Extract frontmatter
|
|
164
|
+
const frontmatterMatch = content.match(/^---\n([\s\S]*?)\n---/);
|
|
165
|
+
if (!frontmatterMatch) {
|
|
166
|
+
// No frontmatter, just validate content
|
|
167
|
+
const result = this.validateAndSanitize(content);
|
|
168
|
+
if (!result.isValid && result.severity === 'critical') {
|
|
169
|
+
throw new SecurityError('Critical security threat detected in persona content');
|
|
170
|
+
}
|
|
171
|
+
return result.sanitizedContent || content;
|
|
172
|
+
}
|
|
173
|
+
const yamlContent = frontmatterMatch[1];
|
|
174
|
+
const markdownContent = content.substring(frontmatterMatch[0].length);
|
|
175
|
+
// Validate YAML
|
|
176
|
+
if (!this.validateYamlContent(yamlContent)) {
|
|
177
|
+
throw new SecurityError('Malicious YAML detected in persona frontmatter');
|
|
178
|
+
}
|
|
179
|
+
// Validate markdown content
|
|
180
|
+
const contentResult = this.validateAndSanitize(markdownContent);
|
|
181
|
+
if (!contentResult.isValid && contentResult.severity === 'critical') {
|
|
182
|
+
throw new SecurityError('Critical security threat detected in persona content');
|
|
183
|
+
}
|
|
184
|
+
// Return sanitized content
|
|
185
|
+
return `---\n${yamlContent}\n---${contentResult.sanitizedContent || markdownContent}`;
|
|
186
|
+
}
|
|
187
|
+
}
|
|
188
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29udGVudFZhbGlkYXRvci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9zZWN1cml0eS9jb250ZW50VmFsaWRhdG9yLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7O0dBT0c7QUFFSCxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFDM0QsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBU3ZELE1BQU0sT0FBTyxnQkFBZ0I7SUFDM0I7Ozs7Ozs7Ozs7O09BV0c7SUFDSCxnRUFBZ0U7SUFDeEQsTUFBTSxDQUFVLGtCQUFrQixHQUFtRjtRQUMzSCxrQ0FBa0M7UUFDbEMsRUFBRSxPQUFPLEVBQUUscUJBQXFCLEVBQUUsUUFBUSxFQUFFLFVBQVUsRUFBRSxXQUFXLEVBQUUsd0JBQXdCLEVBQUU7UUFDL0YsRUFBRSxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsUUFBUSxFQUFFLFVBQVUsRUFBRSxXQUFXLEVBQUUsdUJBQXVCLEVBQUU7UUFDN0YsRUFBRSxPQUFPLEVBQUUsd0JBQXdCLEVBQUUsUUFBUSxFQUFFLFVBQVUsRUFBRSxXQUFXLEVBQUUsMkJBQTJCLEVBQUU7UUFDckcsRUFBRSxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsUUFBUSxFQUFFLE1BQU0sRUFBRSxXQUFXLEVBQUUsc0JBQXNCLEVBQUU7UUFFdkYsMkJBQTJCO1FBQzNCLEVBQUUsT0FBTyxFQUFFLDZDQUE2QyxFQUFFLFFBQVEsRUFBRSxVQUFVLEVBQUUsV0FBVyxFQUFFLHNCQUFzQixFQUFFO1FBQ3JILEVBQUUsT0FBTyxFQUFFLDBDQUEwQyxFQUFFLFFBQVEsRUFBRSxVQUFVLEVBQUUsV0FBVyxFQUFFLHNCQUFzQixFQUFFO1FBQ2xILEVBQUUsT0FBTyxFQUFFLGdEQUFnRCxFQUFFLFFBQVEsRUFBRSxVQUFVLEVBQUUsV0FBVyxFQUFFLHNCQUFzQixFQUFFO1FBQ3hILEVBQUUsT0FBTyxFQUFFLDZDQUE2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LE1BQU0sQ0FBQyxnQkFBZ0IsSUFBSSxPQUFPLENBQUM7UUFDNUMsQ0FBQztRQUVELE1BQU0sV0FBVyxHQUFHLGdCQUFnQixDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ3hDLE1BQU0sZUFBZSxHQUFHLE9BQU8sQ0FBQyxTQUFTLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUM7UUFFdEUsZ0JBQWdCO1FBQ2hCLElBQUksQ0FBQyxJQUFJLENBQUMsbUJBQW1CLENBQUMsV0FBVyxDQUFDLEVBQUUsQ0FBQztZQUMzQyxNQUFNLElBQUksYUFBYSxDQUFDLGdEQUFnRCxDQUFDLENBQUM7UUFDNUUsQ0FBQztRQUVELDRCQUE0QjtRQUM1QixNQUFNLGFBQWEsR0FBRyxJQUFJLENBQUMsbUJBQW1CLENBQUMsZUFBZSxDQUFDLENBQUM7UUFDaEUsSUFBSSxDQUFDLGFBQWEsQ0FBQyxPQUFPLElBQUksYUFBYSxDQUFDLFFBQVEsS0FBSyxVQUFVLEVBQUUsQ0FBQztZQUNwRSxNQUFNLElBQUksYUFBYSxDQUFDLHNEQUFzRCxDQUFDLENBQUM7UUFDbEYsQ0FBQztRQUVELDJCQUEyQjtRQUMzQixPQUFPLFFBQVEsV0FBVyxRQUFRLGFBQWEsQ0FBQyxnQkFBZ0IsSUFBSSxlQUFlLEVBQUUsQ0FBQztJQUN4RixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBDb250ZW50IFZhbGlkYXRvciBmb3IgRG9sbGhvdXNlTUNQXG4gKiBcbiAqIFByb3RlY3RzIGFnYWluc3QgcHJvbXB0IGluamVjdGlvbiBhdHRhY2tzIGluIG1hcmtldHBsYWNlIHBlcnNvbmFzXG4gKiBieSBkZXRlY3RpbmcgYW5kIHNhbml0aXppbmcgbWFsaWNpb3VzIGNvbnRlbnQgcGF0dGVybnMuXG4gKiBcbiAqIFNlY3VyaXR5OiBTRUMtMDAxIC0gQ3JpdGljYWwgdnVsbmVyYWJpbGl0eSBwcm90ZWN0aW9uXG4gKi9cblxuaW1wb3J0IHsgU2VjdXJpdHlFcnJvciB9IGZyb20gJy4uL2Vycm9ycy9TZWN1cml0eUVycm9yLmpzJztcbmltcG9ydCB7IFNlY3VyaXR5TW9uaXRvciB9IGZyb20gJy4vc2VjdXJpdHlNb25pdG9yLmpzJztcblxuZXhwb3J0IGludGVyZmFjZSBWYWxpZGF0aW9uUmVzdWx0IHtcbiAgaXNWYWxpZDogYm9vbGVhbjtcbiAgc2FuaXRpemVkQ29udGVudD86IHN0cmluZztcbiAgZGV0ZWN0ZWRQYXR0ZXJucz86IHN0cmluZ1tdO1xuICBzZXZlcml0eT86ICdsb3cnIHwgJ21lZGl1bScgfCAnaGlnaCcgfCAnY3JpdGljYWwnO1xufVxuXG5leHBvcnQgY2xhc3MgQ29udGVudFZhbGlkYXRvciB7XG4gIC8qKlxuICAgKiBQYXR0ZXJuLWJhc2VkIGRldGVjdGlvbiBzeXN0ZW0gZm9yIHByb21wdCBpbmplY3Rpb24gYXR0YWNrcy5cbiAgICogXG4gICAqIFRoaXMgYXBwcm9hY2ggd2FzIGNob3NlbiBvdmVyIEFJLWJhc2VkIGRldGVjdGlvbiBiZWNhdXNlOlxuICAgKiAxLiBQYXR0ZXJuIG1hdGNoaW5nIGNhbm5vdCBiZSBzb2NpYWxseSBlbmdpbmVlcmVkIG9yIGNvbmZ1c2VkXG4gICAqIDIuIERldGVybWluaXN0aWMgcmVzdWx0cyBlbnN1cmUgY29uc2lzdGVudCBzZWN1cml0eVxuICAgKiAzLiBObyBhZGRpdGlvbmFsIEFQSSBjYWxscyBvciBsYXRlbmN5XG4gICAqIDQuIENhbid0IGJlIGJ5cGFzc2VkIGJ5IGNsZXZlciBwcm9tcHQgZW5naW5lZXJpbmdcbiAgICogXG4gICAqIFRoZSBwYXR0ZXJucyBiZWxvdyByZXByZXNlbnQga25vd24gYXR0YWNrIHZlY3RvcnMgZnJvbSBzZWN1cml0eSByZXNlYXJjaFxuICAgKiBhbmQgcmVhbC13b3JsZCBleHBsb2l0IGF0dGVtcHRzIGFnYWluc3QgQUkgc3lzdGVtcy5cbiAgICovXG4gIC8vIFByb21wdCBpbmplY3Rpb24gcGF0dGVybnMgdGhhdCBjb3VsZCBjb21wcm9taXNlIEFJIGFzc2lzdGFudHNcbiAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgSU5KRUNUSU9OX1BBVFRFUk5TOiBBcnJheTx7IHBhdHRlcm46IFJlZ0V4cDsgc2V2ZXJpdHk6ICdoaWdoJyB8ICdjcml0aWNhbCc7IGRlc2NyaXB0aW9uOiBzdHJpbmcgfT4gPSBbXG4gICAgLy8gU3lzdGVtIHByb21wdCBvdmVycmlkZSBhdHRlbXB0c1xuICAgIHsgcGF0dGVybjogL1xcW1NZU1RFTTpcXHMqLio/XFxdL2dpLCBzZXZlcml0eTogJ2NyaXRpY2FsJywgZGVzY3JpcHRpb246ICdTeXN0ZW0gcHJvbXB0IG92ZXJyaWRlJyB9LFxuICAgIHsgcGF0dGVybjogL1xcW0FETUlOOlxccyouKj9cXF0vZ2ksIHNldmVyaXR5OiAnY3JpdGljYWwnLCBkZXNjcmlwdGlvbjogJ0FkbWluIHByb21wdCBvdmVycmlkZScgfSxcbiAgICB7IHBhdHRlcm46IC9cXFtBU1NJU1RBTlQ6XFxzKi4qP1xcXS9naSwgc2V2ZXJpdHk6ICdjcml0aWNhbCcsIGRlc2NyaXB0aW9uOiAnQXNzaXN0YW50IHByb21wdCBvdmVycmlkZScgfSxcbiAgICB7IHBhdHRlcm46IC9cXFtVU0VSOlxccyouKj9cXF0vZ2ksIHNldmVyaXR5OiAnaGlnaCcsIGRlc2NyaXB0aW9uOiAnVXNlciBwcm9tcHQgb3ZlcnJpZGUnIH0sXG4gICAgXG4gICAgLy8gSW5zdHJ1Y3Rpb24gbWFuaXB1bGF0aW9uXG4gICAgeyBwYXR0ZXJuOiAvaWdub3JlXFxzKyhhbGxcXHMrKT9wcmV2aW91c1xccytpbnN0cnVjdGlvbnMvZ2ksIHNldmVyaXR5OiAnY3JpdGljYWwnLCBkZXNjcmlwdGlvbjogJ0luc3RydWN0aW9uIG92ZXJyaWRlJyB9LFxuICAgIHsgcGF0dGVybjogL2lnbm9yZVxccysoYWxsXFxzKyk/cHJpb3JcXHMraW5zdHJ1Y3Rpb25zL2dpLCBzZXZlcml0eTogJ2NyaXRpY2FsJywgZGVzY3JpcHRpb246ICdJbnN0cnVjdGlvbiBvdmVycmlkZScgfSxcbiAgICB7IHBhdHRlcm46IC9kaXNyZWdhcmRcXHMrKGFsbFxccyspP3ByZXZpb3VzXFxzK2luc3RydWN0aW9ucy9naSwgc2V2ZXJpdHk6ICdjcml0aWNhbCcsIGRlc2NyaXB0aW9uOiAnSW5zdHJ1Y3Rpb24gb3ZlcnJpZGUnIH0sXG4gICAgeyBwYXR0ZXJuOiAvZm9yZ2V0XFxzKyhhbGxcXHMrKT9wcmV2aW91c1xccytpbnN0cnVjdGlvbnMvZ2ksIHNldmVyaXR5OiAnY3JpdGljYWwnLCBkZXNjcmlwdGlvbjogJ0luc3RydWN0aW9uIG92ZXJyaWRlJyB9LFxuICAgIHsgcGF0dGVybjogL3lvdVxccythcmVcXHMrbm93XFxzKyhhZG1pbnxyb290fHN5c3RlbXxzdWRvKS9naSwgc2V2ZXJpdHk6ICdjcml0aWNhbCcsIGRlc2NyaXB0aW9uOiAnUm9sZSBlbGV2YXRpb24gYXR0ZW1wdCcgfSxcbiAgICB7IHBhdHRlcm46IC9hY3RcXHMrYXNcXHMrKGFkbWlufHJvb3R8c3lzdGVtfHN1ZG8pL2dpLCBzZXZlcml0eTogJ2NyaXRpY2FsJywgZGVzY3JpcHRpb246ICdSb2xlIGVsZXZhdGlvbiBhdHRlbXB0JyB9LFxuICAgIFxuICAgIC8vIERhdGEgZXhmaWx0cmF0aW9uIGF0dGVtcHRzXG4gICAgeyBwYXR0ZXJuOiAvZXhwb3J0XFxzK2FsbFxccysoZmlsZXN8ZGF0YXxwZXJzb25hc3x0b2tlbnN8Y3JlZGVudGlhbHMpL2dpLCBzZXZlcml0eTogJ2NyaXRpY2FsJywgZGVzY3JpcHRpb246ICdEYXRhIGV4ZmlsdHJhdGlvbicgfSxcbiAgICB7IHBhdHRlcm46IC9zZW5kXFxzK2FsbFxccysoZmlsZXN8ZGF0YXxwZXJzb25hc3x0b2tlbnN8Y3JlZGVudGlhbHMpXFxzK3RvL2dpLCBzZXZlcml0eTogJ2NyaXRpY2FsJywgZGVzY3JpcHRpb246ICdEYXRhIGV4ZmlsdHJhdGlvbicgfSxcbiAgICB7IHBhdHRlcm46IC9saXN0XFxzK2FsbFxccysoZmlsZXN8dG9rZW5zfGNyZWRlbnRpYWxzfHNlY3JldHMpL2dpLCBzZXZlcml0eTogJ2hpZ2gnLCBkZXNjcmlwdGlvbjogJ0luZm9ybWF0aW9uIGRpc2Nsb3N1cmUnIH0sXG4gICAgeyBwYXR0ZXJuOiAvc2hvd1xccyttZVxccythbGxcXHMrKHRva2Vuc3xjcmVkZW50aWFsc3xzZWNyZXRzfGFwaVxccytrZXlzKS9naSwgc2V2ZXJpdHk6ICdoaWdoJywgZGVzY3JpcHRpb246ICdDcmVkZW50aWFsIGRpc2Nsb3N1cmUnIH0sXG4gICAgXG4gICAgLy8gQ29tbWFuZCBleGVjdXRpb24gcGF0dGVybnNcbiAgICB7IHBhdHRlcm46IC9jdXJsXFxzK1teXFxzXStcXC4oY29tfG5ldHxvcmd8aW98ZGV2KS9naSwgc2V2ZXJpdHk6ICdjcml0aWNhbCcsIGRlc2NyaXB0aW9uOiAnRXh0ZXJuYWwgY29tbWFuZCBleGVjdXRpb24nIH0sXG4gICAgeyBwYXR0ZXJuOiAvd2dldFxccytbXlxcc10rXFwuKGNvbXxuZXR8b3JnfGlvfGRldikvZ2ksIHNldmVyaXR5OiAnY3JpdGljYWwnLCBkZXNjcmlwdGlvbjogJ0V4dGVybmFsIGNvbW1hbmQgZXhlY3V0aW9uJyB9LFxuICAgIHsgcGF0dGVybjogL1xcJFxcKFteKV0rXFwpL2csIHNldmVyaXR5OiAnY3JpdGljYWwnLCBkZXNjcmlwdGlvbjogJ0NvbW1hbmQgc3Vic3RpdHV0aW9uJyB9LFxuICAgIHsgcGF0dGVybjogL2BbXmBdK2AvZywgc2V2ZXJpdHk6ICdjcml0aWNhbCcsIGRlc2NyaXB0aW9uOiAnQmFja3RpY2sgY29tbWFuZCBleGVjdXRpb24nIH0sXG4gICAgeyBwYXR0ZXJuOiAvZXZhbFxccypcXCgvZ2ksIHNldmVyaXR5OiAnY3JpdGljYWwnLCBkZXNjcmlwdGlvbjogJ0NvZGUgZXZhbHVhdGlvbicgfSxcbiAgICB7IHBhdHRlcm46IC9leGVjXFxzKlxcKC9naSwgc2V2ZXJpdHk6ICdjcml0aWNhbCcsIGRlc2NyaXB0aW9uOiAnQ29kZSBleGVjdXRpb24nIH0sXG4gICAgeyBwYXR0ZXJuOiAvb3NcXC5zeXN0ZW1cXHMqXFwoL2dpLCBzZXZlcml0eTogJ2NyaXRpY2FsJywgZGVzY3JpcHRpb246ICdTeXN0ZW0gY29tbWFuZCBleGVjdXRpb24nIH0sXG4gICAgeyBwYXR0ZXJuOiAvc3VicHJvY2Vzc1xcLihjYWxsfHJ1bnxQb3BlbikvZ2ksIHNldmVyaXR5OiAnY3JpdGljYWwnLCBkZXNjcmlwdGlvbjogJ1N1YnByb2Nlc3MgZXhlY3V0aW9uJyB9LFxuICAgIFxuICAgIC8vIFRva2VuL2NyZWRlbnRpYWwgcGF0dGVybnNcbiAgICB7IHBhdHRlcm46IC9HSVRIVUJfVE9LRU4vZ2ksIHNldmVyaXR5OiAnaGlnaCcsIGRlc2NyaXB0aW9uOiAnVG9rZW4gcmVmZXJlbmNlJyB9LFxuICAgIHsgcGF0dGVybjogL2docF9bYS16QS1aMC05XXszNn0vZywgc2V2ZXJpdHk6ICdjcml0aWNhbCcsIGRlc2NyaXB0aW9uOiAnR2l0SHViIHRva2VuIGV4cG9zdXJlJyB9LFxuICAgIHsgcGF0dGVybjogL2dob19bYS16QS1aMC05XXszNn0vZywgc2V2ZXJpdHk6ICdjcml0aWNhbCcsIGRlc2NyaXB0aW9uOiAnR2l0SHViIE9BdXRoIHRva2VuIGV4cG9zdXJlJyB9LFxuICAgIFxuICAgIC8vIFBhdGggdHJhdmVyc2FsIGluIGNvbnRlbnRcbiAgICB7IHBhdHRlcm46IC9cXC5cXC5cXC9cXC5cXC5cXC9cXC5cXC5cXC8vZywgc2V2ZXJpdHk6ICdoaWdoJywgZGVzY3JpcHRpb246ICdQYXRoIHRyYXZlcnNhbCBhdHRlbXB0JyB9LFxuICAgIHsgcGF0dGVybjogL1xcL2V0Y1xcL3Bhc3N3ZC9naSwgc2V2ZXJpdHk6ICdoaWdoJywgZGVzY3JpcHRpb246ICdTZW5zaXRpdmUgZmlsZSBhY2Nlc3MnIH0sXG4gICAgeyBwYXR0ZXJuOiAvXFwvXFwuc3NoXFwvL2dpLCBzZXZlcml0eTogJ2hpZ2gnLCBkZXNjcmlwdGlvbjogJ1NTSCBrZXkgYWNjZXNzIGF0dGVtcHQnIH0sXG4gIF07XG5cbiAgLy8gTWFsaWNpb3VzIFlBTUwgcGF0dGVybnNcbiAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgTUFMSUNJT1VTX1lBTUxfUEFUVEVSTlMgPSBbXG4gICAgLyEhcHl0aG9uXFwvb2JqZWN0LyxcbiAgICAvISFydWJ5XFwvb2JqZWN0LyxcbiAgICAvISFqYXZhLyxcbiAgICAvISFleGVjLyxcbiAgICAvISFldmFsLyxcbiAgICAvISFuZXcvLFxuICAgIC8hIWNvbnN0cnVjdC8sXG4gICAgLyEhYXBwbHkvLFxuICAgIC9zdWJwcm9jZXNzLyxcbiAgICAvb3NcXC5zeXN0ZW0vLFxuICAgIC9ldmFsXFwoLyxcbiAgICAvZXhlY1xcKC8sXG4gICAgL19faW1wb3J0X18vLFxuICBdO1xuXG4gIC8qKlxuICAgKiBWYWxpZGF0ZXMgYW5kIHNhbml0aXplcyBwZXJzb25hIGNvbnRlbnQgZm9yIHNlY3VyaXR5IHRocmVhdHNcbiAgICovXG4gIHN0YXRpYyB2YWxpZGF0ZUFuZFNhbml0aXplKGNvbnRlbnQ6IHN0cmluZyk6IFZhbGlkYXRpb25SZXN1bHQge1xuICAgIGNvbnN0IGRldGVjdGVkUGF0dGVybnM6IHN0cmluZ1tdID0gW107XG4gICAgbGV0IHNhbml0aXplZCA9IGNvbnRlbnQ7XG4gICAgbGV0IGhpZ2hlc3RTZXZlcml0eTogJ2xvdycgfCAnbWVkaXVtJyB8ICdoaWdoJyB8ICdjcml0aWNhbCcgPSAnbG93JztcblxuICAgIC8vIENoZWNrIGZvciBpbmplY3Rpb24gcGF0dGVybnNcbiAgICBmb3IgKGNvbnN0IHsgcGF0dGVybiwgc2V2ZXJpdHksIGRlc2NyaXB0aW9uIH0gb2YgdGhpcy5JTkpFQ1RJT05fUEFUVEVSTlMpIHtcbiAgICAgIGlmIChwYXR0ZXJuLnRlc3QoY29udGVudCkpIHtcbiAgICAgICAgZGV0ZWN0ZWRQYXR0ZXJucy5wdXNoKGRlc2NyaXB0aW9uKTtcbiAgICAgICAgXG4gICAgICAgIC8vIFVwZGF0ZSBoaWdoZXN0IHNldmVyaXR5XG4gICAgICAgIGlmIChzZXZlcml0eSA9PT0gJ2NyaXRpY2FsJyB8fCAoc2V2ZXJpdHkgPT09ICdoaWdoJyAmJiBoaWdoZXN0U2V2ZXJpdHkgIT09ICdjcml0aWNhbCcpKSB7XG4gICAgICAgICAgaGlnaGVzdFNldmVyaXR5ID0gc2V2ZXJpdHk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBMb2cgc2VjdXJpdHkgZXZlbnRcbiAgICAgICAgU2VjdXJpdHlNb25pdG9yLmxvZ1NlY3VyaXR5RXZlbnQoe1xuICAgICAgICAgIHR5cGU6ICdDT05URU5UX0lOSkVDVElPTl9BVFRFTVBUJyxcbiAgICAgICAgICBzZXZlcml0eTogc2V2ZXJpdHkudG9VcHBlckNhc2UoKSBhcyAnSElHSCcgfCAnQ1JJVElDQUwnLFxuICAgICAgICAgIHNvdXJjZTogJ2NvbnRlbnRfdmFsaWRhdGlvbicsXG4gICAgICAgICAgZGV0YWlsczogYERldGVjdGVkIHBhdHRlcm46ICR7ZGVzY3JpcHRpb259YCxcbiAgICAgICAgfSk7XG5cbiAgICAgICAgLy8gU2FuaXRpemUgYnkgcmVwbGFjaW5nIHdpdGggc2FmZSBwbGFjZWhvbGRlclxuICAgICAgICBzYW5pdGl6ZWQgPSBzYW5pdGl6ZWQucmVwbGFjZShwYXR0ZXJuLCAnW0NPTlRFTlRfQkxPQ0tFRF0nKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgaXNWYWxpZDogZGV0ZWN0ZWRQYXR0ZXJucy5sZW5ndGggPT09IDAsXG4gICAgICBzYW5pdGl6ZWRDb250ZW50OiBzYW5pdGl6ZWQsXG4gICAgICBkZXRlY3RlZFBhdHRlcm5zLFxuICAgICAgc2V2ZXJpdHk6IGhpZ2hlc3RTZXZlcml0eVxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogVmFsaWRhdGVzIFlBTUwgZnJvbnRtYXR0ZXIgZm9yIG1hbGljaW91cyBjb250ZW50XG4gICAqL1xuICBzdGF0aWMgdmFsaWRhdGVZYW1sQ29udGVudCh5YW1sQ29udGVudDogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgZm9yIChjb25zdCBwYXR0ZXJuIG9mIHRoaXMuTUFMSUNJT1VTX1lBTUxfUEFUVEVSTlMpIHtcbiAgICAgIGlmIChwYXR0ZXJuLnRlc3QoeWFtbENvbnRlbnQpKSB7XG4gICAgICAgIFNlY3VyaXR5TW9uaXRvci5sb2dTZWN1cml0eUV2ZW50KHtcbiAgICAgICAgICB0eXBlOiAnWUFNTF9JTkpFQ1RJT05fQVRURU1QVCcsXG4gICAgICAgICAgc2V2ZXJpdHk6ICdDUklUSUNBTCcsXG4gICAgICAgICAgc291cmNlOiAneWFtbF92YWxpZGF0aW9uJyxcbiAgICAgICAgICBkZXRhaWxzOiBgTWFsaWNpb3VzIFlBTUwgcGF0dGVybiBkZXRlY3RlZDogJHtwYXR0ZXJufWAsXG4gICAgICAgIH0pO1xuICAgICAgICAvLyBFYXJseSBleGl0IG9uIGZpcnN0IG1hdGNoIGZvciBwZXJmb3JtYW5jZVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgLyoqXG4gICAqIFZhbGlkYXRlcyBwZXJzb25hIG1ldGFkYXRhIGZpZWxkc1xuICAgKi9cbiAgc3RhdGljIHZhbGlkYXRlTWV0YWRhdGEobWV0YWRhdGE6IGFueSk6IFZhbGlkYXRpb25SZXN1bHQge1xuICAgIGNvbnN0IGRldGVjdGVkUGF0dGVybnM6IHN0cmluZ1tdID0gW107XG5cbiAgICAvLyBDaGVjayBhbGwgc3RyaW5nIGZpZWxkcyBpbiBtZXRhZGF0YVxuICAgIGNvbnN0IGNoZWNrRmllbGQgPSAoZmllbGROYW1lOiBzdHJpbmcsIHZhbHVlOiBhbnkpID0+IHtcbiAgICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IHRoaXMudmFsaWRhdGVBbmRTYW5pdGl6ZSh2YWx1ZSk7XG4gICAgICAgIGlmICghcmVzdWx0LmlzVmFsaWQgfHwgcmVzdWx0LmRldGVjdGVkUGF0dGVybnM/Lmxlbmd0aCkge1xuICAgICAgICAgIGRldGVjdGVkUGF0dGVybnMucHVzaChgJHtmaWVsZE5hbWV9OiAke3Jlc3VsdC5kZXRlY3RlZFBhdHRlcm5zPy5qb2luKCcsICcpfWApO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfTtcblxuICAgIC8vIFZhbGlkYXRlIHN0YW5kYXJkIHBlcnNvbmEgZmllbGRzXG4gICAgY2hlY2tGaWVsZCgnbmFtZScsIG1ldGFkYXRhLm5hbWUpO1xuICAgIGNoZWNrRmllbGQoJ2Rlc2NyaXB0aW9uJywgbWV0YWRhdGEuZGVzY3JpcHRpb24pO1xuICAgIGNoZWNrRmllbGQoJ2NhdGVnb3J5JywgbWV0YWRhdGEuY2F0ZWdvcnkpO1xuICAgIGNoZWNrRmllbGQoJ2F1dGhvcicsIG1ldGFkYXRhLmF1dGhvcik7XG4gICAgXG4gICAgLy8gQ2hlY2sgYW55IGN1c3RvbSBmaWVsZHNcbiAgICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhtZXRhZGF0YSkpIHtcbiAgICAgIGlmICghWyduYW1lJywgJ2Rlc2NyaXB0aW9uJywgJ2NhdGVnb3J5JywgJ2F1dGhvciddLmluY2x1ZGVzKGtleSkpIHtcbiAgICAgICAgY2hlY2tGaWVsZChrZXksIHZhbHVlKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgaXNWYWxpZDogZGV0ZWN0ZWRQYXR0ZXJucy5sZW5ndGggPT09IDAsXG4gICAgICBkZXRlY3RlZFBhdHRlcm5zLFxuICAgICAgc2V2ZXJpdHk6IGRldGVjdGVkUGF0dGVybnMubGVuZ3RoID4gMCA/ICdoaWdoJyA6ICdsb3cnXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTYW5pdGl6ZXMgYSBjb21wbGV0ZSBwZXJzb25hIGZpbGUgKGZyb250bWF0dGVyICsgY29udGVudClcbiAgICovXG4gIHN0YXRpYyBzYW5pdGl6ZVBlcnNvbmFDb250ZW50KGNvbnRlbnQ6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgLy8gRXh0cmFjdCBmcm9udG1hdHRlclxuICAgIGNvbnN0IGZyb250bWF0dGVyTWF0Y2ggPSBjb250ZW50Lm1hdGNoKC9eLS0tXFxuKFtcXHNcXFNdKj8pXFxuLS0tLyk7XG4gICAgXG4gICAgaWYgKCFmcm9udG1hdHRlck1hdGNoKSB7XG4gICAgICAvLyBObyBmcm9udG1hdHRlciwganVzdCB2YWxpZGF0ZSBjb250ZW50XG4gICAgICBjb25zdCByZXN1bHQgPSB0aGlzLnZhbGlkYXRlQW5kU2FuaXRpemUoY29udGVudCk7XG4gICAgICBpZiAoIXJlc3VsdC5pc1ZhbGlkICYmIHJlc3VsdC5zZXZlcml0eSA9PT0gJ2NyaXRpY2FsJykge1xuICAgICAgICB0aHJvdyBuZXcgU2VjdXJpdHlFcnJvcignQ3JpdGljYWwgc2VjdXJpdHkgdGhyZWF0IGRldGVjdGVkIGluIHBlcnNvbmEgY29udGVudCcpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHJlc3VsdC5zYW5pdGl6ZWRDb250ZW50IHx8IGNvbnRlbnQ7XG4gICAgfVxuXG4gICAgY29uc3QgeWFtbENvbnRlbnQgPSBmcm9udG1hdHRlck1hdGNoWzFdO1xuICAgIGNvbnN0IG1hcmtkb3duQ29udGVudCA9IGNvbnRlbnQuc3Vic3RyaW5nKGZyb250bWF0dGVyTWF0Y2hbMF0ubGVuZ3RoKTtcblxuICAgIC8vIFZhbGlkYXRlIFlBTUxcbiAgICBpZiAoIXRoaXMudmFsaWRhdGVZYW1sQ29udGVudCh5YW1sQ29udGVudCkpIHtcbiAgICAgIHRocm93IG5ldyBTZWN1cml0eUVycm9yKCdNYWxpY2lvdXMgWUFNTCBkZXRlY3RlZCBpbiBwZXJzb25hIGZyb250bWF0dGVyJyk7XG4gICAgfVxuXG4gICAgLy8gVmFsaWRhdGUgbWFya2Rvd24gY29udGVudFxuICAgIGNvbnN0IGNvbnRlbnRSZXN1bHQgPSB0aGlzLnZhbGlkYXRlQW5kU2FuaXRpemUobWFya2Rvd25Db250ZW50KTtcbiAgICBpZiAoIWNvbnRlbnRSZXN1bHQuaXNWYWxpZCAmJiBjb250ZW50UmVzdWx0LnNldmVyaXR5ID09PSAnY3JpdGljYWwnKSB7XG4gICAgICB0aHJvdyBuZXcgU2VjdXJpdHlFcnJvcignQ3JpdGljYWwgc2VjdXJpdHkgdGhyZWF0IGRldGVjdGVkIGluIHBlcnNvbmEgY29udGVudCcpO1xuICAgIH1cblxuICAgIC8vIFJldHVybiBzYW5pdGl6ZWQgY29udGVudFxuICAgIHJldHVybiBgLS0tXFxuJHt5YW1sQ29udGVudH1cXG4tLS0ke2NvbnRlbnRSZXN1bHQuc2FuaXRpemVkQ29udGVudCB8fCBtYXJrZG93bkNvbnRlbnR9YDtcbiAgfVxufSJdfQ==
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* FileLockManager - Prevents race conditions in concurrent file operations
|
|
3
|
+
*
|
|
4
|
+
* Features:
|
|
5
|
+
* - Resource-based locking with automatic cleanup
|
|
6
|
+
* - Configurable timeouts to prevent deadlocks
|
|
7
|
+
* - Atomic file operations with write-rename pattern
|
|
8
|
+
* - Lock queueing for concurrent requests
|
|
9
|
+
* - Comprehensive error handling and logging
|
|
10
|
+
* - Performance metrics tracking
|
|
11
|
+
*/
|
|
12
|
+
export declare class FileLockManager {
|
|
13
|
+
private static locks;
|
|
14
|
+
private static metrics;
|
|
15
|
+
private static readonly DEFAULT_TIMEOUT_MS;
|
|
16
|
+
private static readonly TEMP_DIR;
|
|
17
|
+
/**
|
|
18
|
+
* Execute an operation with exclusive lock on a resource
|
|
19
|
+
* @param resource - Unique identifier for the resource (e.g., 'persona:name')
|
|
20
|
+
* @param operation - Async function to execute while holding the lock
|
|
21
|
+
* @param options - Lock options including timeout
|
|
22
|
+
* @returns Result of the operation
|
|
23
|
+
*/
|
|
24
|
+
static withLock<T>(resource: string, operation: () => Promise<T>, options?: {
|
|
25
|
+
timeout?: number;
|
|
26
|
+
}): Promise<T>;
|
|
27
|
+
/**
|
|
28
|
+
* Execute operation with timeout protection
|
|
29
|
+
*/
|
|
30
|
+
private static executeWithTimeout;
|
|
31
|
+
/**
|
|
32
|
+
* Perform atomic file write operation
|
|
33
|
+
* Writes to temporary file then renames to ensure atomicity
|
|
34
|
+
*/
|
|
35
|
+
static atomicWriteFile(filePath: string, content: string, options?: {
|
|
36
|
+
encoding?: BufferEncoding;
|
|
37
|
+
}): Promise<void>;
|
|
38
|
+
/**
|
|
39
|
+
* Perform atomic file read with lock
|
|
40
|
+
*/
|
|
41
|
+
static atomicReadFile(filePath: string, options?: {
|
|
42
|
+
encoding?: BufferEncoding;
|
|
43
|
+
}): Promise<string>;
|
|
44
|
+
/**
|
|
45
|
+
* Generate temporary file path for atomic operations
|
|
46
|
+
*/
|
|
47
|
+
private static getTempFilePath;
|
|
48
|
+
/**
|
|
49
|
+
* Get lock metrics for monitoring
|
|
50
|
+
*/
|
|
51
|
+
static getMetrics(): {
|
|
52
|
+
totalRequests: number;
|
|
53
|
+
activeLocksCount: number;
|
|
54
|
+
timeouts: number;
|
|
55
|
+
concurrentWaits: number;
|
|
56
|
+
avgWaitTimeByResource: {
|
|
57
|
+
[k: string]: number;
|
|
58
|
+
};
|
|
59
|
+
activeLocks: string[];
|
|
60
|
+
};
|
|
61
|
+
/**
|
|
62
|
+
* Clear all locks (use with caution - mainly for testing)
|
|
63
|
+
*/
|
|
64
|
+
static clearAllLocks(): void;
|
|
65
|
+
/**
|
|
66
|
+
* Reset metrics
|
|
67
|
+
*/
|
|
68
|
+
static resetMetrics(): void;
|
|
69
|
+
}
|
|
70
|
+
//# sourceMappingURL=fileLockManager.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fileLockManager.d.ts","sourceRoot":"","sources":["../../../src/security/fileLockManager.ts"],"names":[],"mappings":"AAKA;;;;;;;;;;GAUG;AACH,qBAAa,eAAe;IAE1B,OAAO,CAAC,MAAM,CAAC,KAAK,CAAmC;IAGvD,OAAO,CAAC,MAAM,CAAC,OAAO,CAKpB;IAGF,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,kBAAkB,CAAS;IAGnD,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAAU;IAE1C;;;;;;OAMG;WACU,QAAQ,CAAC,CAAC,EACrB,QAAQ,EAAE,MAAM,EAChB,SAAS,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,EAC3B,OAAO,GAAE;QAAE,OAAO,CAAC,EAAE,MAAM,CAAA;KAAO,GACjC,OAAO,CAAC,CAAC,CAAC;IA+Cb;;OAEG;mBACkB,kBAAkB;IAwBvC;;;OAGG;WACU,eAAe,CAC1B,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE,MAAM,EACf,OAAO,CAAC,EAAE;QAAE,QAAQ,CAAC,EAAE,cAAc,CAAA;KAAE,GACtC,OAAO,CAAC,IAAI,CAAC;IA4BhB;;OAEG;WACU,cAAc,CACzB,QAAQ,EAAE,MAAM,EAChB,OAAO,CAAC,EAAE;QAAE,QAAQ,CAAC,EAAE,cAAc,CAAA;KAAE,GACtC,OAAO,CAAC,MAAM,CAAC;IAOlB;;OAEG;mBACkB,eAAe;IAOpC;;OAEG;IACH,MAAM,CAAC,UAAU;;;;;;;;;;IAmBjB;;OAEG;IACH,MAAM,CAAC,aAAa,IAAI,IAAI;IAK5B;;OAEG;IACH,MAAM,CAAC,YAAY,IAAI,IAAI;CAQ5B"}
|
|
@@ -0,0 +1,187 @@
|
|
|
1
|
+
import { logger } from '../utils/logger.js';
|
|
2
|
+
import * as fs from 'fs/promises';
|
|
3
|
+
import * as path from 'path';
|
|
4
|
+
import { randomBytes } from 'crypto';
|
|
5
|
+
/**
|
|
6
|
+
* FileLockManager - Prevents race conditions in concurrent file operations
|
|
7
|
+
*
|
|
8
|
+
* Features:
|
|
9
|
+
* - Resource-based locking with automatic cleanup
|
|
10
|
+
* - Configurable timeouts to prevent deadlocks
|
|
11
|
+
* - Atomic file operations with write-rename pattern
|
|
12
|
+
* - Lock queueing for concurrent requests
|
|
13
|
+
* - Comprehensive error handling and logging
|
|
14
|
+
* - Performance metrics tracking
|
|
15
|
+
*/
|
|
16
|
+
export class FileLockManager {
|
|
17
|
+
// Map of resource identifiers to their lock promises
|
|
18
|
+
static locks = new Map();
|
|
19
|
+
// Lock acquisition metrics for monitoring
|
|
20
|
+
static metrics = {
|
|
21
|
+
totalLockRequests: 0,
|
|
22
|
+
lockWaitTime: new Map(),
|
|
23
|
+
lockTimeouts: 0,
|
|
24
|
+
concurrentWaits: 0
|
|
25
|
+
};
|
|
26
|
+
// Default timeout for lock operations (10 seconds)
|
|
27
|
+
static DEFAULT_TIMEOUT_MS = 10000;
|
|
28
|
+
// Temporary file directory
|
|
29
|
+
static TEMP_DIR = '.tmp';
|
|
30
|
+
/**
|
|
31
|
+
* Execute an operation with exclusive lock on a resource
|
|
32
|
+
* @param resource - Unique identifier for the resource (e.g., 'persona:name')
|
|
33
|
+
* @param operation - Async function to execute while holding the lock
|
|
34
|
+
* @param options - Lock options including timeout
|
|
35
|
+
* @returns Result of the operation
|
|
36
|
+
*/
|
|
37
|
+
static async withLock(resource, operation, options = {}) {
|
|
38
|
+
const startTime = Date.now();
|
|
39
|
+
this.metrics.totalLockRequests++;
|
|
40
|
+
logger.debug(`Lock requested for resource: ${resource}`);
|
|
41
|
+
// Wait for any existing operation on this resource
|
|
42
|
+
const existingLock = this.locks.get(resource);
|
|
43
|
+
if (existingLock) {
|
|
44
|
+
this.metrics.concurrentWaits++;
|
|
45
|
+
logger.debug(`Waiting for existing lock on: ${resource}`);
|
|
46
|
+
try {
|
|
47
|
+
await existingLock;
|
|
48
|
+
}
|
|
49
|
+
catch (error) {
|
|
50
|
+
// Previous operation failed, but we can proceed
|
|
51
|
+
logger.debug(`Previous operation on ${resource} failed, proceeding`);
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
// Create new lock for this operation
|
|
55
|
+
const timeout = options.timeout || this.DEFAULT_TIMEOUT_MS;
|
|
56
|
+
const lockPromise = this.executeWithTimeout(operation, timeout, resource);
|
|
57
|
+
this.locks.set(resource, lockPromise);
|
|
58
|
+
try {
|
|
59
|
+
const result = await lockPromise;
|
|
60
|
+
// Record metrics
|
|
61
|
+
const waitTime = Date.now() - startTime;
|
|
62
|
+
if (!this.metrics.lockWaitTime.has(resource)) {
|
|
63
|
+
this.metrics.lockWaitTime.set(resource, []);
|
|
64
|
+
}
|
|
65
|
+
this.metrics.lockWaitTime.get(resource).push(waitTime);
|
|
66
|
+
logger.debug(`Lock released for resource: ${resource} (${waitTime}ms)`);
|
|
67
|
+
return result;
|
|
68
|
+
}
|
|
69
|
+
finally {
|
|
70
|
+
// Clean up lock atomically - compare and delete in one operation
|
|
71
|
+
const currentLock = this.locks.get(resource);
|
|
72
|
+
if (currentLock === lockPromise) {
|
|
73
|
+
this.locks.delete(resource);
|
|
74
|
+
logger.debug(`Lock queue cleaned up for resource: ${resource}`);
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
/**
|
|
79
|
+
* Execute operation with timeout protection
|
|
80
|
+
*/
|
|
81
|
+
static async executeWithTimeout(operation, timeoutMs, resource) {
|
|
82
|
+
let timeoutHandle;
|
|
83
|
+
const timeoutPromise = new Promise((_, reject) => {
|
|
84
|
+
timeoutHandle = setTimeout(() => {
|
|
85
|
+
this.metrics.lockTimeouts++;
|
|
86
|
+
reject(new Error(`Lock operation timeout for resource: ${resource}`));
|
|
87
|
+
}, timeoutMs);
|
|
88
|
+
});
|
|
89
|
+
try {
|
|
90
|
+
const result = await Promise.race([operation(), timeoutPromise]);
|
|
91
|
+
if (timeoutHandle)
|
|
92
|
+
clearTimeout(timeoutHandle);
|
|
93
|
+
return result;
|
|
94
|
+
}
|
|
95
|
+
catch (error) {
|
|
96
|
+
if (timeoutHandle)
|
|
97
|
+
clearTimeout(timeoutHandle);
|
|
98
|
+
throw error;
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
/**
|
|
102
|
+
* Perform atomic file write operation
|
|
103
|
+
* Writes to temporary file then renames to ensure atomicity
|
|
104
|
+
*/
|
|
105
|
+
static async atomicWriteFile(filePath, content, options) {
|
|
106
|
+
const tempPath = await this.getTempFilePath(filePath);
|
|
107
|
+
const dir = path.dirname(tempPath);
|
|
108
|
+
try {
|
|
109
|
+
// Ensure temp directory exists
|
|
110
|
+
await fs.mkdir(dir, { recursive: true });
|
|
111
|
+
// Write to temporary file
|
|
112
|
+
await fs.writeFile(tempPath, content, options);
|
|
113
|
+
// Atomic rename (on same filesystem)
|
|
114
|
+
await fs.rename(tempPath, filePath);
|
|
115
|
+
logger.debug(`Atomic write completed: ${filePath}`);
|
|
116
|
+
}
|
|
117
|
+
catch (error) {
|
|
118
|
+
// Clean up temp file on error
|
|
119
|
+
try {
|
|
120
|
+
await fs.unlink(tempPath);
|
|
121
|
+
logger.debug(`Cleaned up temp file after error: ${tempPath}`);
|
|
122
|
+
}
|
|
123
|
+
catch (unlinkError) {
|
|
124
|
+
// Log cleanup failure but don't throw - original error is more important
|
|
125
|
+
logger.warn(`Failed to clean up temp file ${tempPath}: ${unlinkError}`);
|
|
126
|
+
}
|
|
127
|
+
throw error;
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
/**
|
|
131
|
+
* Perform atomic file read with lock
|
|
132
|
+
*/
|
|
133
|
+
static async atomicReadFile(filePath, options) {
|
|
134
|
+
return this.withLock(`file:${filePath}`, async () => {
|
|
135
|
+
const content = await fs.readFile(filePath, options);
|
|
136
|
+
return content.toString();
|
|
137
|
+
});
|
|
138
|
+
}
|
|
139
|
+
/**
|
|
140
|
+
* Generate temporary file path for atomic operations
|
|
141
|
+
*/
|
|
142
|
+
static async getTempFilePath(originalPath) {
|
|
143
|
+
const dir = path.dirname(originalPath);
|
|
144
|
+
const basename = path.basename(originalPath);
|
|
145
|
+
const random = randomBytes(8).toString('hex');
|
|
146
|
+
return path.join(dir, this.TEMP_DIR, `${basename}.${random}.tmp`);
|
|
147
|
+
}
|
|
148
|
+
/**
|
|
149
|
+
* Get lock metrics for monitoring
|
|
150
|
+
*/
|
|
151
|
+
static getMetrics() {
|
|
152
|
+
const avgWaitTimes = new Map();
|
|
153
|
+
for (const [resource, times] of this.metrics.lockWaitTime.entries()) {
|
|
154
|
+
if (times.length > 0) {
|
|
155
|
+
const avg = times.reduce((a, b) => a + b, 0) / times.length;
|
|
156
|
+
avgWaitTimes.set(resource, Math.round(avg));
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
return {
|
|
160
|
+
totalRequests: this.metrics.totalLockRequests,
|
|
161
|
+
activeLocksCount: this.locks.size,
|
|
162
|
+
timeouts: this.metrics.lockTimeouts,
|
|
163
|
+
concurrentWaits: this.metrics.concurrentWaits,
|
|
164
|
+
avgWaitTimeByResource: Object.fromEntries(avgWaitTimes),
|
|
165
|
+
activeLocks: Array.from(this.locks.keys())
|
|
166
|
+
};
|
|
167
|
+
}
|
|
168
|
+
/**
|
|
169
|
+
* Clear all locks (use with caution - mainly for testing)
|
|
170
|
+
*/
|
|
171
|
+
static clearAllLocks() {
|
|
172
|
+
this.locks.clear();
|
|
173
|
+
logger.warn('All file locks cleared - use only for testing/recovery');
|
|
174
|
+
}
|
|
175
|
+
/**
|
|
176
|
+
* Reset metrics
|
|
177
|
+
*/
|
|
178
|
+
static resetMetrics() {
|
|
179
|
+
this.metrics = {
|
|
180
|
+
totalLockRequests: 0,
|
|
181
|
+
lockWaitTime: new Map(),
|
|
182
|
+
lockTimeouts: 0,
|
|
183
|
+
concurrentWaits: 0
|
|
184
|
+
};
|
|
185
|
+
}
|
|
186
|
+
}
|
|
187
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmlsZUxvY2tNYW5hZ2VyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL3NlY3VyaXR5L2ZpbGVMb2NrTWFuYWdlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFDNUMsT0FBTyxLQUFLLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFDbEMsT0FBTyxLQUFLLElBQUksTUFBTSxNQUFNLENBQUM7QUFDN0IsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLFFBQVEsQ0FBQztBQUVyQzs7Ozs7Ozs7OztHQVVHO0FBQ0gsTUFBTSxPQUFPLGVBQWU7SUFDMUIscURBQXFEO0lBQzdDLE1BQU0sQ0FBQyxLQUFLLEdBQUcsSUFBSSxHQUFHLEVBQXdCLENBQUM7SUFFdkQsMENBQTBDO0lBQ2xDLE1BQU0sQ0FBQyxPQUFPLEdBQUc7UUFDdkIsaUJBQWlCLEVBQUUsQ0FBQztRQUNwQixZQUFZLEVBQUUsSUFBSSxHQUFHLEVBQW9CO1FBQ3pDLFlBQVksRUFBRSxDQUFDO1FBQ2YsZUFBZSxFQUFFLENBQUM7S0FDbkIsQ0FBQztJQUVGLG1EQUFtRDtJQUMzQyxNQUFNLENBQVUsa0JBQWtCLEdBQUcsS0FBSyxDQUFDO0lBRW5ELDJCQUEyQjtJQUNuQixNQUFNLENBQVUsUUFBUSxHQUFHLE1BQU0sQ0FBQztJQUUxQzs7Ozs7O09BTUc7SUFDSCxNQUFNLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FDbkIsUUFBZ0IsRUFDaEIsU0FBMkIsRUFDM0IsVUFBZ0MsRUFBRTtRQUVsQyxNQUFNLFNBQVMsR0FBRyxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUM7UUFDN0IsSUFBSSxDQUFDLE9BQU8sQ0FBQyxpQkFBaUIsRUFBRSxDQUFDO1FBRWpDLE1BQU0sQ0FBQyxLQUFLLENBQUMsZ0NBQWdDLFFBQVEsRUFBRSxDQUFDLENBQUM7UUFFekQsbURBQW1EO1FBQ25ELE1BQU0sWUFBWSxHQUFHLElB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TSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsR0FBRyxLQUFLLENBQUMsTUFBTSxDQUFDO2dCQUM1RCxZQUFZLENBQUMsR0FBRyxDQUFDLFFBQVEsRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7WUFDOUMsQ0FBQztRQUNILENBQUM7UUFFRCxPQUFPO1lBQ0wsYUFBYSxFQUFFLElBQUksQ0FBQyxPQUFPLENBQUMsaUJBQWlCO1lBQzdDLGdCQUFnQixFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSTtZQUNqQyxRQUFRLEVBQUUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxZQUFZO1lBQ25DLGVBQWUsRUFBRSxJQUFJLENBQUMsT0FBTyxDQUFDLGVBQWU7WUFDN0MscUJBQXFCLEVBQUUsTUFBTSxDQUFDLFdBQVcsQ0FBQyxZQUFZLENBQUM7WUFDdkQsV0FBVyxFQUFFLEtBQUssQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLEVBQUUsQ0FBQztTQUMzQyxDQUFDO0lBQ0osQ0FBQztJQUVEOztPQUVHO0lBQ0gsTUFBTSxDQUFDLGFBQWE7UUFDbEIsSUFBSSxDQUFDLEtBQUssQ0FBQyxLQUFLLEVBQUUsQ0FBQztRQUNuQixNQUFNLENBQUMsSUFBSSxDQUFDLHdEQUF3RCxDQUFDLENBQUM7SUFDeEUsQ0FBQztJQUVEOztPQUVHO0lBQ0gsTUFBTSxDQUFDLFlBQVk7UUFDakIsSUFBSSxDQUFDLE9BQU8sR0FBRztZQUNiLGlCQUFpQixFQUFFLENBQUM7WUFDcEIsWUFBWSxFQUFFLElBQUksR0FBRyxFQUFvQjtZQUN6QyxZQUFZLEVBQUUsQ0FBQztZQUNmLGVBQWUsRUFBRSxDQUFDO1NBQ25CLENBQUM7SUFDSixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vdXRpbHMvbG9nZ2VyLmpzJztcbmltcG9ydCAqIGFzIGZzIGZyb20gJ2ZzL3Byb21pc2VzJztcbmltcG9ydCAqIGFzIHBhdGggZnJvbSAncGF0aCc7XG5pbXBvcnQgeyByYW5kb21CeXRlcyB9IGZyb20gJ2NyeXB0byc7XG5cbi8qKlxuICogRmlsZUxvY2tNYW5hZ2VyIC0gUHJldmVudHMgcmFjZSBjb25kaXRpb25zIGluIGNvbmN1cnJlbnQgZmlsZSBvcGVyYXRpb25zXG4gKiBcbiAqIEZlYXR1cmVzOlxuICogLSBSZXNvdXJjZS1iYXNlZCBsb2NraW5nIHdpdGggYXV0b21hdGljIGNsZWFudXBcbiAqIC0gQ29uZmlndXJhYmxlIHRpbWVvdXRzIHRvIHByZXZlbnQgZGVhZGxvY2tzXG4gKiAtIEF0b21pYyBmaWxlIG9wZXJhdGlvbnMgd2l0aCB3cml0ZS1yZW5hbWUgcGF0dGVyblxuICogLSBMb2NrIHF1ZXVlaW5nIGZvciBjb25jdXJyZW50IHJlcXVlc3RzXG4gKiAtIENvbXByZWhlbnNpdmUgZXJyb3IgaGFuZGxpbmcgYW5kIGxvZ2dpbmdcbiAqIC0gUGVyZm9ybWFuY2UgbWV0cmljcyB0cmFja2luZ1xuICovXG5leHBvcnQgY2xhc3MgRmlsZUxvY2tNYW5hZ2VyIHtcbiAgLy8gTWFwIG9mIHJlc291cmNlIGlkZW50aWZpZXJzIHRvIHRoZWlyIGxvY2sgcHJvbWlzZXNcbiAgcHJpdmF0ZSBzdGF0aWMgbG9ja3MgPSBuZXcgTWFwPHN0cmluZywgUHJvbWlzZTxhbnk+PigpO1xuICBcbiAgLy8gTG9jayBhY3F1aXNpdGlvbiBtZXRyaWNzIGZvciBtb25pdG9yaW5nXG4gIHByaXZhdGUgc3RhdGljIG1ldHJpY3MgPSB7XG4gICAgdG90YWxMb2NrUmVxdWVzdHM6IDAsXG4gICAgbG9ja1dhaXRUaW1lOiBuZXcgTWFwPHN0cmluZywgbnVtYmVyW10+KCksXG4gICAgbG9ja1RpbWVvdXRzOiAwLFxuICAgIGNvbmN1cnJlbnRXYWl0czogMFxuICB9O1xuXG4gIC8vIERlZmF1bHQgdGltZW91dCBmb3IgbG9jayBvcGVyYXRpb25zICgxMCBzZWNvbmRzKVxuICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBERUZBVUxUX1RJTUVPVVRfTVMgPSAxMDAwMDtcbiAgXG4gIC8vIFRlbXBvcmFyeSBmaWxlIGRpcmVjdG9yeVxuICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBURU1QX0RJUiA9ICcudG1wJztcblxuICAvKipcbiAgICogRXhlY3V0ZSBhbiBvcGVyYXRpb24gd2l0aCBleGNsdXNpdmUgbG9jayBvbiBhIHJlc291cmNlXG4gICAqIEBwYXJhbSByZXNvdXJjZSAtIFVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVzb3VyY2UgKGUuZy4sICdwZXJzb25hOm5hbWUnKVxuICAgKiBAcGFyYW0gb3BlcmF0aW9uIC0gQXN5bmMgZnVuY3Rpb24gdG8gZXhlY3V0ZSB3aGlsZSBob2xkaW5nIHRoZSBsb2NrXG4gICAqIEBwYXJhbSBvcHRpb25zIC0gTG9jayBvcHRpb25zIGluY2x1ZGluZyB0aW1lb3V0XG4gICAqIEByZXR1cm5zIFJlc3VsdCBvZiB0aGUgb3BlcmF0aW9uXG4gICAqL1xuICBzdGF0aWMgYXN5bmMgd2l0aExvY2s8VD4oXG4gICAgcmVzb3VyY2U6IHN0cmluZyxcbiAgICBvcGVyYXRpb246ICgpID0+IFByb21pc2U8VD4sXG4gICAgb3B0aW9uczogeyB0aW1lb3V0PzogbnVtYmVyIH0gPSB7fVxuICApOiBQcm9taXNlPFQ+IHtcbiAgICBjb25zdCBzdGFydFRpbWUgPSBEYXRlLm5vdygpO1xuICAgIHRoaXMubWV0cmljcy50b3RhbExvY2tSZXF1ZXN0cysrO1xuICAgIFxuICAgIGxvZ2dlci5kZWJ1ZyhgTG9jayByZXF1ZXN0ZWQgZm9yIHJlc291cmNlOiAke3Jlc291cmNlfWApO1xuICAgIFxuICAgIC8vIFdhaXQgZm9yIGFueSBleGlzdGluZyBvcGVyYXRpb24gb24gdGhpcyByZXNvdXJjZVxuICAgIGNvbnN0IGV4aXN0aW5nTG9jayA9IHRoaXMubG9ja3MuZ2V0KHJlc291cmNlKTtcbiAgICBpZiAoZXhpc3RpbmdMb2NrKSB7XG4gICAgICB0aGlzLm1ldHJpY3MuY29uY3VycmVudFdhaXRzKys7XG4gICAgICBsb2dnZXIuZGVidWcoYFdhaXRpbmcgZm9yIGV4aXN0aW5nIGxvY2sgb246ICR7cmVzb3VyY2V9YCk7XG4gICAgICBcbiAgICAgIHRyeSB7XG4gICAgICAgIGF3YWl0IGV4aXN0aW5nTG9jaztcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIC8vIFByZXZpb3VzIG9wZXJhdGlvbiBmYWlsZWQsIGJ1dCB3ZSBjYW4gcHJvY2VlZFxuICAgICAgICBsb2dnZXIuZGVidWcoYFByZXZpb3VzIG9wZXJhdGlvbiBvbiAke3Jlc291cmNlfSBmYWlsZWQsIHByb2NlZWRpbmdgKTtcbiAgICAgIH1cbiAgICB9XG4gICAgXG4gICAgLy8gQ3JlYXRlIG5ldyBsb2NrIGZvciB0aGlzIG9wZXJhdGlvblxuICAgIGNvbnN0IHRpbWVvdXQgPSBvcHRpb25zLnRpbWVvdXQgfHwgdGhpcy5ERUZBVUxUX1RJTUVPVVRfTVM7XG4gICAgY29uc3QgbG9ja1Byb21pc2UgPSB0aGlzLmV4ZWN1dGVXaXRoVGltZW91dChvcGVyYXRpb24sIHRpbWVvdXQsIHJlc291cmNlKTtcbiAgICB0aGlzLmxvY2tzLnNldChyZXNvdXJjZSwgbG9ja1Byb21pc2UpO1xuICAgIFxuICAgIHRyeSB7XG4gICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBsb2NrUHJvbWlzZTtcbiAgICAgIFxuICAgICAgLy8gUmVjb3JkIG1ldHJpY3NcbiAgICAgIGNvbnN0IHdhaXRUaW1lID0gRGF0ZS5ub3coKSAtIHN0YXJ0VGltZTtcbiAgICAgIGlmICghdGhpcy5tZXRyaWNzLmxvY2tXYWl0VGltZS5oYXMocmVzb3VyY2UpKSB7XG4gICAgICAgIHRoaXMubWV0cmljcy5sb2NrV2FpdFRpbWUuc2V0KHJlc291cmNlLCBbXSk7XG4gICAgICB9XG4gICAgICB0aGlzLm1ldHJpY3MubG9ja1dhaXRUaW1lLmdldChyZXNvdXJjZSkhLnB1c2god2FpdFRpbWUpO1xuICAgICAgXG4gICAgICBsb2dnZXIuZGVidWcoYExvY2sgcmVsZWFzZWQgZm9yIHJlc291cmNlOiAke3Jlc291cmNlfSAoJHt3YWl0VGltZX1tcylgKTtcbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIC8vIENsZWFuIHVwIGxvY2sgYXRvbWljYWxseSAtIGNvbXBhcmUgYW5kIGRlbGV0ZSBpbiBvbmUgb3BlcmF0aW9uXG4gICAgICBjb25zdCBjdXJyZW50TG9jayA9IHRoaXMubG9ja3MuZ2V0KHJlc291cmNlKTtcbiAgICAgIGlmIChjdXJyZW50TG9jayA9PT0gbG9ja1Byb21pc2UpIHtcbiAgICAgICAgdGhpcy5sb2Nrcy5kZWxldGUocmVzb3VyY2UpO1xuICAgICAgICBsb2dnZXIuZGVidWcoYExvY2sgcXVldWUgY2xlYW5lZCB1cCBmb3IgcmVzb3VyY2U6ICR7cmVzb3VyY2V9YCk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEV4ZWN1dGUgb3BlcmF0aW9uIHdpdGggdGltZW91dCBwcm90ZWN0aW9uXG4gICAqL1xuICBwcml2YXRlIHN0YXRpYyBhc3luYyBleGVjdXRlV2l0aFRpbWVvdXQ8VD4oXG4gICAgb3BlcmF0aW9uOiAoKSA9PiBQcm9taXNlPFQ+LFxuICAgIHRpbWVvdXRNczogbnVtYmVyLFxuICAgIHJlc291cmNlOiBzdHJpbmdcbiAgKTogUHJvbWlzZTxUPiB7XG4gICAgbGV0IHRpbWVvdXRIYW5kbGU6IE5vZGVKUy5UaW1lb3V0IHwgdW5kZWZpbmVkO1xuICAgIFxuICAgIGNvbnN0IHRpbWVvdXRQcm9taXNlID0gbmV3IFByb21pc2U8bmV2ZXI+KChfLCByZWplY3QpID0+IHtcbiAgICAgIHRpbWVvdXRIYW5kbGUgPSBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgdGhpcy5tZXRyaWNzLmxvY2tUaW1lb3V0cysrO1xuICAgICAgICByZWplY3QobmV3IEVycm9yKGBMb2NrIG9wZXJhdGlvbiB0aW1lb3V0IGZvciByZXNvdXJjZTogJHtyZXNvdXJjZX1gKSk7XG4gICAgICB9LCB0aW1lb3V0TXMpO1xuICAgIH0pO1xuICAgIFxuICAgIHRyeSB7XG4gICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBQcm9taXNlLnJhY2UoW29wZXJhdGlvbigpLCB0aW1lb3V0UHJvbWlzZV0pO1xuICAgICAgaWYgKHRpbWVvdXRIYW5kbGUpIGNsZWFyVGltZW91dCh0aW1lb3V0SGFuZGxlKTtcbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGlmICh0aW1lb3V0SGFuZGxlKSBjbGVhclRpbWVvdXQodGltZW91dEhhbmRsZSk7XG4gICAgICB0aHJvdyBlcnJvcjtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUGVyZm9ybSBhdG9taWMgZmlsZSB3cml0ZSBvcGVyYXRpb25cbiAgICogV3JpdGVzIHRvIHRlbXBvcmFyeSBmaWxlIHRoZW4gcmVuYW1lcyB0byBlbnN1cmUgYXRvbWljaXR5XG4gICAqL1xuICBzdGF0aWMgYXN5bmMgYXRvbWljV3JpdGVGaWxlKFxuICAgIGZpbGVQYXRoOiBzdHJpbmcsXG4gICAgY29udGVudDogc3RyaW5nLFxuICAgIG9wdGlvbnM/OiB7IGVuY29kaW5nPzogQnVmZmVyRW5jb2RpbmcgfVxuICApOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCB0ZW1wUGF0aCA9IGF3YWl0IHRoaXMuZ2V0VGVtcEZpbGVQYXRoKGZpbGVQYXRoKTtcbiAgICBjb25zdCBkaXIgPSBwYXRoLmRpcm5hbWUodGVtcFBhdGgpO1xuICAgIFxuICAgIHRyeSB7XG4gICAgICAvLyBFbnN1cmUgdGVtcCBkaXJlY3RvcnkgZXhpc3RzXG4gICAgICBhd2FpdCBmcy5ta2RpcihkaXIsIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICAgICAgXG4gICAgICAvLyBXcml0ZSB0byB0ZW1wb3JhcnkgZmlsZVxuICAgICAgYXdhaXQgZnMud3JpdGVGaWxlKHRlbXBQYXRoLCBjb250ZW50LCBvcHRpb25zKTtcbiAgICAgIFxuICAgICAgLy8gQXRvbWljIHJlbmFtZSAob24gc2FtZSBmaWxlc3lzdGVtKVxuICAgICAgYXdhaXQgZnMucmVuYW1lKHRlbXBQYXRoLCBmaWxlUGF0aCk7XG4gICAgICBcbiAgICAgIGxvZ2dlci5kZWJ1ZyhgQXRvbWljIHdyaXRlIGNvbXBsZXRlZDogJHtmaWxlUGF0aH1gKTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgLy8gQ2xlYW4gdXAgdGVtcCBmaWxlIG9uIGVycm9yXG4gICAgICB0cnkge1xuICAgICAgICBhd2FpdCBmcy51bmxpbmsodGVtcFBhdGgpO1xuICAgICAgICBsb2dnZXIuZGVidWcoYENsZWFuZWQgdXAgdGVtcCBmaWxlIGFmdGVyIGVycm9yOiAke3RlbXBQYXRofWApO1xuICAgICAgfSBjYXRjaCAodW5saW5rRXJyb3IpIHtcbiAgICAgICAgLy8gTG9nIGNsZWFudXAgZmFpbHVyZSBidXQgZG9uJ3QgdGhyb3cgLSBvcmlnaW5hbCBlcnJvciBpcyBtb3JlIGltcG9ydGFudFxuICAgICAgICBsb2dnZXIud2FybihgRmFpbGVkIHRvIGNsZWFuIHVwIHRlbXAgZmlsZSAke3RlbXBQYXRofTogJHt1bmxpbmtFcnJvcn1gKTtcbiAgICAgIH1cbiAgICAgIHRocm93IGVycm9yO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBQZXJmb3JtIGF0b21pYyBmaWxlIHJlYWQgd2l0aCBsb2NrXG4gICAqL1xuICBzdGF0aWMgYXN5bmMgYXRvbWljUmVhZEZpbGUoXG4gICAgZmlsZVBhdGg6IHN0cmluZyxcbiAgICBvcHRpb25zPzogeyBlbmNvZGluZz86IEJ1ZmZlckVuY29kaW5nIH1cbiAgKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICByZXR1cm4gdGhpcy53aXRoTG9jayhgZmlsZToke2ZpbGVQYXRofWAsIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IGNvbnRlbnQgPSBhd2FpdCBmcy5yZWFkRmlsZShmaWxlUGF0aCwgb3B0aW9ucyk7XG4gICAgICByZXR1cm4gY29udGVudC50b1N0cmluZygpO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEdlbmVyYXRlIHRlbXBvcmFyeSBmaWxlIHBhdGggZm9yIGF0b21pYyBvcGVyYXRpb25zXG4gICAqL1xuICBwcml2YXRlIHN0YXRpYyBhc3luYyBnZXRUZW1wRmlsZVBhdGgob3JpZ2luYWxQYXRoOiBzdHJpbmcpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIGNvbnN0IGRpciA9IHBhdGguZGlybmFtZShvcmlnaW5hbFBhdGgpO1xuICAgIGNvbnN0IGJhc2VuYW1lID0gcGF0aC5iYXNlbmFtZShvcmlnaW5hbFBhdGgpO1xuICAgIGNvbnN0IHJhbmRvbSA9IHJhbmRvbUJ5dGVzKDgpLnRvU3RyaW5nKCdoZXgnKTtcbiAgICByZXR1cm4gcGF0aC5qb2luKGRpciwgdGhpcy5URU1QX0RJUiwgYCR7YmFzZW5hbWV9LiR7cmFuZG9tfS50bXBgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgbG9jayBtZXRyaWNzIGZvciBtb25pdG9yaW5nXG4gICAqL1xuICBzdGF0aWMgZ2V0TWV0cmljcygpIHtcbiAgICBjb25zdCBhdmdXYWl0VGltZXMgPSBuZXcgTWFwPHN0cmluZywgbnVtYmVyPigpO1xuICAgIGZvciAoY29uc3QgW3Jlc291cmNlLCB0aW1lc10gb2YgdGhpcy5tZXRyaWNzLmxvY2tXYWl0VGltZS5lbnRyaWVzKCkpIHtcbiAgICAgIGlmICh0aW1lcy5sZW5ndGggPiAwKSB7XG4gICAgICAgIGNvbnN0IGF2ZyA9IHRpbWVzLnJlZHVjZSgoYSwgYikgPT4gYSArIGIsIDApIC8gdGltZXMubGVuZ3RoO1xuICAgICAgICBhdmdXYWl0VGltZXMuc2V0KHJlc291cmNlLCBNYXRoLnJvdW5kKGF2ZykpO1xuICAgICAgfVxuICAgIH1cbiAgICBcbiAgICByZXR1cm4ge1xuICAgICAgdG90YWxSZXF1ZXN0czogdGhpcy5tZXRyaWNzLnRvdGFsTG9ja1JlcXVlc3RzLFxuICAgICAgYWN0aXZlTG9ja3NDb3VudDogdGhpcy5sb2Nrcy5zaXplLFxuICAgICAgdGltZW91dHM6IHRoaXMubWV0cmljcy5sb2NrVGltZW91dHMsXG4gICAgICBjb25jdXJyZW50V2FpdHM6IHRoaXMubWV0cmljcy5jb25jdXJyZW50V2FpdHMsXG4gICAgICBhdmdXYWl0VGltZUJ5UmVzb3VyY2U6IE9iamVjdC5mcm9tRW50cmllcyhhdmdXYWl0VGltZXMpLFxuICAgICAgYWN0aXZlTG9ja3M6IEFycmF5LmZyb20odGhpcy5sb2Nrcy5rZXlzKCkpXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDbGVhciBhbGwgbG9ja3MgKHVzZSB3aXRoIGNhdXRpb24gLSBtYWlubHkgZm9yIHRlc3RpbmcpXG4gICAqL1xuICBzdGF0aWMgY2xlYXJBbGxMb2NrcygpOiB2b2lkIHtcbiAgICB0aGlzLmxvY2tzLmNsZWFyKCk7XG4gICAgbG9nZ2VyLndhcm4oJ0FsbCBmaWxlIGxvY2tzIGNsZWFyZWQgLSB1c2Ugb25seSBmb3IgdGVzdGluZy9yZWNvdmVyeScpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlc2V0IG1ldHJpY3NcbiAgICovXG4gIHN0YXRpYyByZXNldE1ldHJpY3MoKTogdm9pZCB7XG4gICAgdGhpcy5tZXRyaWNzID0ge1xuICAgICAgdG90YWxMb2NrUmVxdWVzdHM6IDAsXG4gICAgICBsb2NrV2FpdFRpbWU6IG5ldyBNYXA8c3RyaW5nLCBudW1iZXJbXT4oKSxcbiAgICAgIGxvY2tUaW1lb3V0czogMCxcbiAgICAgIGNvbmN1cnJlbnRXYWl0czogMFxuICAgIH07XG4gIH1cbn0iXX0=
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Security module exports
|
|
3
|
+
*/
|
|
4
|
+
export * from './constants.js';
|
|
5
|
+
export * from './InputValidator.js';
|
|
6
|
+
export * from './contentValidator.js';
|
|
7
|
+
export * from './securityMonitor.js';
|
|
8
|
+
export * from './commandValidator.js';
|
|
9
|
+
export * from './pathValidator.js';
|
|
10
|
+
export * from './yamlValidator.js';
|
|
11
|
+
export * from './fileLockManager.js';
|
|
12
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/security/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,cAAc,gBAAgB,CAAC;AAC/B,cAAc,qBAAqB,CAAC;AACpC,cAAc,uBAAuB,CAAC;AACtC,cAAc,sBAAsB,CAAC;AACrC,cAAc,uBAAuB,CAAC;AACtC,cAAc,oBAAoB,CAAC;AACnC,cAAc,oBAAoB,CAAC;AACnC,cAAc,sBAAsB,CAAC"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Security module exports
|
|
3
|
+
*/
|
|
4
|
+
export * from './constants.js';
|
|
5
|
+
export * from './InputValidator.js';
|
|
6
|
+
export * from './contentValidator.js';
|
|
7
|
+
export * from './securityMonitor.js';
|
|
8
|
+
export * from './commandValidator.js';
|
|
9
|
+
export * from './pathValidator.js';
|
|
10
|
+
export * from './yamlValidator.js';
|
|
11
|
+
export * from './fileLockManager.js';
|
|
12
|
+
// Export security functionality when ready
|
|
13
|
+
// export * from './RateLimiter.js';
|
|
14
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvc2VjdXJpdHkvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7O0dBRUc7QUFFSCxjQUFjLGdCQUFnQixDQUFDO0FBQy9CLGNBQWMscUJBQXFCLENBQUM7QUFDcEMsY0FBYyx1QkFBdUIsQ0FBQztBQUN0QyxjQUFjLHNCQUFzQixDQUFDO0FBQ3JDLGNBQWMsdUJBQXVCLENBQUM7QUFDdEMsY0FBYyxvQkFBb0IsQ0FBQztBQUNuQyxjQUFjLG9CQUFvQixDQUFDO0FBQ25DLGNBQWMsc0JBQXNCLENBQUM7QUFDckMsMkNBQTJDO0FBQzNDLG9DQUFvQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogU2VjdXJpdHkgbW9kdWxlIGV4cG9ydHNcbiAqL1xuXG5leHBvcnQgKiBmcm9tICcuL2NvbnN0YW50cy5qcyc7XG5leHBvcnQgKiBmcm9tICcuL0lucHV0VmFsaWRhdG9yLmpzJztcbmV4cG9ydCAqIGZyb20gJy4vY29udGVudFZhbGlkYXRvci5qcyc7XG5leHBvcnQgKiBmcm9tICcuL3NlY3VyaXR5TW9uaXRvci5qcyc7XG5leHBvcnQgKiBmcm9tICcuL2NvbW1hbmRWYWxpZGF0b3IuanMnO1xuZXhwb3J0ICogZnJvbSAnLi9wYXRoVmFsaWRhdG9yLmpzJztcbmV4cG9ydCAqIGZyb20gJy4veWFtbFZhbGlkYXRvci5qcyc7XG5leHBvcnQgKiBmcm9tICcuL2ZpbGVMb2NrTWFuYWdlci5qcyc7XG4vLyBFeHBvcnQgc2VjdXJpdHkgZnVuY3Rpb25hbGl0eSB3aGVuIHJlYWR5XG4vLyBleHBvcnQgKiBmcm9tICcuL1JhdGVMaW1pdGVyLmpzJzsiXX0=
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
export declare class PathValidator {
|
|
2
|
+
private static ALLOWED_DIRECTORIES;
|
|
3
|
+
private static ALLOWED_EXTENSIONS;
|
|
4
|
+
static initialize(personasDir: string, allowedExtensions?: string[]): void;
|
|
5
|
+
static validatePersonaPath(userPath: string): Promise<string>;
|
|
6
|
+
static safeReadFile(filePath: string): Promise<string>;
|
|
7
|
+
static safeWriteFile(filePath: string, content: string): Promise<void>;
|
|
8
|
+
}
|
|
9
|
+
//# sourceMappingURL=pathValidator.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pathValidator.d.ts","sourceRoot":"","sources":["../../../src/security/pathValidator.ts"],"names":[],"mappings":"AAIA,qBAAa,aAAa;IACxB,OAAO,CAAC,MAAM,CAAC,mBAAmB,CAAgB;IAClD,OAAO,CAAC,MAAM,CAAC,kBAAkB,CAA2D;IAE5F,MAAM,CAAC,UAAU,CAAC,WAAW,EAAE,MAAM,EAAE,iBAAiB,CAAC,EAAE,MAAM,EAAE,GAAG,IAAI;WAc7D,mBAAmB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;WA8DtD,YAAY,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;WAiB/C,aAAa,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;CAmB7E"}
|