@dollhousemcp/mcp-server 1.5.2 → 1.6.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 +56 -0
- package/README.md +494 -111
- package/data/agents/code-reviewer.md +8 -1
- package/data/agents/research-assistant.md +8 -1
- package/data/agents/task-manager.md +8 -1
- package/data/ensembles/business-advisor.md +8 -1
- package/data/ensembles/creative-studio.md +8 -1
- package/data/ensembles/development-team.md +8 -1
- package/data/ensembles/security-analysis-team.md +8 -1
- package/data/memories/conversation-history.md +8 -1
- package/data/memories/learning-progress.md +8 -1
- package/data/memories/project-context.md +8 -1
- package/data/personas/business-consultant.md +8 -1
- package/data/personas/creative-writer.md +8 -1
- package/data/personas/debug-detective.md +8 -1
- package/data/personas/eli5-explainer.md +8 -1
- package/data/personas/security-analyst.md +8 -1
- package/data/personas/technical-analyst.md +8 -1
- package/data/skills/code-review.md +8 -1
- package/data/skills/creative-writing.md +8 -1
- package/data/skills/data-analysis.md +8 -1
- package/data/skills/penetration-testing.md +8 -1
- package/data/skills/research.md +8 -1
- package/data/skills/threat-modeling.md +8 -1
- package/data/skills/translation.md +8 -1
- package/data/templates/code-documentation.md +8 -1
- package/data/templates/email-professional.md +8 -1
- package/data/templates/meeting-notes.md +8 -1
- package/data/templates/penetration-test-report.md +8 -1
- package/data/templates/project-brief.md +8 -1
- package/data/templates/report-executive.md +8 -1
- package/data/templates/security-vulnerability-report.md +8 -1
- package/data/templates/threat-assessment-report.md +8 -1
- package/dist/auth/GitHubAuthManager.d.ts +6 -1
- package/dist/auth/GitHubAuthManager.d.ts.map +1 -1
- package/dist/auth/GitHubAuthManager.js +45 -18
- package/dist/benchmarks/IndexPerformanceBenchmark.d.ts +98 -0
- package/dist/benchmarks/IndexPerformanceBenchmark.d.ts.map +1 -0
- package/dist/benchmarks/IndexPerformanceBenchmark.js +531 -0
- package/dist/cache/CollectionCache.d.ts.map +1 -1
- package/dist/cache/CollectionCache.js +13 -3
- package/dist/cache/CollectionIndexCache.d.ts +77 -0
- package/dist/cache/CollectionIndexCache.d.ts.map +1 -0
- package/dist/cache/CollectionIndexCache.js +349 -0
- package/dist/cache/LRUCache.d.ts +93 -0
- package/dist/cache/LRUCache.d.ts.map +1 -0
- package/dist/cache/LRUCache.js +299 -0
- package/dist/cache/index.d.ts +1 -0
- package/dist/cache/index.d.ts.map +1 -1
- package/dist/cache/index.js +2 -1
- package/dist/collection/CollectionBrowser.d.ts +21 -1
- package/dist/collection/CollectionBrowser.d.ts.map +1 -1
- package/dist/collection/CollectionBrowser.js +130 -10
- package/dist/collection/CollectionIndexManager.d.ts +151 -0
- package/dist/collection/CollectionIndexManager.d.ts.map +1 -0
- package/dist/collection/CollectionIndexManager.js +499 -0
- package/dist/collection/CollectionSearch.d.ts +55 -0
- package/dist/collection/CollectionSearch.d.ts.map +1 -1
- package/dist/collection/CollectionSearch.js +338 -13
- package/dist/collection/CollectionSeeder.d.ts.map +1 -1
- package/dist/collection/CollectionSeeder.js +38 -1
- package/dist/collection/ElementInstaller.d.ts +31 -0
- package/dist/collection/ElementInstaller.d.ts.map +1 -1
- package/dist/collection/ElementInstaller.js +77 -15
- package/dist/collection/PersonaSubmitter.d.ts +1 -1
- package/dist/collection/PersonaSubmitter.d.ts.map +1 -1
- package/dist/collection/PersonaSubmitter.js +2 -2
- package/dist/collection/index.d.ts +1 -0
- package/dist/collection/index.d.ts.map +1 -1
- package/dist/collection/index.js +2 -1
- package/dist/config/ConfigManager.d.ts +78 -0
- package/dist/config/ConfigManager.d.ts.map +1 -0
- package/dist/config/ConfigManager.js +216 -0
- package/dist/config/element-types.d.ts +135 -0
- package/dist/config/element-types.d.ts.map +1 -0
- package/dist/config/element-types.js +108 -0
- package/dist/config/index.d.ts +2 -0
- package/dist/config/index.d.ts.map +1 -1
- package/dist/config/index.js +3 -1
- package/dist/config/portfolio-constants.d.ts +83 -0
- package/dist/config/portfolio-constants.d.ts.map +1 -0
- package/dist/config/portfolio-constants.js +99 -0
- package/dist/elements/BaseElement.d.ts +14 -2
- package/dist/elements/BaseElement.d.ts.map +1 -1
- package/dist/elements/BaseElement.js +88 -6
- package/dist/elements/agents/Agent.d.ts +10 -1
- package/dist/elements/agents/Agent.d.ts.map +1 -1
- package/dist/elements/agents/Agent.js +66 -19
- package/dist/elements/agents/AgentManager.d.ts +2 -0
- package/dist/elements/agents/AgentManager.d.ts.map +1 -1
- package/dist/elements/agents/AgentManager.js +12 -10
- package/dist/elements/skills/Skill.d.ts +10 -1
- package/dist/elements/skills/Skill.d.ts.map +1 -1
- package/dist/elements/skills/Skill.js +40 -3
- package/dist/elements/skills/SkillManager.d.ts +1 -0
- package/dist/elements/skills/SkillManager.d.ts.map +1 -1
- package/dist/elements/skills/SkillManager.js +10 -4
- package/dist/elements/templates/Template.d.ts +10 -1
- package/dist/elements/templates/Template.d.ts.map +1 -1
- package/dist/elements/templates/Template.js +35 -18
- package/dist/elements/templates/TemplateManager.d.ts +1 -1
- package/dist/elements/templates/TemplateManager.d.ts.map +1 -1
- package/dist/elements/templates/TemplateManager.js +6 -5
- package/dist/generated/version.d.ts +2 -2
- package/dist/generated/version.js +3 -3
- package/dist/index.barrel.d.ts +1 -2
- package/dist/index.barrel.d.ts.map +1 -1
- package/dist/index.barrel.js +2 -4
- package/dist/index.d.ts +143 -25
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1883 -310
- package/dist/persona/PersonaElement.d.ts +10 -0
- package/dist/persona/PersonaElement.d.ts.map +1 -1
- package/dist/persona/PersonaElement.js +55 -32
- package/dist/persona/PersonaElementManager.d.ts.map +1 -1
- package/dist/persona/PersonaElementManager.js +13 -11
- package/dist/persona/PersonaLoader.d.ts.map +1 -1
- package/dist/persona/PersonaLoader.js +8 -2
- package/dist/persona/export-import/PersonaImporter.d.ts.map +1 -1
- package/dist/persona/export-import/PersonaImporter.js +24 -5
- package/dist/persona/export-import/PersonaSharer.d.ts +21 -0
- package/dist/persona/export-import/PersonaSharer.d.ts.map +1 -1
- package/dist/persona/export-import/PersonaSharer.js +198 -22
- package/dist/portfolio/DefaultElementProvider.d.ts +90 -0
- package/dist/portfolio/DefaultElementProvider.d.ts.map +1 -1
- package/dist/portfolio/DefaultElementProvider.js +499 -7
- package/dist/portfolio/GitHubPortfolioIndexer.d.ts +129 -0
- package/dist/portfolio/GitHubPortfolioIndexer.d.ts.map +1 -0
- package/dist/portfolio/GitHubPortfolioIndexer.js +475 -0
- package/dist/portfolio/MigrationManager.d.ts.map +1 -1
- package/dist/portfolio/MigrationManager.js +136 -3
- package/dist/portfolio/PortfolioIndexManager.d.ts +130 -0
- package/dist/portfolio/PortfolioIndexManager.d.ts.map +1 -0
- package/dist/portfolio/PortfolioIndexManager.js +478 -0
- package/dist/portfolio/PortfolioManager.d.ts +5 -0
- package/dist/portfolio/PortfolioManager.d.ts.map +1 -1
- package/dist/portfolio/PortfolioManager.js +61 -20
- package/dist/portfolio/PortfolioRepoManager.d.ts +75 -0
- package/dist/portfolio/PortfolioRepoManager.d.ts.map +1 -0
- package/dist/portfolio/PortfolioRepoManager.js +337 -0
- package/dist/portfolio/UnifiedIndexManager.d.ts +388 -0
- package/dist/portfolio/UnifiedIndexManager.d.ts.map +1 -0
- package/dist/portfolio/UnifiedIndexManager.js +1434 -0
- package/dist/portfolio/index.d.ts +15 -0
- package/dist/portfolio/index.d.ts.map +1 -0
- package/dist/portfolio/index.js +15 -0
- package/dist/portfolio/types.d.ts +7 -0
- package/dist/portfolio/types.d.ts.map +1 -1
- package/dist/portfolio/types.js +6 -1
- package/dist/security/InputValidator.d.ts.map +1 -1
- package/dist/security/InputValidator.js +50 -48
- package/dist/security/audit/SecurityAuditor.d.ts.map +1 -1
- package/dist/security/audit/SecurityAuditor.js +17 -9
- package/dist/security/audit/config/suppressions.d.ts.map +1 -1
- package/dist/security/audit/config/suppressions.js +19 -3
- package/dist/security/contentValidator.d.ts +2 -0
- package/dist/security/contentValidator.d.ts.map +1 -1
- package/dist/security/contentValidator.js +115 -4
- package/dist/security/secureYamlParser.d.ts +1 -0
- package/dist/security/secureYamlParser.d.ts.map +1 -1
- package/dist/security/secureYamlParser.js +29 -7
- package/dist/security/securityMonitor.d.ts +1 -1
- package/dist/security/securityMonitor.d.ts.map +1 -1
- package/dist/security/securityMonitor.js +1 -1
- package/dist/security/tokenManager.d.ts +1 -1
- package/dist/security/tokenManager.d.ts.map +1 -1
- package/dist/security/tokenManager.js +30 -10
- package/dist/server/ServerSetup.d.ts +22 -2
- package/dist/server/ServerSetup.d.ts.map +1 -1
- package/dist/server/ServerSetup.js +77 -12
- package/dist/server/tools/AuthTools.d.ts.map +1 -1
- package/dist/server/tools/AuthTools.js +33 -1
- package/dist/server/tools/BuildInfoTools.d.ts +25 -0
- package/dist/server/tools/BuildInfoTools.d.ts.map +1 -0
- package/dist/server/tools/BuildInfoTools.js +36 -0
- package/dist/server/tools/CollectionTools.d.ts.map +1 -1
- package/dist/server/tools/CollectionTools.js +55 -46
- package/dist/server/tools/ConfigTools.d.ts.map +1 -1
- package/dist/server/tools/ConfigTools.js +29 -1
- package/dist/server/tools/PersonaTools.d.ts +4 -2
- package/dist/server/tools/PersonaTools.d.ts.map +1 -1
- package/dist/server/tools/PersonaTools.js +5 -152
- package/dist/server/tools/PortfolioTools.d.ts +12 -0
- package/dist/server/tools/PortfolioTools.d.ts.map +1 -0
- package/dist/server/tools/PortfolioTools.js +221 -0
- package/dist/server/tools/index.d.ts +3 -1
- package/dist/server/tools/index.d.ts.map +1 -1
- package/dist/server/tools/index.js +4 -2
- package/dist/server/types.d.ts +40 -5
- package/dist/server/types.d.ts.map +1 -1
- package/dist/server/types.js +1 -1
- package/dist/services/BuildInfoService.d.ts +84 -0
- package/dist/services/BuildInfoService.d.ts.map +1 -0
- package/dist/services/BuildInfoService.js +271 -0
- package/dist/tools/portfolio/PortfolioElementAdapter.d.ts +54 -0
- package/dist/tools/portfolio/PortfolioElementAdapter.d.ts.map +1 -0
- package/dist/tools/portfolio/PortfolioElementAdapter.js +229 -0
- package/dist/tools/portfolio/submitToPortfolioTool.d.ts +164 -0
- package/dist/tools/portfolio/submitToPortfolioTool.d.ts.map +1 -0
- package/dist/tools/portfolio/submitToPortfolioTool.js +1523 -0
- package/dist/tools/portfolio/types.d.ts +41 -0
- package/dist/tools/portfolio/types.d.ts.map +1 -0
- package/dist/tools/portfolio/types.js +15 -0
- package/dist/types/collection.d.ts +51 -0
- package/dist/types/collection.d.ts.map +1 -1
- package/dist/types/collection.js +1 -1
- package/dist/utils/EarlyTerminationSearch.d.ts +41 -0
- package/dist/utils/EarlyTerminationSearch.d.ts.map +1 -0
- package/dist/utils/EarlyTerminationSearch.js +164 -0
- package/dist/utils/ErrorHandler.d.ts +86 -0
- package/dist/utils/ErrorHandler.d.ts.map +1 -0
- package/dist/utils/ErrorHandler.js +201 -0
- package/dist/utils/FileDiscoveryUtil.d.ts +53 -0
- package/dist/utils/FileDiscoveryUtil.d.ts.map +1 -0
- package/dist/utils/FileDiscoveryUtil.js +169 -0
- package/dist/utils/GitHubRateLimiter.d.ts +88 -0
- package/dist/utils/GitHubRateLimiter.d.ts.map +1 -0
- package/dist/utils/GitHubRateLimiter.js +315 -0
- package/dist/utils/PerformanceMonitor.d.ts +134 -0
- package/dist/utils/PerformanceMonitor.d.ts.map +1 -0
- package/dist/utils/PerformanceMonitor.js +347 -0
- package/dist/utils/RateLimiter.d.ts.map +1 -0
- package/dist/utils/RateLimiter.js +172 -0
- package/dist/utils/SecureDownloader.d.ts +241 -0
- package/dist/utils/SecureDownloader.d.ts.map +1 -0
- package/dist/utils/SecureDownloader.js +759 -0
- package/dist/utils/ToolCache.d.ts +82 -0
- package/dist/utils/ToolCache.d.ts.map +1 -0
- package/dist/utils/ToolCache.js +196 -0
- package/dist/utils/errorCodes.d.ts +136 -0
- package/dist/utils/errorCodes.d.ts.map +1 -0
- package/dist/utils/errorCodes.js +87 -0
- package/dist/utils/index.d.ts +3 -0
- package/dist/utils/index.d.ts.map +1 -1
- package/dist/utils/index.js +4 -1
- package/dist/utils/installation.d.ts +1 -1
- package/dist/utils/installation.d.ts.map +1 -1
- package/dist/utils/installation.js +9 -8
- package/dist/utils/searchUtils.d.ts +31 -0
- package/dist/utils/searchUtils.d.ts.map +1 -1
- package/dist/utils/searchUtils.js +62 -1
- package/package.json +17 -7
- package/dist/config/updateConfig.d.ts +0 -84
- package/dist/config/updateConfig.d.ts.map +0 -1
- package/dist/config/updateConfig.js +0 -148
- package/dist/server/tools/UpdateTools.d.ts +0 -10
- package/dist/server/tools/UpdateTools.d.ts.map +0 -1
- package/dist/server/tools/UpdateTools.js +0 -85
- package/dist/update/BackupManager.d.ts +0 -63
- package/dist/update/BackupManager.d.ts.map +0 -1
- package/dist/update/BackupManager.js +0 -370
- package/dist/update/DependencyChecker.d.ts +0 -41
- package/dist/update/DependencyChecker.d.ts.map +0 -1
- package/dist/update/DependencyChecker.js +0 -132
- package/dist/update/RateLimiter.d.ts.map +0 -1
- package/dist/update/RateLimiter.js +0 -172
- package/dist/update/SignatureVerifier.d.ts +0 -71
- package/dist/update/SignatureVerifier.d.ts.map +0 -1
- package/dist/update/SignatureVerifier.js +0 -214
- package/dist/update/UpdateChecker.d.ts +0 -132
- package/dist/update/UpdateChecker.d.ts.map +0 -1
- package/dist/update/UpdateChecker.js +0 -506
- package/dist/update/UpdateManager.d.ts +0 -60
- package/dist/update/UpdateManager.d.ts.map +0 -1
- package/dist/update/UpdateManager.js +0 -730
- package/dist/update/VersionManager.d.ts +0 -31
- package/dist/update/VersionManager.d.ts.map +0 -1
- package/dist/update/VersionManager.js +0 -181
- package/dist/update/index.d.ts +0 -9
- package/dist/update/index.d.ts.map +0 -1
- package/dist/update/index.js +0 -9
- /package/dist/{update → utils}/RateLimiter.d.ts +0 -0
|
@@ -3,24 +3,58 @@
|
|
|
3
3
|
*/
|
|
4
4
|
import { CollectionCache } from '../cache/CollectionCache.js';
|
|
5
5
|
import { CollectionSeeder } from './CollectionSeeder.js';
|
|
6
|
+
import { CollectionIndexManager } from './CollectionIndexManager.js';
|
|
6
7
|
import { logger } from '../utils/logger.js';
|
|
8
|
+
import { ElementType } from '../portfolio/types.js';
|
|
9
|
+
// Content types supported by MCP server (Issue #144)
|
|
10
|
+
// Hide: memories, ensembles from MCP queries
|
|
11
|
+
// ⚠️ CRITICAL: When adding new element types, you MUST update this array!
|
|
12
|
+
// Also update validTypes array in src/index.ts
|
|
13
|
+
// See docs/development/ADDING_NEW_ELEMENT_TYPES_CHECKLIST.md for complete guide
|
|
14
|
+
const MCP_SUPPORTED_TYPES = [
|
|
15
|
+
ElementType.PERSONA, // personas - supported by PersonaTools and ElementTools
|
|
16
|
+
ElementType.SKILL, // skills - supported by ElementTools
|
|
17
|
+
ElementType.AGENT, // agents - supported by ElementTools
|
|
18
|
+
ElementType.TEMPLATE // templates - supported by ElementTools
|
|
19
|
+
];
|
|
20
|
+
/**
|
|
21
|
+
* Type guard to safely check if a string is a valid ElementType
|
|
22
|
+
*/
|
|
23
|
+
function isElementType(value) {
|
|
24
|
+
return Object.values(ElementType).includes(value);
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* Type guard to safely check if an ElementType is supported by MCP
|
|
28
|
+
*/
|
|
29
|
+
function isMCPSupportedType(elementType) {
|
|
30
|
+
return MCP_SUPPORTED_TYPES.includes(elementType);
|
|
31
|
+
}
|
|
7
32
|
export class CollectionBrowser {
|
|
8
33
|
githubClient;
|
|
9
34
|
collectionCache;
|
|
35
|
+
indexManager;
|
|
10
36
|
baseUrl = 'https://api.github.com/repos/DollhouseMCP/collection/contents';
|
|
11
|
-
constructor(githubClient, collectionCache) {
|
|
37
|
+
constructor(githubClient, collectionCache, indexManager) {
|
|
12
38
|
this.githubClient = githubClient;
|
|
13
39
|
this.collectionCache = collectionCache || new CollectionCache();
|
|
40
|
+
this.indexManager = indexManager || new CollectionIndexManager();
|
|
14
41
|
}
|
|
15
42
|
/**
|
|
16
43
|
* Browse collection content by section and type
|
|
44
|
+
* Uses CollectionIndexManager for fast browsing with background refresh
|
|
17
45
|
* Falls back to cached data when GitHub API is not available or not authenticated
|
|
18
46
|
* @param section - Top level section: library, showcase, or catalog
|
|
19
47
|
* @param type - Optional content type within the library section (personas, skills, etc.)
|
|
20
48
|
*/
|
|
21
49
|
async browseCollection(section, type) {
|
|
22
50
|
try {
|
|
23
|
-
// Try
|
|
51
|
+
// Try using collection index first for faster browsing
|
|
52
|
+
const indexResult = await this.browseFromIndex(section, type);
|
|
53
|
+
if (indexResult) {
|
|
54
|
+
logger.debug('Used collection index for browsing');
|
|
55
|
+
return indexResult;
|
|
56
|
+
}
|
|
57
|
+
// Fallback to GitHub API
|
|
24
58
|
let url = this.baseUrl;
|
|
25
59
|
// If no section provided, show top-level sections
|
|
26
60
|
if (!section) {
|
|
@@ -42,7 +76,13 @@ export class CollectionBrowser {
|
|
|
42
76
|
}
|
|
43
77
|
// In the library section, we have content type directories
|
|
44
78
|
if (section === 'library' && !type) {
|
|
45
|
-
|
|
79
|
+
// Filter to only show MCP-supported content types
|
|
80
|
+
const contentTypes = data.filter((item) => {
|
|
81
|
+
if (item.type !== 'dir')
|
|
82
|
+
return false;
|
|
83
|
+
const elementType = isElementType(item.name) ? item.name : null;
|
|
84
|
+
return elementType && isMCPSupportedType(elementType);
|
|
85
|
+
});
|
|
46
86
|
return { items: [], categories: contentTypes };
|
|
47
87
|
}
|
|
48
88
|
// For library content types, show files directly (flat structure)
|
|
@@ -57,6 +97,85 @@ export class CollectionBrowser {
|
|
|
57
97
|
return this.browseFromCache(section, type);
|
|
58
98
|
}
|
|
59
99
|
}
|
|
100
|
+
/**
|
|
101
|
+
* Browse collection using the fast collection index
|
|
102
|
+
* Returns null if index is not available or browsing fails
|
|
103
|
+
*/
|
|
104
|
+
async browseFromIndex(section, type) {
|
|
105
|
+
try {
|
|
106
|
+
const index = await this.indexManager.getIndex();
|
|
107
|
+
// If no section provided, show top-level sections
|
|
108
|
+
if (!section) {
|
|
109
|
+
const sections = [
|
|
110
|
+
{ name: 'library', type: 'dir' },
|
|
111
|
+
{ name: 'showcase', type: 'dir' },
|
|
112
|
+
{ name: 'catalog', type: 'dir' }
|
|
113
|
+
];
|
|
114
|
+
return { items: [], categories: [], sections };
|
|
115
|
+
}
|
|
116
|
+
// In the library section, we have content type directories
|
|
117
|
+
if (section === 'library' && !type) {
|
|
118
|
+
// Get unique content types from index
|
|
119
|
+
const contentTypes = this.getContentTypesFromIndex(index);
|
|
120
|
+
return { items: [], categories: contentTypes };
|
|
121
|
+
}
|
|
122
|
+
// Get items for specific type or all items in section
|
|
123
|
+
const items = this.getItemsFromIndex(index, section, type);
|
|
124
|
+
const formattedItems = this.convertIndexItemsToGitHubFormat(items);
|
|
125
|
+
return { items: formattedItems, categories: [] };
|
|
126
|
+
}
|
|
127
|
+
catch (error) {
|
|
128
|
+
logger.debug('Failed to browse from collection index', { error: error instanceof Error ? error.message : String(error) });
|
|
129
|
+
return null;
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
/**
|
|
133
|
+
* Get unique content types from collection index
|
|
134
|
+
*/
|
|
135
|
+
getContentTypesFromIndex(index) {
|
|
136
|
+
const types = new Set();
|
|
137
|
+
// Extract types from index keys and filter for MCP-supported types
|
|
138
|
+
Object.keys(index.index).forEach(typeName => {
|
|
139
|
+
const elementType = isElementType(typeName) ? typeName : null;
|
|
140
|
+
if (elementType && isMCPSupportedType(elementType)) {
|
|
141
|
+
types.add(typeName);
|
|
142
|
+
}
|
|
143
|
+
});
|
|
144
|
+
return Array.from(types).map(type => ({
|
|
145
|
+
name: type,
|
|
146
|
+
type: 'dir'
|
|
147
|
+
}));
|
|
148
|
+
}
|
|
149
|
+
/**
|
|
150
|
+
* Get items from collection index by section and type
|
|
151
|
+
*/
|
|
152
|
+
getItemsFromIndex(index, section, type) {
|
|
153
|
+
// For library section with type, get items from that type
|
|
154
|
+
if (section === 'library' && type) {
|
|
155
|
+
return index.index[type] || [];
|
|
156
|
+
}
|
|
157
|
+
// For library section without type, return empty (should show categories)
|
|
158
|
+
if (section === 'library' && !type) {
|
|
159
|
+
return [];
|
|
160
|
+
}
|
|
161
|
+
// For other sections (showcase, catalog), return all items that match
|
|
162
|
+
// Note: The current index structure is primarily for library content
|
|
163
|
+
// Future enhancement: extend index to include showcase/catalog sections
|
|
164
|
+
return [];
|
|
165
|
+
}
|
|
166
|
+
/**
|
|
167
|
+
* Convert index entries to GitHub API format for compatibility
|
|
168
|
+
*/
|
|
169
|
+
convertIndexItemsToGitHubFormat(items) {
|
|
170
|
+
return items.map(item => ({
|
|
171
|
+
name: item.name.endsWith('.md') ? item.name : `${item.name}.md`,
|
|
172
|
+
path: item.path,
|
|
173
|
+
sha: item.sha,
|
|
174
|
+
type: 'file',
|
|
175
|
+
url: `https://api.github.com/repos/DollhouseMCP/collection/contents/${item.path}`,
|
|
176
|
+
html_url: `https://github.com/DollhouseMCP/collection/blob/main/${item.path}`
|
|
177
|
+
}));
|
|
178
|
+
}
|
|
60
179
|
/**
|
|
61
180
|
* Browse collection from cached data
|
|
62
181
|
*/
|
|
@@ -119,7 +238,12 @@ export class CollectionBrowser {
|
|
|
119
238
|
items.forEach(item => {
|
|
120
239
|
const pathParts = item.path.split('/');
|
|
121
240
|
if (pathParts.length >= 2 && pathParts[0] === 'library') {
|
|
122
|
-
types
|
|
241
|
+
// Only include MCP-supported types in cache browsing
|
|
242
|
+
const typeName = pathParts[1];
|
|
243
|
+
const elementType = isElementType(typeName) ? typeName : null;
|
|
244
|
+
if (elementType && isMCPSupportedType(elementType)) {
|
|
245
|
+
types.add(typeName);
|
|
246
|
+
}
|
|
123
247
|
}
|
|
124
248
|
});
|
|
125
249
|
return Array.from(types).map(type => ({
|
|
@@ -172,7 +296,7 @@ export class CollectionBrowser {
|
|
|
172
296
|
const icon = sectionIcons[sec.name] || '📁';
|
|
173
297
|
const descriptions = {
|
|
174
298
|
'library': 'Free community content',
|
|
175
|
-
'showcase': 'Featured high-quality content',
|
|
299
|
+
'showcase': 'Featured high-quality content (coming soon)',
|
|
176
300
|
'catalog': 'Premium content (coming soon)'
|
|
177
301
|
};
|
|
178
302
|
textParts.push(` ${icon} **${sec.name}** - ${descriptions[sec.name] || 'Content collection'}\n`, ` Browse: \`browse_collection "${sec.name}"\`\n\n`);
|
|
@@ -187,9 +311,7 @@ export class CollectionBrowser {
|
|
|
187
311
|
'personas': '🎭',
|
|
188
312
|
'skills': '🛠️',
|
|
189
313
|
'agents': '🤖',
|
|
190
|
-
'prompts': '💬',
|
|
191
314
|
'templates': '📄',
|
|
192
|
-
'tools': '🔧',
|
|
193
315
|
'ensembles': '🎼',
|
|
194
316
|
'memories': '🧠'
|
|
195
317
|
};
|
|
@@ -213,9 +335,7 @@ export class CollectionBrowser {
|
|
|
213
335
|
'personas': '🎭',
|
|
214
336
|
'skills': '🛠️',
|
|
215
337
|
'agents': '🤖',
|
|
216
|
-
'prompts': '💬',
|
|
217
338
|
'templates': '📄',
|
|
218
|
-
'tools': '🔧',
|
|
219
339
|
'ensembles': '🎼',
|
|
220
340
|
'memories': '🧠'
|
|
221
341
|
};
|
|
@@ -229,4 +349,4 @@ export class CollectionBrowser {
|
|
|
229
349
|
return textParts.join('');
|
|
230
350
|
}
|
|
231
351
|
}
|
|
232
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQ29sbGVjdGlvbkJyb3dzZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvY29sbGVjdGlvbi9Db2xsZWN0aW9uQnJvd3Nlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7R0FFRztBQUdILE9BQU8sRUFBRSxlQUFlLEVBQWtCLE1BQU0sNkJBQTZCLENBQUM7QUFDOUUsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFDekQsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBRTVDLE1BQU0sT0FBTyxpQkFBaUI7SUFDcEIsWUFBWSxDQUFlO0lBQzNCLGVBQWUsQ0FBa0I7SUFDakMsT0FBTyxHQUFHLCtEQUErRCxDQUFDO0lBRWxGLFlBQVksWUFBMEIsRUFBRSxlQUFpQztRQUN2RSxJQUFJLENBQUMsWUFBWSxHQUFHLFlBQVksQ0FBQztRQUNqQyxJQUFJLENBQUMsZUFBZSxHQUFHLGVBQWUsSUFBSSxJQUFJLGVBQWUsRUFBRSxDQUFDO0lBQ2xFLENBQUM7SUFFRDs7Ozs7T0FLRztJQUNILEtBQUssQ0FBQyxnQkFBZ0IsQ0FBQyxPQUFnQixFQUFFLElBQWE7UUFDcEQsSUFBSSxDQUFDO1lBQ0gsdUJBQXVCO1lBQ3ZCLElBQUksR0FBRyxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUM7WUFFdkIsa0RBQWtEO1lBQ2xELElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQztnQkFDYixNQUFNLElBQUksR0FBRyxNQUFNLElBQUksQ0FBQyxZQUFZLENBQUMsZUFBZSxDQUFDLEdBQUcsRUFBRSxLQUFLLENBQUMsQ0FBQztnQkFDakUsSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQztvQkFDekIsTUFBTSxJQUFJLEtBQUssQ0FBQywwREFBMEQsQ0FBQyxDQUFDO2dCQUM5RSxDQUFDO2dCQUVELDBDQUEwQztnQkFDMUMsTUFBTSxRQUFRLEdBQUcsSUFBSSxD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QUM7WUFDeEosS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDLElBQVMsRUFBRSxFQUFFO2dCQUMxQixNQUFNLFFBQVEsR0FBRyxPQUFPLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLElBQUksSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDO2dCQUN0RSxTQUFTLENBQUMsSUFBSSxDQUNaLFdBQVcsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxNQUFNLEVBQzdDLHdDQUF3QyxRQUFRLE9BQU8sRUFDdkQsZ0RBQWdELFFBQVEsU0FBUyxDQUNsRSxDQUFDO1lBQ0osQ0FBQyxDQUFDLENBQUM7UUFDTCxDQUFDO1FBRUQsT0FBTyxTQUFTLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDO0lBQzVCLENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQnJvd3NlIGNvbGxlY3Rpb24gY29udGVudCBmcm9tIEdpdEh1YlxuICovXG5cbmltcG9ydCB7IEdpdEh1YkNsaWVudCB9IGZyb20gJy4vR2l0SHViQ2xpZW50LmpzJztcbmltcG9ydCB7IENvbGxlY3Rpb25DYWNoZSwgQ29sbGVjdGlvbkl0ZW0gfSBmcm9tICcuLi9jYWNoZS9Db2xsZWN0aW9uQ2FjaGUuanMnO1xuaW1wb3J0IHsgQ29sbGVjdGlvblNlZWRlciB9IGZyb20gJy4vQ29sbGVjdGlvblNlZWRlci5qcyc7XG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi91dGlscy9sb2dnZXIuanMnO1xuXG5leHBvcnQgY2xhc3MgQ29sbGVjdGlvbkJyb3dzZXIge1xuICBwcml2YXRlIGdpdGh1YkNsaWVudDogR2l0SHViQ2xpZW50O1xuICBwcml2YXRlIGNvbGxlY3Rpb25DYWNoZTogQ29sbGVjdGlvbkNhY2hlO1xuICBwcml2YXRlIGJhc2VVcmwgPSAnaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS9yZXBvcy9Eb2xsaG91c2VNQ1AvY29sbGVjdGlvbi9jb250ZW50cyc7XG4gIFxuICBjb25zdHJ1Y3RvcihnaXRodWJDbGllbnQ6IEdpdEh1YkNsaWVudCwgY29sbGVjdGlvbkNhY2hlPzogQ29sbGVjdGlvbkNhY2hlKSB7XG4gICAgdGhpcy5naXRodWJDbGllbnQgPSBnaXRodWJDbGllbnQ7XG4gICAgdGhpcy5jb2xsZWN0aW9uQ2FjaGUgPSBjb2xsZWN0aW9uQ2FjaGUgfHwgbmV3IENvbGxlY3Rpb25DYWNoZSgpO1xuICB9XG4gIFxuICAvKipcbiAgICogQnJvd3NlIGNvbGxlY3Rpb24gY29udGVudCBieSBzZWN0aW9uIGFuZCB0eXBlXG4gICAqIEZhbGxzIGJhY2sgdG8gY2FjaGVkIGRhdGEgd2hlbiBHaXRIdWIgQVBJIGlzIG5vdCBhdmFpbGFibGUgb3Igbm90IGF1dGhlbnRpY2F0ZWRcbiAgICogQHBhcmFtIHNlY3Rpb24gLSBUb3AgbGV2ZWwgc2VjdGlvbjogbGlicmFyeSwgc2hvd2Nhc2UsIG9yIGNhdGFsb2dcbiAgICogQHBhcmFtIHR5cGUgLSBPcHRpb25hbCBjb250ZW50IHR5cGUgd2l0aGluIHRoZSBsaWJyYXJ5IHNlY3Rpb24gKHBlcnNvbmFzLCBza2lsbHMsIGV0Yy4pXG4gICAqL1xuICBhc3luYyBicm93c2VDb2xsZWN0aW9uKHNlY3Rpb24/OiBzdHJpbmcsIHR5cGU/OiBzdHJpbmcpOiBQcm9taXNlPHsgaXRlbXM6IGFueVtdLCBjYXRlZ29yaWVzOiBhbnlbXSwgc2VjdGlvbnM/OiBhbnlbXSB9PiB7XG4gICAgdHJ5IHtcbiAgICAgIC8vIFRyeSBHaXRIdWIgQVBJIGZpcnN0XG4gICAgICBsZXQgdXJsID0gdGhpcy5iYXNlVXJsO1xuICAgICAgXG4gICAgICAvLyBJZiBubyBzZWN0aW9uIHByb3ZpZGVkLCBzaG93IHRvcC1sZXZlbCBzZWN0aW9uc1xuICAgICAgaWYgKCFzZWN0aW9uKSB7XG4gICAgICAgIGNvbnN0IGRhdGEgPSBhd2FpdCB0aGlzLmdpdGh1YkNsaWVudC5mZXRjaEZyb21HaXRIdWIodXJsLCBmYWxzZSk7XG4gICAgICAgIGlmICghQXJyYXkuaXNBcnJheShkYXRhKSkge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBjb2xsZWN0aW9uIHJlc3BvbnNlLiBFeHBlY3RlZCBkaXJlY3RvcnkgbGlzdGluZy4nKTtcbiAgICAgICAgfVxuICAgICAgICBcbiAgICAgICAgLy8gRmlsdGVyIHRvIG9ubHkgc2hvdyBjb250ZW50IGRpcmVjdG9yaWVzXG4gICAgICAgIGNvbnN0IHNlY3Rpb25zID0gZGF0YS5maWx0ZXIoKGl0ZW06IGFueSkgPT4gXG4gICAgICAgICAgaXRlbS50eXBlID09PSAnZGlyJyAmJiBbJ2xpYnJhcnknLCAnc2hvd2Nhc2UnLCAnY2F0YWxvZyddLmluY2x1ZGVzKGl0ZW0ubmFtZSlcbiAgICAgICAgKTtcbiAgICAgICAgXG4gICAgICAgIHJldHVybiB7IGl0ZW1zOiBbXSwgY2F0ZWdvcmllczogW10sIHNlY3Rpb25zIH07XG4gICAgICB9XG4gICAgICBcbiAgICAgIC8vIEJyb3dzZSB3aXRoaW4gYSBzZWN0aW9uXG4gICAgICB1cmwgPSB0eXBlIFxuICAgICAgICA/IGAke3RoaXMuYmFzZVVybH0vJHtzZWN0aW9ufS8ke3R5cGV9YCBcbiAgICAgICAgOiBgJHt0aGlzLmJhc2VVcmx9LyR7c2VjdGlvbn1gO1xuICAgICAgXG4gICAgICBjb25zdCBkYXRhID0gYXdhaXQgdGhpcy5naXRodWJDbGllbnQuZmV0Y2hGcm9tR2l0SHViKHVybCwgZmFsc2UpO1xuICAgICAgXG4gICAgICBpZiAoIUFycmF5LmlzQXJyYXkoZGF0YSkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIGNvbGxlY3Rpb24gcmVzcG9uc2UuIEV4cGVjdGVkIGRpcmVjdG9yeSBsaXN0aW5nLicpO1xuICAgICAgfVxuICAgICAgXG4gICAgICAvLyBJbiB0aGUgbGlicmFyeSBzZWN0aW9uLCB3ZSBoYXZlIGNvbnRlbnQgdHlwZSBkaXJlY3Rvcmllc1xuICAgICAgaWYgKHNlY3Rpb24gPT09ICdsaWJyYXJ5JyAmJiAhdHlwZSkge1xuICAgICAgICBjb25zdCBjb250ZW50VHlwZXMgPSBkYXRhLmZpbHRlcigoaXRlbTogYW55KSA9PiBcbiAgICAgICAgICBpdGVtLnR5cGUgPT09ICdkaXInICYmIFsncGVyc29uYXMnLCAnc2tpbGxzJywgJ2FnZW50cycsICdwcm9tcHRzJywgJ3RlbXBsYXRlcycsICd0b29scycsICdlbnNlbWJsZXMnLCAnbWVtb3JpZXMnXS5pbmNsdWRlcyhpdGVtLm5hbWUpXG4gICAgICAgICk7XG4gICAgICAgIHJldHVybiB7IGl0ZW1zOiBbXSwgY2F0ZWdvcmllczogY29udGVudFR5cGVzIH07XG4gICAgICB9XG4gICAgICBcbiAgICAgIC8vIEZvciBsaWJyYXJ5IGNvbnRlbnQgdHlwZXMsIHNob3cgZmlsZXMgZGlyZWN0bHkgKGZsYXQgc3RydWN0dXJlKVxuICAgICAgY29uc3QgaXRlbXMgPSBkYXRhLmZpbHRlcigoaXRlbTogYW55KSA9PiBpdGVtLnR5cGUgPT09ICdmaWxlJyAmJiBpdGVtLm5hbWUuZW5kc1dpdGgoJy5tZCcpKTtcbiAgICAgIC8vIEZvciBub24tbGlicmFyeSBzZWN0aW9ucywgdGhleSBtaWdodCBzdGlsbCBoYXZlIHN1YmRpcmVjdG9yaWVzXG4gICAgICBjb25zdCBjYXRlZ29yaWVzID0gc2VjdGlvbiA9PT0gJ2xpYnJhcnknID8gW10gOiBkYXRhLmZpbHRlcigoaXRlbTogYW55KSA9PiBpdGVtLnR5cGUgPT09ICdkaXInKTtcbiAgICAgIFxuICAgICAgcmV0dXJuIHsgaXRlbXMsIGNhdGVnb3JpZXMgfTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgbG9nZ2VyLmRlYnVnKGBHaXRIdWIgQVBJIGJyb3dzZSBmYWlsZWQsIGZhbGxpbmcgYmFjayB0byBjYWNoZTogJHtlcnJvcn1gKTtcbiAgICAgIFxuICAgICAgLy8gRmFsbGJhY2sgdG8gY2FjaGVkIGRhdGFcbiAgICAgIHJldHVybiB0aGlzLmJyb3dzZUZyb21DYWNoZShzZWN0aW9uLCB0eXBlKTtcbiAgICB9XG4gIH1cbiAgXG4gIC8qKlxuICAgKiBCcm93c2UgY29sbGVjdGlvbiBmcm9tIGNhY2hlZCBkYXRhXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIGJyb3dzZUZyb21DYWNoZShzZWN0aW9uPzogc3RyaW5nLCB0eXBlPzogc3RyaW5nKTogUHJvbWlzZTx7IGl0ZW1zOiBhbnlbXSwgY2F0ZWdvcmllczogYW55W10sIHNlY3Rpb25zPzogYW55W10gfT4ge1xuICAgIHRyeSB7XG4gICAgICAvLyBJZiBubyBzZWN0aW9uIHByb3ZpZGVkLCBzaG93IGF2YWlsYWJsZSBzZWN0aW9ucyBmcm9tIHNlZWQgZGF0YVxuICAgICAgaWYgKCFzZWN0aW9uKSB7XG4gICAgICAgIGNvbnN0IHNlY3Rpb25zID0gW1xuICAgICAgICAgIHsgbmFtZTogJ2xpYnJhcnknLCB0eXBlOiAnZGlyJyB9XG4gICAgICAgIF07XG4gICAgICAgIHJldHVybiB7IGl0ZW1zOiBbXSwgY2F0ZWdvcmllczogW10sIHNlY3Rpb25zIH07XG4gICAgICB9XG4gICAgICBcbiAgICAgIC8vIEdldCBjYWNoZWQgb3Igc2VlZCBkYXRhXG4gICAgICBsZXQgY2FjaGVkSXRlbXMgPSBhd2FpdCB0aGlzLmNvbGxlY3Rpb25DYWNoZS5sb2FkQ2FjaGUoKTtcbiAgICAgIFxuICAgICAgaWYgKCFjYWNoZWRJdGVtcyB8fCBjYWNoZWRJdGVtcy5pdGVtcy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgLy8gVXNlIHNlZWQgZGF0YSBpZiBjYWNoZSBpcyBlbXB0eVxuICAgICAgICBjb25zdCBzZWVkRGF0YSA9IENvbGxlY3Rpb25TZWVkZXIuZ2V0U2VlZERhdGEoKTtcbiAgICAgICAgYXdhaXQgdGhpcy5jb2xsZWN0aW9uQ2FjaGUuc2F2ZUNhY2hlKHNlZWREYXRhKTtcbiAgICAgICAgY2FjaGVkSXRlbXMgPSB7IGl0ZW1zOiBzZWVkRGF0YSwgdGltZXN0YW1wOiBEYXRlLm5vdygpIH07XG4gICAgICAgIGxvZ2dlci5kZWJ1ZygnVXNpbmcgc2VlZCBkYXRhIGZvciBjb2xsZWN0aW9uIGJyb3dzaW5nJyk7XG4gICAgICB9XG4gICAgICBcbiAgICAgIC8vIEluIHRoZSBsaWJyYXJ5IHNlY3Rpb24sIHdlIGhhdmUgY29udGVudCB0eXBlIGRpcmVjdG9yaWVzXG4gICAgICBpZiAoc2VjdGlvbiA9PT0gJ2xpYnJhcnknICYmICF0eXBlKSB7XG4gICAgICAgIGNvbnN0IGNvbnRlbnRUeXBlcyA9IHRoaXMuZ2V0Q29udGVudFR5cGVzRnJvbUl0ZW1zKGNhY2hlZEl0ZW1zLml0ZW1zKTtcbiAgICAgICAgcmV0dXJuIHsgaXRlbXM6IFtdLCBjYXRlZ29yaWVzOiBjb250ZW50VHlwZXMgfTtcbiAgICAgIH1cbiAgICAgIFxuICAgICAgLy8gR2V0IGl0ZW1zIGZvciBzcGVjaWZpYyB0eXBlIG9yIGFsbCBpdGVtcyBpbiBzZWN0aW9uXG4gICAgICBjb25zdCBpdGVtcyA9IHRoaXMuZmlsdGVySXRlbXNCeVNlY3Rpb24oY2FjaGVkSXRlbXMuaXRlbXMsIHNlY3Rpb24sIHR5cGUpO1xuICAgICAgY29uc3QgZm9ybWF0dGVkSXRlbXMgPSB0aGlzLmNvbnZlcnRDYWNoZUl0ZW1zVG9HaXRIdWJGb3JtYXQoaXRlbXMpO1xuICAgICAgXG4gICAgICByZXR1cm4geyBpdGVtczogZm9ybWF0dGVkSXRlbXMsIGNhdGVnb3JpZXM6IFtdIH07XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGxvZ2dlci5lcnJvcihgQ2FjaGUgYnJvd3NlIGZhaWxlZDogJHtlcnJvcn1gKTtcbiAgICAgIFxuICAgICAgLy8gTGFzdCByZXNvcnQ6IHVzZSBzZWVkIGRhdGEgZGlyZWN0bHlcbiAgICAgIHJldHVybiB0aGlzLmJyb3dzZUZyb21TZWVkRGF0YShzZWN0aW9uLCB0eXBlKTtcbiAgICB9XG4gIH1cbiAgXG4gIC8qKlxuICAgKiBCcm93c2UgY29sbGVjdGlvbiBmcm9tIHNlZWQgZGF0YSBhcyBsYXN0IHJlc29ydFxuICAgKi9cbiAgcHJpdmF0ZSBicm93c2VGcm9tU2VlZERhdGEoc2VjdGlvbj86IHN0cmluZywgdHlwZT86IHN0cmluZyk6IHsgaXRlbXM6IGFueVtdLCBjYXRlZ29yaWVzOiBhbnlbXSwgc2VjdGlvbnM/OiBhbnlbXSB9IHtcbiAgICBpZiAoIXNlY3Rpb24pIHtcbiAgICAgIGNvbnN0IHNlY3Rpb25zID0gW3sgbmFtZTogJ2xpYnJhcnknLCB0eXBlOiAnZGlyJyB9XTtcbiAgICAgIHJldHVybiB7IGl0ZW1zOiBbXSwgY2F0ZWdvcmllczogW10sIHNlY3Rpb25zIH07XG4gICAgfVxuICAgIFxuICAgIGNvbnN0IHNlZWREYXRhID0gQ29sbGVjdGlvblNlZWRlci5nZXRTZWVkRGF0YSgpO1xuICAgIFxuICAgIGlmIChzZWN0aW9uID09PSAnbGlicmFyeScgJiYgIXR5cGUpIHtcbiAgICAgIGNvbnN0IGNvbnRlbnRUeXBlcyA9IHRoaXMuZ2V0Q29udGVudFR5cGVzRnJvbUl0ZW1zKHNlZWREYXRhKTtcbiAgICAgIHJldHVybiB7IGl0ZW1zOiBbXSwgY2F0ZWdvcmllczogY29udGVudFR5cGVzIH07XG4gICAgfVxuICAgIFxuICAgIGNvbnN0IGl0ZW1zID0gdGhpcy5maWx0ZXJJdGVtc0J5U2VjdGlvbihzZWVkRGF0YSwgc2VjdGlvbiwgdHlwZSk7XG4gICAgY29uc3QgZm9ybWF0dGVkSXRlbXMgPSB0aGlzLmNvbnZlcnRDYWNoZUl0ZW1zVG9HaXRIdWJGb3JtYXQoaXRlbXMpO1xuICAgIFxuICAgIHJldHVybiB7IGl0ZW1zOiBmb3JtYXR0ZWRJdGVtcywgY2F0ZWdvcmllczogW10gfTtcbiAgfVxuICBcbiAgLyoqXG4gICAqIEdldCB1bmlxdWUgY29udGVudCB0eXBlcyBmcm9tIGl0ZW1zXG4gICAqL1xuICBwcml2YXRlIGdldENvbnRlbnRUeXBlc0Zyb21JdGVtcyhpdGVtczogQ29sbGVjdGlvbkl0ZW1bXSk6IGFueVtdIHtcbiAgICBjb25zdCB0eXBlcyA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuICAgIFxuICAgIGl0ZW1zLmZvckVhY2goaXRlbSA9PiB7XG4gICAgICBjb25zdCBwYXRoUGFydHMgPSBpdGVtLnBhdGguc3BsaXQoJy8nKTtcbiAgICAgIGlmIChwYXRoUGFydHMubGVuZ3RoID49IDIgJiYgcGF0aFBhcnRzWzBdID09PSAnbGlicmFyeScpIHtcbiAgICAgICAgdHlwZXMuYWRkKHBhdGhQYXJ0c1sxXSk7XG4gICAgICB9XG4gICAgfSk7XG4gICAgXG4gICAgcmV0dXJuIEFycmF5LmZyb20odHlwZXMpLm1hcCh0eXBlID0+ICh7XG4gICAgICBuYW1lOiB0eXBlLFxuICAgICAgdHlwZTogJ2RpcidcbiAgICB9KSk7XG4gIH1cbiAgXG4gIC8qKlxuICAgKiBGaWx0ZXIgaXRlbXMgYnkgc2VjdGlvbiBhbmQgdHlwZVxuICAgKi9cbiAgcHJpdmF0ZSBmaWx0ZXJJdGVtc0J5U2VjdGlvbihpdGVtczogQ29sbGVjdGlvbkl0ZW1bXSwgc2VjdGlvbjogc3RyaW5nLCB0eXBlPzogc3RyaW5nKTogQ29sbGVjdGlvbkl0ZW1bXSB7XG4gICAgcmV0dXJuIGl0ZW1zLmZpbHRlcihpdGVtID0+IHtcbiAgICAgIGNvbnN0IHBhdGhQYXJ0cyA9IGl0ZW0ucGF0aC5zcGxpdCgnLycpO1xuICAgICAgXG4gICAgICBpZiAocGF0aFBhcnRzWzBdICE9PSBzZWN0aW9uKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICAgIFxuICAgICAgaWYgKHR5cGUgJiYgcGF0aFBhcnRzWzFdICE9PSB0eXBlKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICAgIFxuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSk7XG4gIH1cbiAgXG4gIC8qKlxuICAgKiBDb252ZXJ0IGNhY2hlIGl0ZW1zIHRvIEdpdEh1YiBBUEkgZm9ybWF0XG4gICAqL1xuICBwcml2YXRlIGNvbnZlcnRDYWNoZUl0ZW1zVG9HaXRIdWJGb3JtYXQoaXRlbXM6IENvbGxlY3Rpb25JdGVtW10pOiBhbnlbXSB7XG4gICAgcmV0dXJuIGl0ZW1zLm1hcChpdGVtID0+ICh7XG4gICAgICBuYW1lOiBpdGVtLm5hbWUsXG4gICAgICBwYXRoOiBpdGVtLnBhdGgsXG4gICAgICBzaGE6IGl0ZW0uc2hhLFxuICAgICAgdHlwZTogJ2ZpbGUnLFxuICAgICAgdXJsOiBgaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS9yZXBvcy9Eb2xsaG91c2VNQ1AvY29sbGVjdGlvbi9jb250ZW50cy8ke2l0ZW0ucGF0aH1gLFxuICAgICAgaHRtbF91cmw6IGBodHRwczovL2dpdGh1Yi5jb20vRG9sbGhvdXNlTUNQL2NvbGxlY3Rpb24vYmxvYi9tYWluLyR7aXRlbS5wYXRofWBcbiAgICB9KSk7XG4gIH1cbiAgXG4gIC8qKlxuICAgKiBGb3JtYXQgY29sbGVjdGlvbiBicm93c2UgcmVzdWx0c1xuICAgKi9cbiAgZm9ybWF0QnJvd3NlUmVzdWx0cyhpdGVtczogYW55W10sIGNhdGVnb3JpZXM6IGFueVtdLCBzZWN0aW9uPzogc3RyaW5nLCB0eXBlPzogc3RyaW5nLCBwZXJzb25hSW5kaWNhdG9yOiBzdHJpbmcgPSAnJyk6IHN0cmluZyB7XG4gICAgY29uc3QgdGV4dFBhcnRzID0gW2Ake3BlcnNvbmFJbmRpY2F0b3J98J+PqiAqKkRvbGxob3VzZU1DUCBDb2xsZWN0aW9uKipcXG5cXG5gXTtcbiAgICBcbiAgICAvLyBTaG93IHRvcC1sZXZlbCBzZWN0aW9ucyBpZiBubyBzZWN0aW9uIHNwZWNpZmllZFxuICAgIGlmICghc2VjdGlvbiAmJiBjYXRlZ29yaWVzLmxlbmd0aCA+IDApIHtcbiAgICAgIHRleHRQYXJ0cy5wdXNoKGAqKvCfk5ogQ29sbGVjdGlvbiBTZWN0aW9ucyAoJHtjYXRlZ29yaWVzLmxlbmd0aH0pOioqXFxuYCk7XG4gICAgICBjYXRlZ29yaWVzLmZvckVhY2goKHNlYzogYW55KSA9PiB7XG4gICAgICAgIGNvbnN0IHNlY3Rpb25JY29uczogeyBba2V5OiBzdHJpbmddOiBzdHJpbmcgfSA9IHtcbiAgICAgICAgICAnbGlicmFyeSc6ICfwn5OWJyxcbiAgICAgICAgICAnc2hvd2Nhc2UnOiAn4q2QJyxcbiAgICAgICAgICAnY2F0YWxvZyc6ICfwn5KOJ1xuICAgICAgICB9O1xuICAgICAgICBjb25zdCBpY29uID0gc2VjdGlvbkljb25zW3NlYy5uYW1lXSB8fCAn8J+TgSc7XG4gICAgICAgIGNvbnN0IGRlc2NyaXB0aW9uczogeyBba2V5OiBzdHJpbmddOiBzdHJpbmcgfSA9IHtcbiAgICAgICAgICAnbGlicmFyeSc6ICdGcmVlIGNvbW11bml0eSBjb250ZW50JyxcbiAgICAgICAgICAnc2hvd2Nhc2UnOiAnRmVhdHVyZWQgaGlnaC1xdWFsaXR5IGNvbnRlbnQnLFxuICAgICAgICAgICdjYXRhbG9nJzogJ1ByZW1pdW0gY29udGVudCAoY29taW5nIHNvb24pJ1xuICAgICAgICB9O1xuICAgICAgICB0ZXh0UGFydHMucHVzaChcbiAgICAgICAgICBgICAgJHtpY29ufSAqKiR7c2VjLm5hbWV9KiogLSAke2Rlc2NyaXB0aW9uc1tzZWMubmFtZV0gfHwgJ0NvbnRlbnQgY29sbGVjdGlvbid9XFxuYCxcbiAgICAgICAgICBgICAgICAgQnJvd3NlOiBcXGBicm93c2VfY29sbGVjdGlvbiBcIiR7c2VjLm5hbWV9XCJcXGBcXG5cXG5gXG4gICAgICAgICk7XG4gICAgICB9KTtcbiAgICAgIHJldHVybiB0ZXh0UGFydHMuam9pbignJyk7XG4gICAgfVxuICAgIFxuICAgIC8vIFNob3cgY29udGVudCB0eXBlcyB3aXRoaW4gbGlicmFyeSBzZWN0aW9uXG4gICAgaWYgKHNlY3Rpb24gPT09ICdsaWJyYXJ5JyAmJiAhdHlwZSAmJiBjYXRlZ29yaWVzLmxlbmd0aCA+IDApIHtcbiAgICAgIHRleHRQYXJ0cy5wdXNoKGAqKvCfk5YgTGlicmFyeSBDb250ZW50IFR5cGVzICgke2NhdGVnb3JpZXMubGVuZ3RofSk6KipcXG5gKTtcbiAgICAgIGNhdGVnb3JpZXMuZm9yRWFjaCgoY2F0OiBhbnkpID0+IHtcbiAgICAgICAgY29uc3QgdHlwZUljb25zOiB7IFtrZXk6IHN0cmluZ106IHN0cmluZyB9ID0ge1xuICAgICAgICAgICdwZXJzb25hcyc6ICfwn46tJyxcbiAgICAgICAgICAnc2tpbGxzJzogJ/Cfm6DvuI8nLFxuICAgICAgICAgICdhZ2VudHMnOiAn8J+klicsXG4gICAgICAgICAgJ3Byb21wdHMnOiAn8J+SrCcsXG4gICAgICAgICAgJ3RlbXBsYXRlcyc6ICfwn5OEJyxcbiAgICAgICAgICAndG9vbHMnOiAn8J+UpycsXG4gICAgICAgICAgJ2Vuc2VtYmxlcyc6ICfwn468JyxcbiAgICAgICAgICAnbWVtb3JpZXMnOiAn8J+noCdcbiAgICAgICAgfTtcbiAgICAgICAgY29uc3QgaWNvbiA9IHR5cGVJY29uc1tjYXQubmFtZV0gfHwgJ/Cfk4EnO1xuICAgICAgICB0ZXh0UGFydHMucHVzaChgICAgJHtpY29ufSAqKiR7Y2F0Lm5hbWV9KiogLSBCcm93c2U6IFxcYGJyb3dzZV9jb2xsZWN0aW9uIFwibGlicmFyeVwiIFwiJHtjYXQubmFtZX1cIlxcYFxcbmApO1xuICAgICAgfSk7XG4gICAgICB0ZXh0UGFydHMucHVzaCgnXFxuJyk7XG4gICAgfSBlbHNlIGlmIChjYXRlZ29yaWVzLmxlbmd0aCA+IDApIHtcbiAgICAgIC8vIE9ubHkgc2hvdyBjYXRlZ29yeSBuYXZpZ2F0aW9uIGZvciBub24tbGlicmFyeSBzZWN0aW9ucyAoc2hvd2Nhc2UsIGNhdGFsb2cpXG4gICAgICB0ZXh0UGFydHMucHVzaChgKirwn5OBIFN1YmRpcmVjdG9yaWVzIGluICR7c2VjdGlvbn0ke3R5cGUgPyBgLyR7dHlwZX1gIDogJyd9ICgke2NhdGVnb3JpZXMubGVuZ3RofSk6KipcXG5gKTtcbiAgICAgIGNhdGVnb3JpZXMuZm9yRWFjaCgoY2F0OiBhbnkpID0+IHtcbiAgICAgICAgY29uc3QgYnJvd3NlUGF0aCA9IHR5cGUgPyBgXCIke3NlY3Rpb259XCIgXCIke3R5cGV9LyR7Y2F0Lm5hbWV9XCJgIDogYFwiJHtzZWN0aW9ufVwiIFwiJHtjYXQubmFtZX1cImA7XG4gICAgICAgIHRleHRQYXJ0cy5wdXNoKGAgICDwn5OCICoqJHtjYXQubmFtZX0qKiAtIEJyb3dzZTogXFxgYnJvd3NlX2NvbGxlY3Rpb24gJHticm93c2VQYXRofVxcYFxcbmApO1xuICAgICAgfSk7XG4gICAgICB0ZXh0UGFydHMucHVzaCgnXFxuJyk7XG4gICAgfVxuICAgIFxuICAgIGlmIChpdGVtcy5sZW5ndGggPiAwKSB7XG4gICAgICBjb25zdCBjb250ZW50VHlwZSA9IHR5cGUgfHwgJ2NvbnRlbnQnO1xuICAgICAgY29uc3QgY29udGVudEljb25zOiB7IFtrZXk6IHN0cmluZ106IHN0cmluZyB9ID0ge1xuICAgICAgICAncGVyc29uYXMnOiAn8J+OrScsXG4gICAgICAgICdza2lsbHMnOiAn8J+boO+4jycsXG4gICAgICAgICdhZ2VudHMnOiAn8J+klicsXG4gICAgICAgICdwcm9tcHRzJzogJ/CfkqwnLFxuICAgICAgICAndGVtcGxhdGVzJzogJ/Cfk4QnLFxuICAgICAgICAndG9vbHMnOiAn8J+UpycsXG4gICAgICAgICdlbnNlbWJsZXMnOiAn8J+OvCcsXG4gICAgICAgICdtZW1vcmllcyc6ICfwn6egJ1xuICAgICAgfTtcbiAgICAgIGNvbnN0IGljb24gPSBjb250ZW50SWNvbnNbY29udGVudFR5cGVdIHx8ICfwn5OEJztcbiAgICAgIFxuICAgICAgdGV4dFBhcnRzLnB1c2goYCoqJHtpY29ufSAke2NvbnRlbnRUeXBlLmNoYXJBdCgwKS50b1VwcGVyQ2FzZSgpICsgY29udGVudFR5cGUuc2xpY2UoMSl9IGluICR7c2VjdGlvbn0ke3R5cGUgPyBgLyR7dHlwZX1gIDogJyd9ICgke2l0ZW1zLmxlbmd0aH0pOioqXFxuYCk7XG4gICAgICBpdGVtcy5mb3JFYWNoKChpdGVtOiBhbnkpID0+IHtcbiAgICAgICAgY29uc3QgZnVsbFBhdGggPSBzZWN0aW9uICsgKHR5cGUgPyBgLyR7dHlwZX1gIDogJycpICsgYC8ke2l0ZW0ubmFtZX1gO1xuICAgICAgICB0ZXh0UGFydHMucHVzaChcbiAgICAgICAgICBgICAg4par77iPICoqJHtpdGVtLm5hbWUucmVwbGFjZSgnLm1kJywgJycpfSoqXFxuYCxcbiAgICAgICAgICBgICAgICAg8J+TpSBJbnN0YWxsOiBcXGBpbnN0YWxsX2NvbnRlbnQgXCIke2Z1bGxQYXRofVwiXFxgXFxuYCxcbiAgICAgICAgICBgICAgICAg8J+Rge+4jyBEZXRhaWxzOiBcXGBnZXRfY29sbGVjdGlvbl9jb250ZW50IFwiJHtmdWxsUGF0aH1cIlxcYFxcblxcbmBcbiAgICAgICAgKTtcbiAgICAgIH0pO1xuICAgIH1cbiAgICBcbiAgICByZXR1cm4gdGV4dFBhcnRzLmpvaW4oJycpO1xuICB9XG59Il19
|
|
352
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQ29sbGVjdGlvbkJyb3dzZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvY29sbGVjdGlvbi9Db2xsZWN0aW9uQnJvd3Nlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7R0FFRztBQUdILE9BQU8sRUFBRSxlQUFlLEVBQWtCLE1BQU0sNkJBQTZCLENBQUM7QUFDOUUsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFDekQsT0FBTyxFQUFFLHNCQUFzQixFQUFFLE1BQU0sNkJBQTZCLENBQUM7QUFFckUsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBQzVDLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUVwRCxxREFBcUQ7QUFDckQsNkNBQTZDO0FBQzdDLDBFQUEwRTtBQUMxRSwrQ0FBK0M7QUFDL0MsZ0ZBQWdGO0FBQ2hGLE1BQU0sbUJBQW1CLEdBQUc7SUFDMUIsV0FBVyxDQUFDLE9BQU8sRUFBSyx3REFBd0Q7SUFDaEYsV0FBVyxDQUFDLEtBQUssRUFBTyxxQ0FBcUM7SUFDN0QsV0FBVyxDQUFDLEtBQUssRUFBTyx1Q0FBdUM7SUFDL0QsV0FBVyxDQUFDLFFBQVEsQ0FBSSx3Q0FBd0M7Q0FDakUsQ0FBQztBQUVGOztHQUVHO0FBQ0gsU0FBUyxhQUFhLENBQUMsS0FBYTtJQUNsQyxPQUFPLE1BQU0sQ0FBQyxNQUFNLENBQUMsV0FBVyxDQUFDLENBQUMsUUFBUSxDQUFDLEtBQW9CLENBQUMsQ0FBQztBQUNuRSxDQUFDO0FBRUQ7O0dBRUc7QUFDSCxTQUFTLGtCQUFrQixDQUFDLFdBQXdCO0lBQ2xELE9BQU8sbUJBQW1CLENBQUMsUUFBUSxDQUFDLFdBQVcsQ0FBQyxDQUFDO0FBQ25ELENBQUM7QUFFRCxNQUFNLE9BQU8saUJBQWlCO0lBQ3BCLFlBQVksQ0FBZTtJQUMzQixlQUFlLENBQWtCO0lBQ2pDLFlBQVksQ0FBeUI7SUFDckMsT0FBTyxH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QUFJLENBQUMsT0FBTyxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsTUFBTSxFQUM3Qyx3Q0FBd0MsUUFBUSxPQUFPLEVBQ3ZELGdEQUFnRCxRQUFRLFNBQVMsQ0FDbEUsQ0FBQztZQUNKLENBQUMsQ0FBQyxDQUFDO1FBQ0wsQ0FBQztRQUVELE9BQU8sU0FBUyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQztJQUM1QixDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEJyb3dzZSBjb2xsZWN0aW9uIGNvbnRlbnQgZnJvbSBHaXRIdWJcbiAqL1xuXG5pbXBvcnQgeyBHaXRIdWJDbGllbnQgfSBmcm9tICcuL0dpdEh1YkNsaWVudC5qcyc7XG5pbXBvcnQgeyBDb2xsZWN0aW9uQ2FjaGUsIENvbGxlY3Rpb25JdGVtIH0gZnJvbSAnLi4vY2FjaGUvQ29sbGVjdGlvbkNhY2hlLmpzJztcbmltcG9ydCB7IENvbGxlY3Rpb25TZWVkZXIgfSBmcm9tICcuL0NvbGxlY3Rpb25TZWVkZXIuanMnO1xuaW1wb3J0IHsgQ29sbGVjdGlvbkluZGV4TWFuYWdlciB9IGZyb20gJy4vQ29sbGVjdGlvbkluZGV4TWFuYWdlci5qcyc7XG5pbXBvcnQgeyBDb2xsZWN0aW9uSW5kZXgsIEluZGV4RW50cnkgfSBmcm9tICcuLi90eXBlcy9jb2xsZWN0aW9uLmpzJztcbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL3V0aWxzL2xvZ2dlci5qcyc7XG5pbXBvcnQgeyBFbGVtZW50VHlwZSB9IGZyb20gJy4uL3BvcnRmb2xpby90eXBlcy5qcyc7XG5cbi8vIENvbnRlbnQgdHlwZXMgc3VwcG9ydGVkIGJ5IE1DUCBzZXJ2ZXIgKElzc3VlICMxNDQpXG4vLyBIaWRlOiBtZW1vcmllcywgZW5zZW1ibGVzIGZyb20gTUNQIHF1ZXJpZXNcbi8vIOKaoO+4jyBDUklUSUNBTDogV2hlbiBhZGRpbmcgbmV3IGVsZW1lbnQgdHlwZXMsIHlvdSBNVVNUIHVwZGF0ZSB0aGlzIGFycmF5IVxuLy8gQWxzbyB1cGRhdGUgdmFsaWRUeXBlcyBhcnJheSBpbiBzcmMvaW5kZXgudHNcbi8vIFNlZSBkb2NzL2RldmVsb3BtZW50L0FERElOR19ORVdfRUxFTUVOVF9UWVBFU19DSEVDS0xJU1QubWQgZm9yIGNvbXBsZXRlIGd1aWRlXG5jb25zdCBNQ1BfU1VQUE9SVEVEX1RZUEVTID0gW1xuICBFbGVtZW50VHlwZS5QRVJTT05BLCAgICAvLyBwZXJzb25hcyAtIHN1cHBvcnRlZCBieSBQZXJzb25hVG9vbHMgYW5kIEVsZW1lbnRUb29sc1xuICBFbGVtZW50VHlwZS5TS0lMTCwgICAgICAvLyBza2lsbHMgLSBzdXBwb3J0ZWQgYnkgRWxlbWVudFRvb2xzXG4gIEVsZW1lbnRUeXBlLkFHRU5ULCAgICAgIC8vIGFnZW50cyAtIHN1cHBvcnRlZCBieSBFbGVtZW50VG9vbHMgIFxuICBFbGVtZW50VHlwZS5URU1QTEFURSAgICAvLyB0ZW1wbGF0ZXMgLSBzdXBwb3J0ZWQgYnkgRWxlbWVudFRvb2xzXG5dO1xuXG4vKipcbiAqIFR5cGUgZ3VhcmQgdG8gc2FmZWx5IGNoZWNrIGlmIGEgc3RyaW5nIGlzIGEgdmFsaWQgRWxlbWVudFR5cGVcbiAqL1xuZnVuY3Rpb24gaXNFbGVtZW50VHlwZSh2YWx1ZTogc3RyaW5nKTogdmFsdWUgaXMgRWxlbWVudFR5cGUge1xuICByZXR1cm4gT2JqZWN0LnZhbHVlcyhFbGVtZW50VHlwZSkuaW5jbHVkZXModmFsdWUgYXMgRWxlbWVudFR5cGUpO1xufVxuXG4vKipcbiAqIFR5cGUgZ3VhcmQgdG8gc2FmZWx5IGNoZWNrIGlmIGFuIEVsZW1lbnRUeXBlIGlzIHN1cHBvcnRlZCBieSBNQ1BcbiAqL1xuZnVuY3Rpb24gaXNNQ1BTdXBwb3J0ZWRUeXBlKGVsZW1lbnRUeXBlOiBFbGVtZW50VHlwZSk6IGJvb2xlYW4ge1xuICByZXR1cm4gTUNQX1NVUFBPUlRFRF9UWVBFUy5pbmNsdWRlcyhlbGVtZW50VHlwZSk7XG59XG5cbmV4cG9ydCBjbGFzcyBDb2xsZWN0aW9uQnJvd3NlciB7XG4gIHByaXZhdGUgZ2l0aHViQ2xpZW50OiBHaXRIdWJDbGllbnQ7XG4gIHByaXZhdGUgY29sbGVjdGlvbkNhY2hlOiBDb2xsZWN0aW9uQ2FjaGU7XG4gIHByaXZhdGUgaW5kZXhNYW5hZ2VyOiBDb2xsZWN0aW9uSW5kZXhNYW5hZ2VyO1xuICBwcml2YXRlIGJhc2VVcmwgPSAnaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS9yZXBvcy9Eb2xsaG91c2VNQ1AvY29sbGVjdGlvbi9jb250ZW50cyc7XG4gIFxuICBjb25zdHJ1Y3RvcihnaXRodWJDbGllbnQ6IEdpdEh1YkNsaWVudCwgY29sbGVjdGlvbkNhY2hlPzogQ29sbGVjdGlvbkNhY2hlLCBpbmRleE1hbmFnZXI/OiBDb2xsZWN0aW9uSW5kZXhNYW5hZ2VyKSB7XG4gICAgdGhpcy5naXRodWJDbGllbnQgPSBnaXRodWJDbGllbnQ7XG4gICAgdGhpcy5jb2xsZWN0aW9uQ2FjaGUgPSBjb2xsZWN0aW9uQ2FjaGUgfHwgbmV3IENvbGxlY3Rpb25DYWNoZSgpO1xuICAgIHRoaXMuaW5kZXhNYW5hZ2VyID0gaW5kZXhNYW5hZ2VyIHx8IG5ldyBDb2xsZWN0aW9uSW5kZXhNYW5hZ2VyKCk7XG4gIH1cbiAgXG4gIC8qKlxuICAgKiBCcm93c2UgY29sbGVjdGlvbiBjb250ZW50IGJ5IHNlY3Rpb24gYW5kIHR5cGVcbiAgICogVXNlcyBDb2xsZWN0aW9uSW5kZXhNYW5hZ2VyIGZvciBmYXN0IGJyb3dzaW5nIHdpdGggYmFja2dyb3VuZCByZWZyZXNoXG4gICAqIEZhbGxzIGJhY2sgdG8gY2FjaGVkIGRhdGEgd2hlbiBHaXRIdWIgQVBJIGlzIG5vdCBhdmFpbGFibGUgb3Igbm90IGF1dGhlbnRpY2F0ZWRcbiAgICogQHBhcmFtIHNlY3Rpb24gLSBUb3AgbGV2ZWwgc2VjdGlvbjogbGlicmFyeSwgc2hvd2Nhc2UsIG9yIGNhdGFsb2dcbiAgICogQHBhcmFtIHR5cGUgLSBPcHRpb25hbCBjb250ZW50IHR5cGUgd2l0aGluIHRoZSBsaWJyYXJ5IHNlY3Rpb24gKHBlcnNvbmFzLCBza2lsbHMsIGV0Yy4pXG4gICAqL1xuICBhc3luYyBicm93c2VDb2xsZWN0aW9uKHNlY3Rpb24/OiBzdHJpbmcsIHR5cGU/OiBzdHJpbmcpOiBQcm9taXNlPHsgaXRlbXM6IGFueVtdLCBjYXRlZ29yaWVzOiBhbnlbXSwgc2VjdGlvbnM/OiBhbnlbXSB9PiB7XG4gICAgdHJ5IHtcbiAgICAgIC8vIFRyeSB1c2luZyBjb2xsZWN0aW9uIGluZGV4IGZpcnN0IGZvciBmYXN0ZXIgYnJvd3NpbmdcbiAgICAgIGNvbnN0IGluZGV4UmVzdWx0ID0gYXdhaXQgdGhpcy5icm93c2VGcm9tSW5kZXgoc2VjdGlvbiwgdHlwZSk7XG4gICAgICBpZiAoaW5kZXhSZXN1bHQpIHtcbiAgICAgICAgbG9nZ2VyLmRlYnVnKCdVc2VkIGNvbGxlY3Rpb24gaW5kZXggZm9yIGJyb3dzaW5nJyk7XG4gICAgICAgIHJldHVybiBpbmRleFJlc3VsdDtcbiAgICAgIH1cbiAgICAgIFxuICAgICAgLy8gRmFsbGJhY2sgdG8gR2l0SHViIEFQSVxuICAgICAgbGV0IHVybCA9IHRoaXMuYmFzZVVybDtcbiAgICAgIFxuICAgICAgLy8gSWYgbm8gc2VjdGlvbiBwcm92aWRlZCwgc2hvdyB0b3AtbGV2ZWwgc2VjdGlvbnNcbiAgICAgIGlmICghc2VjdGlvbikge1xuICAgICAgICBjb25zdCBkYXRhID0gYXdhaXQgdGhpcy5naXRodWJDbGllbnQuZmV0Y2hGcm9tR2l0SHViKHVybCwgZmFsc2UpO1xuICAgICAgICBpZiAoIUFycmF5LmlzQXJyYXkoZGF0YSkpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgY29sbGVjdGlvbiByZXNwb25zZS4gRXhwZWN0ZWQgZGlyZWN0b3J5IGxpc3RpbmcuJyk7XG4gICAgICAgIH1cbiAgICAgICAgXG4gICAgICAgIC8vIEZpbHRlciB0byBvbmx5IHNob3cgY29udGVudCBkaXJlY3Rvcmllc1xuICAgICAgICBjb25zdCBzZWN0aW9ucyA9IGRhdGEuZmlsdGVyKChpdGVtOiBhbnkpID0+IFxuICAgICAgICAgIGl0ZW0udHlwZSA9PT0gJ2RpcicgJiYgWydsaWJyYXJ5JywgJ3Nob3djYXNlJywgJ2NhdGFsb2cnXS5pbmNsdWRlcyhpdGVtLm5hbWUpXG4gICAgICAgICk7XG4gICAgICAgIFxuICAgICAgICByZXR1cm4geyBpdGVtczogW10sIGNhdGVnb3JpZXM6IFtdLCBzZWN0aW9ucyB9O1xuICAgICAgfVxuICAgICAgXG4gICAgICAvLyBCcm93c2Ugd2l0aGluIGEgc2VjdGlvblxuICAgICAgdXJsID0gdHlwZSBcbiAgICAgICAgPyBgJHt0aGlzLmJhc2VVcmx9LyR7c2VjdGlvbn0vJHt0eXBlfWAgXG4gICAgICAgIDogYCR7dGhpcy5iYXNlVXJsfS8ke3NlY3Rpb259YDtcbiAgICAgIFxuICAgICAgY29uc3QgZGF0YSA9IGF3YWl0IHRoaXMuZ2l0aHViQ2xpZW50LmZldGNoRnJvbUdpdEh1Yih1cmwsIGZhbHNlKTtcbiAgICAgIFxuICAgICAgaWYgKCFBcnJheS5pc0FycmF5KGRhdGEpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBjb2xsZWN0aW9uIHJlc3BvbnNlLiBFeHBlY3RlZCBkaXJlY3RvcnkgbGlzdGluZy4nKTtcbiAgICAgIH1cbiAgICAgIFxuICAgICAgLy8gSW4gdGhlIGxpYnJhcnkgc2VjdGlvbiwgd2UgaGF2ZSBjb250ZW50IHR5cGUgZGlyZWN0b3JpZXNcbiAgICAgIGlmIChzZWN0aW9uID09PSAnbGlicmFyeScgJiYgIXR5cGUpIHtcbiAgICAgICAgLy8gRmlsdGVyIHRvIG9ubHkgc2hvdyBNQ1Atc3VwcG9ydGVkIGNvbnRlbnQgdHlwZXNcbiAgICAgICAgY29uc3QgY29udGVudFR5cGVzID0gZGF0YS5maWx0ZXIoKGl0ZW06IGFueSkgPT4ge1xuICAgICAgICAgIGlmIChpdGVtLnR5cGUgIT09ICdkaXInKSByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgY29uc3QgZWxlbWVudFR5cGUgPSBpc0VsZW1lbnRUeXBlKGl0ZW0ubmFtZSkgPyBpdGVtLm5hbWUgYXMgRWxlbWVudFR5cGUgOiBudWxsO1xuICAgICAgICAgIHJldHVybiBlbGVtZW50VHlwZSAmJiBpc01DUFN1cHBvcnRlZFR5cGUoZWxlbWVudFR5cGUpO1xuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIHsgaXRlbXM6IFtdLCBjYXRlZ29yaWVzOiBjb250ZW50VHlwZXMgfTtcbiAgICAgIH1cbiAgICAgIFxuICAgICAgLy8gRm9yIGxpYnJhcnkgY29udGVudCB0eXBlcywgc2hvdyBmaWxlcyBkaXJlY3RseSAoZmxhdCBzdHJ1Y3R1cmUpXG4gICAgICBjb25zdCBpdGVtcyA9IGRhdGEuZmlsdGVyKChpdGVtOiBhbnkpID0+IGl0ZW0udHlwZSA9PT0gJ2ZpbGUnICYmIGl0ZW0ubmFtZS5lbmRzV2l0aCgnLm1kJykpO1xuICAgICAgLy8gRm9yIG5vbi1saWJyYXJ5IHNlY3Rpb25zLCB0aGV5IG1pZ2h0IHN0aWxsIGhhdmUgc3ViZGlyZWN0b3JpZXNcbiAgICAgIGNvbnN0IGNhdGVnb3JpZXMgPSBzZWN0aW9uID09PSAnbGlicmFyeScgPyBbXSA6IGRhdGEuZmlsdGVyKChpdGVtOiBhbnkpID0+IGl0ZW0udHlwZSA9PT0gJ2RpcicpO1xuICAgICAgXG4gICAgICByZXR1cm4geyBpdGVtcywgY2F0ZWdvcmllcyB9O1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBsb2dnZXIuZGVidWcoYEdpdEh1YiBBUEkgYnJvd3NlIGZhaWxlZCwgZmFsbGluZyBiYWNrIHRvIGNhY2hlOiAke2Vycm9yfWApO1xuICAgICAgXG4gICAgICAvLyBGYWxsYmFjayB0byBjYWNoZWQgZGF0YVxuICAgICAgcmV0dXJuIHRoaXMuYnJvd3NlRnJvbUNhY2hlKHNlY3Rpb24sIHR5cGUpO1xuICAgIH1cbiAgfVxuICBcbiAgLyoqXG4gICAqIEJyb3dzZSBjb2xsZWN0aW9uIHVzaW5nIHRoZSBmYXN0IGNvbGxlY3Rpb24gaW5kZXhcbiAgICogUmV0dXJucyBudWxsIGlmIGluZGV4IGlzIG5vdCBhdmFpbGFibGUgb3IgYnJvd3NpbmcgZmFpbHNcbiAgICovXG4gIHByaXZhdGUgYXN5bmMgYnJvd3NlRnJvbUluZGV4KHNlY3Rpb24/OiBzdHJpbmcsIHR5cGU/OiBzdHJpbmcpOiBQcm9taXNlPHsgaXRlbXM6IGFueVtdLCBjYXRlZ29yaWVzOiBhbnlbXSwgc2VjdGlvbnM/OiBhbnlbXSB9IHwgbnVsbD4ge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBpbmRleCA9IGF3YWl0IHRoaXMuaW5kZXhNYW5hZ2VyLmdldEluZGV4KCk7XG4gICAgICBcbiAgICAgIC8vIElmIG5vIHNlY3Rpb24gcHJvdmlkZWQsIHNob3cgdG9wLWxldmVsIHNlY3Rpb25zXG4gICAgICBpZiAoIXNlY3Rpb24pIHtcbiAgICAgICAgY29uc3Qgc2VjdGlvbnMgPSBbXG4gICAgICAgICAgeyBuYW1lOiAnbGlicmFyeScsIHR5cGU6ICdkaXInIH0sXG4gICAgICAgICAgeyBuYW1lOiAnc2hvd2Nhc2UnLCB0eXBlOiAnZGlyJyB9LFxuICAgICAgICAgIHsgbmFtZTogJ2NhdGFsb2cnLCB0eXBlOiAnZGlyJyB9XG4gICAgICAgIF07XG4gICAgICAgIHJldHVybiB7IGl0ZW1zOiBbXSwgY2F0ZWdvcmllczogW10sIHNlY3Rpb25zIH07XG4gICAgICB9XG4gICAgICBcbiAgICAgIC8vIEluIHRoZSBsaWJyYXJ5IHNlY3Rpb24sIHdlIGhhdmUgY29udGVudCB0eXBlIGRpcmVjdG9yaWVzXG4gICAgICBpZiAoc2VjdGlvbiA9PT0gJ2xpYnJhcnknICYmICF0eXBlKSB7XG4gICAgICAgIC8vIEdldCB1bmlxdWUgY29udGVudCB0eXBlcyBmcm9tIGluZGV4XG4gICAgICAgIGNvbnN0IGNvbnRlbnRUeXBlcyA9IHRoaXMuZ2V0Q29udGVudFR5cGVzRnJvbUluZGV4KGluZGV4KTtcbiAgICAgICAgcmV0dXJuIHsgaXRlbXM6IFtdLCBjYXRlZ29yaWVzOiBjb250ZW50VHlwZXMgfTtcbiAgICAgIH1cbiAgICAgIFxuICAgICAgLy8gR2V0IGl0ZW1zIGZvciBzcGVjaWZpYyB0eXBlIG9yIGFsbCBpdGVtcyBpbiBzZWN0aW9uXG4gICAgICBjb25zdCBpdGVtcyA9IHRoaXMuZ2V0SXRlbXNGcm9tSW5kZXgoaW5kZXgsIHNlY3Rpb24sIHR5cGUpO1xuICAgICAgY29uc3QgZm9ybWF0dGVkSXRlbXMgPSB0aGlzLmNvbnZlcnRJbmRleEl0ZW1zVG9HaXRIdWJGb3JtYXQoaXRlbXMpO1xuICAgICAgXG4gICAgICByZXR1cm4geyBpdGVtczogZm9ybWF0dGVkSXRlbXMsIGNhdGVnb3JpZXM6IFtdIH07XG4gICAgICBcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgbG9nZ2VyLmRlYnVnKCdGYWlsZWQgdG8gYnJvd3NlIGZyb20gY29sbGVjdGlvbiBpbmRleCcsIHsgZXJyb3I6IGVycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogU3RyaW5nKGVycm9yKSB9KTtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgfVxuICBcbiAgLyoqXG4gICAqIEdldCB1bmlxdWUgY29udGVudCB0eXBlcyBmcm9tIGNvbGxlY3Rpb24gaW5kZXhcbiAgICovXG4gIHByaXZhdGUgZ2V0Q29udGVudFR5cGVzRnJvbUluZGV4KGluZGV4OiBDb2xsZWN0aW9uSW5kZXgpOiBhbnlbXSB7XG4gICAgY29uc3QgdHlwZXMgPSBuZXcgU2V0PHN0cmluZz4oKTtcbiAgICBcbiAgICAvLyBFeHRyYWN0IHR5cGVzIGZyb20gaW5kZXgga2V5cyBhbmQgZmlsdGVyIGZvciBNQ1Atc3VwcG9ydGVkIHR5cGVzXG4gICAgT2JqZWN0LmtleXMoaW5kZXguaW5kZXgpLmZvckVhY2godHlwZU5hbWUgPT4ge1xuICAgICAgY29uc3QgZWxlbWVudFR5cGUgPSBpc0VsZW1lbnRUeXBlKHR5cGVOYW1lKSA/IHR5cGVOYW1lIGFzIEVsZW1lbnRUeXBlIDogbnVsbDtcbiAgICAgIGlmIChlbGVtZW50VHlwZSAmJiBpc01DUFN1cHBvcnRlZFR5cGUoZWxlbWVudFR5cGUpKSB7XG4gICAgICAgIHR5cGVzLmFkZCh0eXBlTmFtZSk7XG4gICAgICB9XG4gICAgfSk7XG4gICAgXG4gICAgcmV0dXJuIEFycmF5LmZyb20odHlwZXMpLm1hcCh0eXBlID0+ICh7XG4gICAgICBuYW1lOiB0eXBlLFxuICAgICAgdHlwZTogJ2RpcidcbiAgICB9KSk7XG4gIH1cbiAgXG4gIC8qKlxuICAgKiBHZXQgaXRlbXMgZnJvbSBjb2xsZWN0aW9uIGluZGV4IGJ5IHNlY3Rpb24gYW5kIHR5cGVcbiAgICovXG4gIHByaXZhdGUgZ2V0SXRlbXNGcm9tSW5kZXgoaW5kZXg6IENvbGxlY3Rpb25JbmRleCwgc2VjdGlvbjogc3RyaW5nLCB0eXBlPzogc3RyaW5nKTogSW5kZXhFbnRyeVtdIHtcbiAgICAvLyBGb3IgbGlicmFyeSBzZWN0aW9uIHdpdGggdHlwZSwgZ2V0IGl0ZW1zIGZyb20gdGhhdCB0eXBlXG4gICAgaWYgKHNlY3Rpb24gPT09ICdsaWJyYXJ5JyAmJiB0eXBlKSB7XG4gICAgICByZXR1cm4gaW5kZXguaW5kZXhbdHlwZV0gfHwgW107XG4gICAgfVxuICAgIFxuICAgIC8vIEZvciBsaWJyYXJ5IHNlY3Rpb24gd2l0aG91dCB0eXBlLCByZXR1cm4gZW1wdHkgKHNob3VsZCBzaG93IGNhdGVnb3JpZXMpXG4gICAgaWYgKHNlY3Rpb24gPT09ICdsaWJyYXJ5JyAmJiAhdHlwZSkge1xuICAgICAgcmV0dXJuIFtdO1xuICAgIH1cbiAgICBcbiAgICAvLyBGb3Igb3RoZXIgc2VjdGlvbnMgKHNob3djYXNlLCBjYXRhbG9nKSwgcmV0dXJuIGFsbCBpdGVtcyB0aGF0IG1hdGNoXG4gICAgLy8gTm90ZTogVGhlIGN1cnJlbnQgaW5kZXggc3RydWN0dXJlIGlzIHByaW1hcmlseSBmb3IgbGlicmFyeSBjb250ZW50XG4gICAgLy8gRnV0dXJlIGVuaGFuY2VtZW50OiBleHRlbmQgaW5kZXggdG8gaW5jbHVkZSBzaG93Y2FzZS9jYXRhbG9nIHNlY3Rpb25zXG4gICAgcmV0dXJuIFtdO1xuICB9XG4gIFxuICAvKipcbiAgICogQ29udmVydCBpbmRleCBlbnRyaWVzIHRvIEdpdEh1YiBBUEkgZm9ybWF0IGZvciBjb21wYXRpYmlsaXR5XG4gICAqL1xuICBwcml2YXRlIGNvbnZlcnRJbmRleEl0ZW1zVG9HaXRIdWJGb3JtYXQoaXRlbXM6IEluZGV4RW50cnlbXSk6IGFueVtdIHtcbiAgICByZXR1cm4gaXRlbXMubWFwKGl0ZW0gPT4gKHtcbiAgICAgIG5hbWU6IGl0ZW0ubmFtZS5lbmRzV2l0aCgnLm1kJykgPyBpdGVtLm5hbWUgOiBgJHtpdGVtLm5hbWV9Lm1kYCxcbiAgICAgIHBhdGg6IGl0ZW0ucGF0aCxcbiAgICAgIHNoYTogaXRlbS5zaGEsXG4gICAgICB0eXBlOiAnZmlsZScsXG4gICAgICB1cmw6IGBodHRwczovL2FwaS5naXRodWIuY29tL3JlcG9zL0RvbGxob3VzZU1DUC9jb2xsZWN0aW9uL2NvbnRlbnRzLyR7aXRlbS5wYXRofWAsXG4gICAgICBodG1sX3VybDogYGh0dHBzOi8vZ2l0aHViLmNvbS9Eb2xsaG91c2VNQ1AvY29sbGVjdGlvbi9ibG9iL21haW4vJHtpdGVtLnBhdGh9YFxuICAgIH0pKTtcbiAgfVxuICBcbiAgLyoqXG4gICAqIEJyb3dzZSBjb2xsZWN0aW9uIGZyb20gY2FjaGVkIGRhdGFcbiAgICovXG4gIHByaXZhdGUgYXN5bmMgYnJvd3NlRnJvbUNhY2hlKHNlY3Rpb24/OiBzdHJpbmcsIHR5cGU/OiBzdHJpbmcpOiBQcm9taXNlPHsgaXRlbXM6IGFueVtdLCBjYXRlZ29yaWVzOiBhbnlbXSwgc2VjdGlvbnM/OiBhbnlbXSB9PiB7XG4gICAgdHJ5IHtcbiAgICAgIC8vIElmIG5vIHNlY3Rpb24gcHJvdmlkZWQsIHNob3cgYXZhaWxhYmxlIHNlY3Rpb25zIGZyb20gc2VlZCBkYXRhXG4gICAgICBpZiAoIXNlY3Rpb24pIHtcbiAgICAgICAgY29uc3Qgc2VjdGlvbnMgPSBbXG4gICAgICAgICAgeyBuYW1lOiAnbGlicmFyeScsIHR5cGU6ICdkaXInIH1cbiAgICAgICAgXTtcbiAgICAgICAgcmV0dXJuIHsgaXRlbXM6IFtdLCBjYXRlZ29yaWVzOiBbXSwgc2VjdGlvbnMgfTtcbiAgICAgIH1cbiAgICAgIFxuICAgICAgLy8gR2V0IGNhY2hlZCBvciBzZWVkIGRhdGFcbiAgICAgIGxldCBjYWNoZWRJdGVtcyA9IGF3YWl0IHRoaXMuY29sbGVjdGlvbkNhY2hlLmxvYWRDYWNoZSgpO1xuICAgICAgXG4gICAgICBpZiAoIWNhY2hlZEl0ZW1zIHx8IGNhY2hlZEl0ZW1zLml0ZW1zLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAvLyBVc2Ugc2VlZCBkYXRhIGlmIGNhY2hlIGlzIGVtcHR5XG4gICAgICAgIGNvbnN0IHNlZWREYXRhID0gQ29sbGVjdGlvblNlZWRlci5nZXRTZWVkRGF0YSgpO1xuICAgICAgICBhd2FpdCB0aGlzLmNvbGxlY3Rpb25DYWNoZS5zYXZlQ2FjaGUoc2VlZERhdGEpO1xuICAgICAgICBjYWNoZWRJdGVtcyA9IHsgaXRlbXM6IHNlZWREYXRhLCB0aW1lc3RhbXA6IERhdGUubm93KCkgfTtcbiAgICAgICAgbG9nZ2VyLmRlYnVnKCdVc2luZyBzZWVkIGRhdGEgZm9yIGNvbGxlY3Rpb24gYnJvd3NpbmcnKTtcbiAgICAgIH1cbiAgICAgIFxuICAgICAgLy8gSW4gdGhlIGxpYnJhcnkgc2VjdGlvbiwgd2UgaGF2ZSBjb250ZW50IHR5cGUgZGlyZWN0b3JpZXNcbiAgICAgIGlmIChzZWN0aW9uID09PSAnbGlicmFyeScgJiYgIXR5cGUpIHtcbiAgICAgICAgY29uc3QgY29udGVudFR5cGVzID0gdGhpcy5nZXRDb250ZW50VHlwZXNGcm9tSXRlbXMoY2FjaGVkSXRlbXMuaXRlbXMpO1xuICAgICAgICByZXR1cm4geyBpdGVtczogW10sIGNhdGVnb3JpZXM6IGNvbnRlbnRUeXBlcyB9O1xuICAgICAgfVxuICAgICAgXG4gICAgICAvLyBHZXQgaXRlbXMgZm9yIHNwZWNpZmljIHR5cGUgb3IgYWxsIGl0ZW1zIGluIHNlY3Rpb25cbiAgICAgIGNvbnN0IGl0ZW1zID0gdGhpcy5maWx0ZXJJdGVtc0J5U2VjdGlvbihjYWNoZWRJdGVtcy5pdGVtcywgc2VjdGlvbiwgdHlwZSk7XG4gICAgICBjb25zdCBmb3JtYXR0ZWRJdGVtcyA9IHRoaXMuY29udmVydENhY2hlSXRlbXNUb0dpdEh1YkZvcm1hdChpdGVtcyk7XG4gICAgICBcbiAgICAgIHJldHVybiB7IGl0ZW1zOiBmb3JtYXR0ZWRJdGVtcywgY2F0ZWdvcmllczogW10gfTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgbG9nZ2VyLmVycm9yKGBDYWNoZSBicm93c2UgZmFpbGVkOiAke2Vycm9yfWApO1xuICAgICAgXG4gICAgICAvLyBMYXN0IHJlc29ydDogdXNlIHNlZWQgZGF0YSBkaXJlY3RseVxuICAgICAgcmV0dXJuIHRoaXMuYnJvd3NlRnJvbVNlZWREYXRhKHNlY3Rpb24sIHR5cGUpO1xuICAgIH1cbiAgfVxuICBcbiAgLyoqXG4gICAqIEJyb3dzZSBjb2xsZWN0aW9uIGZyb20gc2VlZCBkYXRhIGFzIGxhc3QgcmVzb3J0XG4gICAqL1xuICBwcml2YXRlIGJyb3dzZUZyb21TZWVkRGF0YShzZWN0aW9uPzogc3RyaW5nLCB0eXBlPzogc3RyaW5nKTogeyBpdGVtczogYW55W10sIGNhdGVnb3JpZXM6IGFueVtdLCBzZWN0aW9ucz86IGFueVtdIH0ge1xuICAgIGlmICghc2VjdGlvbikge1xuICAgICAgY29uc3Qgc2VjdGlvbnMgPSBbeyBuYW1lOiAnbGlicmFyeScsIHR5cGU6ICdkaXInIH1dO1xuICAgICAgcmV0dXJuIHsgaXRlbXM6IFtdLCBjYXRlZ29yaWVzOiBbXSwgc2VjdGlvbnMgfTtcbiAgICB9XG4gICAgXG4gICAgY29uc3Qgc2VlZERhdGEgPSBDb2xsZWN0aW9uU2VlZGVyLmdldFNlZWREYXRhKCk7XG4gICAgXG4gICAgaWYgKHNlY3Rpb24gPT09ICdsaWJyYXJ5JyAmJiAhdHlwZSkge1xuICAgICAgY29uc3QgY29udGVudFR5cGVzID0gdGhpcy5nZXRDb250ZW50VHlwZXNGcm9tSXRlbXMoc2VlZERhdGEpO1xuICAgICAgcmV0dXJuIHsgaXRlbXM6IFtdLCBjYXRlZ29yaWVzOiBjb250ZW50VHlwZXMgfTtcbiAgICB9XG4gICAgXG4gICAgY29uc3QgaXRlbXMgPSB0aGlzLmZpbHRlckl0ZW1zQnlTZWN0aW9uKHNlZWREYXRhLCBzZWN0aW9uLCB0eXBlKTtcbiAgICBjb25zdCBmb3JtYXR0ZWRJdGVtcyA9IHRoaXMuY29udmVydENhY2hlSXRlbXNUb0dpdEh1YkZvcm1hdChpdGVtcyk7XG4gICAgXG4gICAgcmV0dXJuIHsgaXRlbXM6IGZvcm1hdHRlZEl0ZW1zLCBjYXRlZ29yaWVzOiBbXSB9O1xuICB9XG4gIFxuICAvKipcbiAgICogR2V0IHVuaXF1ZSBjb250ZW50IHR5cGVzIGZyb20gaXRlbXNcbiAgICovXG4gIHByaXZhdGUgZ2V0Q29udGVudFR5cGVzRnJvbUl0ZW1zKGl0ZW1zOiBDb2xsZWN0aW9uSXRlbVtdKTogYW55W10ge1xuICAgIGNvbnN0IHR5cGVzID0gbmV3IFNldDxzdHJpbmc+KCk7XG4gICAgXG4gICAgaXRlbXMuZm9yRWFjaChpdGVtID0+IHtcbiAgICAgIGNvbnN0IHBhdGhQYXJ0cyA9IGl0ZW0ucGF0aC5zcGxpdCgnLycpO1xuICAgICAgaWYgKHBhdGhQYXJ0cy5sZW5ndGggPj0gMiAmJiBwYXRoUGFydHNbMF0gPT09ICdsaWJyYXJ5Jykge1xuICAgICAgICAvLyBPbmx5IGluY2x1ZGUgTUNQLXN1cHBvcnRlZCB0eXBlcyBpbiBjYWNoZSBicm93c2luZ1xuICAgICAgICBjb25zdCB0eXBlTmFtZSA9IHBhdGhQYXJ0c1sxXTtcbiAgICAgICAgY29uc3QgZWxlbWVudFR5cGUgPSBpc0VsZW1lbnRUeXBlKHR5cGVOYW1lKSA/IHR5cGVOYW1lIGFzIEVsZW1lbnRUeXBlIDogbnVsbDtcbiAgICAgICAgaWYgKGVsZW1lbnRUeXBlICYmIGlzTUNQU3VwcG9ydGVkVHlwZShlbGVtZW50VHlwZSkpIHtcbiAgICAgICAgICB0eXBlcy5hZGQodHlwZU5hbWUpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSk7XG4gICAgXG4gICAgcmV0dXJuIEFycmF5LmZyb20odHlwZXMpLm1hcCh0eXBlID0+ICh7XG4gICAgICBuYW1lOiB0eXBlLFxuICAgICAgdHlwZTogJ2RpcidcbiAgICB9KSk7XG4gIH1cbiAgXG4gIC8qKlxuICAgKiBGaWx0ZXIgaXRlbXMgYnkgc2VjdGlvbiBhbmQgdHlwZVxuICAgKi9cbiAgcHJpdmF0ZSBmaWx0ZXJJdGVtc0J5U2VjdGlvbihpdGVtczogQ29sbGVjdGlvbkl0ZW1bXSwgc2VjdGlvbjogc3RyaW5nLCB0eXBlPzogc3RyaW5nKTogQ29sbGVjdGlvbkl0ZW1bXSB7XG4gICAgcmV0dXJuIGl0ZW1zLmZpbHRlcihpdGVtID0+IHtcbiAgICAgIGNvbnN0IHBhdGhQYXJ0cyA9IGl0ZW0ucGF0aC5zcGxpdCgnLycpO1xuICAgICAgXG4gICAgICBpZiAocGF0aFBhcnRzWzBdICE9PSBzZWN0aW9uKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICAgIFxuICAgICAgaWYgKHR5cGUgJiYgcGF0aFBhcnRzWzFdICE9PSB0eXBlKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICAgIFxuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSk7XG4gIH1cbiAgXG4gIC8qKlxuICAgKiBDb252ZXJ0IGNhY2hlIGl0ZW1zIHRvIEdpdEh1YiBBUEkgZm9ybWF0XG4gICAqL1xuICBwcml2YXRlIGNvbnZlcnRDYWNoZUl0ZW1zVG9HaXRIdWJGb3JtYXQoaXRlbXM6IENvbGxlY3Rpb25JdGVtW10pOiBhbnlbXSB7XG4gICAgcmV0dXJuIGl0ZW1zLm1hcChpdGVtID0+ICh7XG4gICAgICBuYW1lOiBpdGVtLm5hbWUsXG4gICAgICBwYXRoOiBpdGVtLnBhdGgsXG4gICAgICBzaGE6IGl0ZW0uc2hhLFxuICAgICAgdHlwZTogJ2ZpbGUnLFxuICAgICAgdXJsOiBgaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS9yZXBvcy9Eb2xsaG91c2VNQ1AvY29sbGVjdGlvbi9jb250ZW50cy8ke2l0ZW0ucGF0aH1gLFxuICAgICAgaHRtbF91cmw6IGBodHRwczovL2dpdGh1Yi5jb20vRG9sbGhvdXNlTUNQL2NvbGxlY3Rpb24vYmxvYi9tYWluLyR7aXRlbS5wYXRofWBcbiAgICB9KSk7XG4gIH1cbiAgXG4gIC8qKlxuICAgKiBGb3JtYXQgY29sbGVjdGlvbiBicm93c2UgcmVzdWx0c1xuICAgKi9cbiAgZm9ybWF0QnJvd3NlUmVzdWx0cyhpdGVtczogYW55W10sIGNhdGVnb3JpZXM6IGFueVtdLCBzZWN0aW9uPzogc3RyaW5nLCB0eXBlPzogc3RyaW5nLCBwZXJzb25hSW5kaWNhdG9yOiBzdHJpbmcgPSAnJyk6IHN0cmluZyB7XG4gICAgY29uc3QgdGV4dFBhcnRzID0gW2Ake3BlcnNvbmFJbmRpY2F0b3J98J+PqiAqKkRvbGxob3VzZU1DUCBDb2xsZWN0aW9uKipcXG5cXG5gXTtcbiAgICBcbiAgICAvLyBTaG93IHRvcC1sZXZlbCBzZWN0aW9ucyBpZiBubyBzZWN0aW9uIHNwZWNpZmllZFxuICAgIGlmICghc2VjdGlvbiAmJiBjYXRlZ29yaWVzLmxlbmd0aCA+IDApIHtcbiAgICAgIHRleHRQYXJ0cy5wdXNoKGAqKvCfk5ogQ29sbGVjdGlvbiBTZWN0aW9ucyAoJHtjYXRlZ29yaWVzLmxlbmd0aH0pOioqXFxuYCk7XG4gICAgICBjYXRlZ29yaWVzLmZvckVhY2goKHNlYzogYW55KSA9PiB7XG4gICAgICAgIGNvbnN0IHNlY3Rpb25JY29uczogeyBba2V5OiBzdHJpbmddOiBzdHJpbmcgfSA9IHtcbiAgICAgICAgICAnbGlicmFyeSc6ICfwn5OWJyxcbiAgICAgICAgICAnc2hvd2Nhc2UnOiAn4q2QJyxcbiAgICAgICAgICAnY2F0YWxvZyc6ICfwn5KOJ1xuICAgICAgICB9O1xuICAgICAgICBjb25zdCBpY29uID0gc2VjdGlvbkljb25zW3NlYy5uYW1lXSB8fCAn8J+TgSc7XG4gICAgICAgIGNvbnN0IGRlc2NyaXB0aW9uczogeyBba2V5OiBzdHJpbmddOiBzdHJpbmcgfSA9IHtcbiAgICAgICAgICAnbGlicmFyeSc6ICdGcmVlIGNvbW11bml0eSBjb250ZW50JyxcbiAgICAgICAgICAnc2hvd2Nhc2UnOiAnRmVhdHVyZWQgaGlnaC1xdWFsaXR5IGNvbnRlbnQgKGNvbWluZyBzb29uKScsXG4gICAgICAgICAgJ2NhdGFsb2cnOiAnUHJlbWl1bSBjb250ZW50IChjb21pbmcgc29vbiknXG4gICAgICAgIH07XG4gICAgICAgIHRleHRQYXJ0cy5wdXNoKFxuICAgICAgICAgIGAgICAke2ljb259ICoqJHtzZWMubmFtZX0qKiAtICR7ZGVzY3JpcHRpb25zW3NlYy5uYW1lXSB8fCAnQ29udGVudCBjb2xsZWN0aW9uJ31cXG5gLFxuICAgICAgICAgIGAgICAgICBCcm93c2U6IFxcYGJyb3dzZV9jb2xsZWN0aW9uIFwiJHtzZWMubmFtZX1cIlxcYFxcblxcbmBcbiAgICAgICAgKTtcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIHRleHRQYXJ0cy5qb2luKCcnKTtcbiAgICB9XG4gICAgXG4gICAgLy8gU2hvdyBjb250ZW50IHR5cGVzIHdpdGhpbiBsaWJyYXJ5IHNlY3Rpb25cbiAgICBpZiAoc2VjdGlvbiA9PT0gJ2xpYnJhcnknICYmICF0eXBlICYmIGNhdGVnb3JpZXMubGVuZ3RoID4gMCkge1xuICAgICAgdGV4dFBhcnRzLnB1c2goYCoq8J+TliBMaWJyYXJ5IENvbnRlbnQgVHlwZXMgKCR7Y2F0ZWdvcmllcy5sZW5ndGh9KToqKlxcbmApO1xuICAgICAgY2F0ZWdvcmllcy5mb3JFYWNoKChjYXQ6IGFueSkgPT4ge1xuICAgICAgICBjb25zdCB0eXBlSWNvbnM6IHsgW2tleTogc3RyaW5nXTogc3RyaW5nIH0gPSB7XG4gICAgICAgICAgJ3BlcnNvbmFzJzogJ/Cfjq0nLFxuICAgICAgICAgICdza2lsbHMnOiAn8J+boO+4jycsXG4gICAgICAgICAgJ2FnZW50cyc6ICfwn6SWJyxcbiAgICAgICAgICAndGVtcGxhdGVzJzogJ/Cfk4QnLFxuICAgICAgICAgICdlbnNlbWJsZXMnOiAn8J+OvCcsXG4gICAgICAgICAgJ21lbW9yaWVzJzogJ/Cfp6AnXG4gICAgICAgIH07XG4gICAgICAgIGNvbnN0IGljb24gPSB0eXBlSWNvbnNbY2F0Lm5hbWVdIHx8ICfwn5OBJztcbiAgICAgICAgdGV4dFBhcnRzLnB1c2goYCAgICR7aWNvbn0gKioke2NhdC5uYW1lfSoqIC0gQnJvd3NlOiBcXGBicm93c2VfY29sbGVjdGlvbiBcImxpYnJhcnlcIiBcIiR7Y2F0Lm5hbWV9XCJcXGBcXG5gKTtcbiAgICAgIH0pO1xuICAgICAgdGV4dFBhcnRzLnB1c2goJ1xcbicpO1xuICAgIH0gZWxzZSBpZiAoY2F0ZWdvcmllcy5sZW5ndGggPiAwKSB7XG4gICAgICAvLyBPbmx5IHNob3cgY2F0ZWdvcnkgbmF2aWdhdGlvbiBmb3Igbm9uLWxpYnJhcnkgc2VjdGlvbnMgKHNob3djYXNlLCBjYXRhbG9nKVxuICAgICAgdGV4dFBhcnRzLnB1c2goYCoq8J+TgSBTdWJkaXJlY3RvcmllcyBpbiAke3NlY3Rpb259JHt0eXBlID8gYC8ke3R5cGV9YCA6ICcnfSAoJHtjYXRlZ29yaWVzLmxlbmd0aH0pOioqXFxuYCk7XG4gICAgICBjYXRlZ29yaWVzLmZvckVhY2goKGNhdDogYW55KSA9PiB7XG4gICAgICAgIGNvbnN0IGJyb3dzZVBhdGggPSB0eXBlID8gYFwiJHtzZWN0aW9ufVwiIFwiJHt0eXBlfS8ke2NhdC5uYW1lfVwiYCA6IGBcIiR7c2VjdGlvbn1cIiBcIiR7Y2F0Lm5hbWV9XCJgO1xuICAgICAgICB0ZXh0UGFydHMucHVzaChgICAg8J+TgiAqKiR7Y2F0Lm5hbWV9KiogLSBCcm93c2U6IFxcYGJyb3dzZV9jb2xsZWN0aW9uICR7YnJvd3NlUGF0aH1cXGBcXG5gKTtcbiAgICAgIH0pO1xuICAgICAgdGV4dFBhcnRzLnB1c2goJ1xcbicpO1xuICAgIH1cbiAgICBcbiAgICBpZiAoaXRlbXMubGVuZ3RoID4gMCkge1xuICAgICAgY29uc3QgY29udGVudFR5cGUgPSB0eXBlIHx8ICdjb250ZW50JztcbiAgICAgIGNvbnN0IGNvbnRlbnRJY29uczogeyBba2V5OiBzdHJpbmddOiBzdHJpbmcgfSA9IHtcbiAgICAgICAgJ3BlcnNvbmFzJzogJ/Cfjq0nLFxuICAgICAgICAnc2tpbGxzJzogJ/Cfm6DvuI8nLFxuICAgICAgICAnYWdlbnRzJzogJ/CfpJYnLFxuICAgICAgICAndGVtcGxhdGVzJzogJ/Cfk4QnLFxuICAgICAgICAnZW5zZW1ibGVzJzogJ/CfjrwnLFxuICAgICAgICAnbWVtb3JpZXMnOiAn8J+noCdcbiAgICAgIH07XG4gICAgICBjb25zdCBpY29uID0gY29udGVudEljb25zW2NvbnRlbnRUeXBlXSB8fCAn8J+ThCc7XG4gICAgICBcbiAgICAgIHRleHRQYXJ0cy5wdXNoKGAqKiR7aWNvbn0gJHtjb250ZW50VHlwZS5jaGFyQXQoMCkudG9VcHBlckNhc2UoKSArIGNvbnRlbnRUeXBlLnNsaWNlKDEpfSBpbiAke3NlY3Rpb259JHt0eXBlID8gYC8ke3R5cGV9YCA6ICcnfSAoJHtpdGVtcy5sZW5ndGh9KToqKlxcbmApO1xuICAgICAgaXRlbXMuZm9yRWFjaCgoaXRlbTogYW55KSA9PiB7XG4gICAgICAgIGNvbnN0IGZ1bGxQYXRoID0gc2VjdGlvbiArICh0eXBlID8gYC8ke3R5cGV9YCA6ICcnKSArIGAvJHtpdGVtLm5hbWV9YDtcbiAgICAgICAgdGV4dFBhcnRzLnB1c2goXG4gICAgICAgICAgYCAgIOKWq++4jyAqKiR7aXRlbS5uYW1lLnJlcGxhY2UoJy5tZCcsICcnKX0qKlxcbmAsXG4gICAgICAgICAgYCAgICAgIPCfk6UgSW5zdGFsbDogXFxgaW5zdGFsbF9jb250ZW50IFwiJHtmdWxsUGF0aH1cIlxcYFxcbmAsXG4gICAgICAgICAgYCAgICAgIPCfkYHvuI8gRGV0YWlsczogXFxgZ2V0X2NvbGxlY3Rpb25fY29udGVudCBcIiR7ZnVsbFBhdGh9XCJcXGBcXG5cXG5gXG4gICAgICAgICk7XG4gICAgICB9KTtcbiAgICB9XG4gICAgXG4gICAgcmV0dXJuIHRleHRQYXJ0cy5qb2luKCcnKTtcbiAgfVxufSJdfQ==
|
|
@@ -0,0 +1,151 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Collection Index Manager with Background Refresh and Robust Caching
|
|
3
|
+
*
|
|
4
|
+
* This manager implements:
|
|
5
|
+
* - 1-hour TTL with local file caching
|
|
6
|
+
* - Background refresh without blocking operations
|
|
7
|
+
* - Exponential backoff retry logic
|
|
8
|
+
* - Configurable timeouts via environment variables
|
|
9
|
+
* - Return stale cache while refreshing in background
|
|
10
|
+
* - Comprehensive error handling for production use
|
|
11
|
+
*/
|
|
12
|
+
import { CollectionIndex } from '../types/collection';
|
|
13
|
+
export interface CollectionIndexCacheEntry {
|
|
14
|
+
data: CollectionIndex;
|
|
15
|
+
timestamp: number;
|
|
16
|
+
etag?: string;
|
|
17
|
+
lastModified?: string;
|
|
18
|
+
version: string;
|
|
19
|
+
checksum: string;
|
|
20
|
+
}
|
|
21
|
+
export interface CollectionIndexManagerConfig {
|
|
22
|
+
ttlMs?: number;
|
|
23
|
+
fetchTimeoutMs?: number;
|
|
24
|
+
maxRetries?: number;
|
|
25
|
+
baseRetryDelayMs?: number;
|
|
26
|
+
maxRetryDelayMs?: number;
|
|
27
|
+
cacheDir?: string;
|
|
28
|
+
}
|
|
29
|
+
export declare class CollectionIndexManager {
|
|
30
|
+
private readonly INDEX_URL;
|
|
31
|
+
private readonly TTL_MS;
|
|
32
|
+
private readonly FETCH_TIMEOUT_MS;
|
|
33
|
+
private readonly MAX_RETRIES;
|
|
34
|
+
private readonly BASE_RETRY_DELAY_MS;
|
|
35
|
+
private readonly MAX_RETRY_DELAY_MS;
|
|
36
|
+
private readonly CACHE_FILE;
|
|
37
|
+
private cachedIndex;
|
|
38
|
+
private backgroundRefreshPromise;
|
|
39
|
+
private isRefreshing;
|
|
40
|
+
private circuitBreakerFailures;
|
|
41
|
+
private circuitBreakerLastFailure;
|
|
42
|
+
private readonly CIRCUIT_BREAKER_THRESHOLD;
|
|
43
|
+
private readonly CIRCUIT_BREAKER_TIMEOUT_MS;
|
|
44
|
+
private readonly REFRESH_THRESHOLD;
|
|
45
|
+
private readonly JITTER_FACTOR;
|
|
46
|
+
private readonly DEFAULT_TTL_MS;
|
|
47
|
+
private readonly DEFAULT_MAX_RETRIES;
|
|
48
|
+
private readonly DEFAULT_BASE_RETRY_DELAY_MS;
|
|
49
|
+
private readonly DEFAULT_MAX_RETRY_DELAY_MS;
|
|
50
|
+
private readonly DEFAULT_FETCH_TIMEOUT_MS;
|
|
51
|
+
private readonly CHECKSUM_LENGTH;
|
|
52
|
+
private readonly JSON_INDENT;
|
|
53
|
+
constructor(config?: CollectionIndexManagerConfig);
|
|
54
|
+
/**
|
|
55
|
+
* Parse fetch timeout from config or environment variable
|
|
56
|
+
*/
|
|
57
|
+
private parseFetchTimeout;
|
|
58
|
+
/**
|
|
59
|
+
* Get collection index with stale-while-revalidate pattern
|
|
60
|
+
* Returns cached data immediately if available, refreshes in background
|
|
61
|
+
*/
|
|
62
|
+
getIndex(): Promise<CollectionIndex>;
|
|
63
|
+
/**
|
|
64
|
+
* Force refresh the collection index
|
|
65
|
+
*/
|
|
66
|
+
forceRefresh(): Promise<CollectionIndex>;
|
|
67
|
+
/**
|
|
68
|
+
* Check if cache should be refreshed (within TTL but getting close to expiry)
|
|
69
|
+
*/
|
|
70
|
+
private shouldRefreshCache;
|
|
71
|
+
/**
|
|
72
|
+
* Check if cache is expired
|
|
73
|
+
*/
|
|
74
|
+
private isCacheExpired;
|
|
75
|
+
/**
|
|
76
|
+
* Start background refresh without blocking
|
|
77
|
+
*/
|
|
78
|
+
private startBackgroundRefresh;
|
|
79
|
+
/**
|
|
80
|
+
* Perform background refresh
|
|
81
|
+
*/
|
|
82
|
+
private performBackgroundRefresh;
|
|
83
|
+
/**
|
|
84
|
+
* Fetch collection index with retry logic and exponential backoff
|
|
85
|
+
*/
|
|
86
|
+
private fetchWithRetry;
|
|
87
|
+
/**
|
|
88
|
+
* Calculate retry delay with exponential backoff and jitter
|
|
89
|
+
*/
|
|
90
|
+
private calculateRetryDelay;
|
|
91
|
+
/**
|
|
92
|
+
* Add jitter (±25% randomness) to a delay to prevent thundering herd problems
|
|
93
|
+
*/
|
|
94
|
+
private addJitter;
|
|
95
|
+
/**
|
|
96
|
+
* Fetch collection index from GitHub
|
|
97
|
+
*/
|
|
98
|
+
private fetchCollectionIndex;
|
|
99
|
+
/**
|
|
100
|
+
* Validate collection index structure
|
|
101
|
+
*/
|
|
102
|
+
private validateIndexStructure;
|
|
103
|
+
/**
|
|
104
|
+
* Update cache with new data
|
|
105
|
+
*/
|
|
106
|
+
private updateCache;
|
|
107
|
+
/**
|
|
108
|
+
* Calculate checksum for data integrity verification
|
|
109
|
+
*/
|
|
110
|
+
private calculateChecksum;
|
|
111
|
+
/**
|
|
112
|
+
* Load cache from disk
|
|
113
|
+
*/
|
|
114
|
+
private loadFromDisk;
|
|
115
|
+
/**
|
|
116
|
+
* Save cache to disk
|
|
117
|
+
*/
|
|
118
|
+
private saveToDisk;
|
|
119
|
+
/**
|
|
120
|
+
* Circuit breaker logic
|
|
121
|
+
*/
|
|
122
|
+
private isCircuitBreakerOpen;
|
|
123
|
+
private recordCircuitBreakerFailure;
|
|
124
|
+
/**
|
|
125
|
+
* Utility methods
|
|
126
|
+
*/
|
|
127
|
+
private sleep;
|
|
128
|
+
private getErrorMessage;
|
|
129
|
+
/**
|
|
130
|
+
* Get cache statistics for monitoring
|
|
131
|
+
*/
|
|
132
|
+
getCacheStats(): {
|
|
133
|
+
isValid: boolean;
|
|
134
|
+
age: number;
|
|
135
|
+
hasCache: boolean;
|
|
136
|
+
version?: string;
|
|
137
|
+
totalElements?: number;
|
|
138
|
+
isRefreshing: boolean;
|
|
139
|
+
circuitBreakerFailures: number;
|
|
140
|
+
circuitBreakerOpen: boolean;
|
|
141
|
+
};
|
|
142
|
+
/**
|
|
143
|
+
* Clear all cache data
|
|
144
|
+
*/
|
|
145
|
+
clearCache(): Promise<void>;
|
|
146
|
+
/**
|
|
147
|
+
* Wait for any ongoing background refresh to complete
|
|
148
|
+
*/
|
|
149
|
+
waitForBackgroundRefresh(): Promise<void>;
|
|
150
|
+
}
|
|
151
|
+
//# sourceMappingURL=CollectionIndexManager.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"CollectionIndexManager.d.ts","sourceRoot":"","sources":["../../src/collection/CollectionIndexManager.ts"],"names":[],"mappings":"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"}
|