@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
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* High-performance LRU Cache with memory monitoring and automatic cleanup
|
|
3
|
+
* Optimized for large-scale indexing operations with configurable memory limits
|
|
4
|
+
*/
|
|
5
|
+
export interface LRUCacheOptions {
|
|
6
|
+
maxSize: number;
|
|
7
|
+
maxMemoryMB?: number;
|
|
8
|
+
ttlMs?: number;
|
|
9
|
+
onEviction?: (key: string, value: any) => void;
|
|
10
|
+
}
|
|
11
|
+
export interface CacheStats {
|
|
12
|
+
size: number;
|
|
13
|
+
maxSize: number;
|
|
14
|
+
hitCount: number;
|
|
15
|
+
missCount: number;
|
|
16
|
+
evictionCount: number;
|
|
17
|
+
memoryUsageMB: number;
|
|
18
|
+
hitRate: number;
|
|
19
|
+
}
|
|
20
|
+
export declare class LRUCache<T> {
|
|
21
|
+
private readonly maxSize;
|
|
22
|
+
private readonly maxMemoryBytes;
|
|
23
|
+
private readonly ttlMs;
|
|
24
|
+
private readonly onEviction?;
|
|
25
|
+
private cache;
|
|
26
|
+
private head;
|
|
27
|
+
private tail;
|
|
28
|
+
private currentMemoryBytes;
|
|
29
|
+
private hitCount;
|
|
30
|
+
private missCount;
|
|
31
|
+
private evictionCount;
|
|
32
|
+
constructor(options: LRUCacheOptions);
|
|
33
|
+
/**
|
|
34
|
+
* Get value from cache with automatic cleanup
|
|
35
|
+
*/
|
|
36
|
+
get(key: string): T | null;
|
|
37
|
+
/**
|
|
38
|
+
* Set value in cache with automatic eviction
|
|
39
|
+
*/
|
|
40
|
+
set(key: string, value: T): void;
|
|
41
|
+
/**
|
|
42
|
+
* Delete specific key from cache
|
|
43
|
+
*/
|
|
44
|
+
delete(key: string): boolean;
|
|
45
|
+
/**
|
|
46
|
+
* Check if key exists in cache
|
|
47
|
+
*/
|
|
48
|
+
has(key: string): boolean;
|
|
49
|
+
/**
|
|
50
|
+
* Clear all entries from cache
|
|
51
|
+
*/
|
|
52
|
+
clear(): void;
|
|
53
|
+
/**
|
|
54
|
+
* Get cache statistics
|
|
55
|
+
*/
|
|
56
|
+
getStats(): CacheStats;
|
|
57
|
+
/**
|
|
58
|
+
* Get all keys in access order (most recent first)
|
|
59
|
+
*/
|
|
60
|
+
keys(): string[];
|
|
61
|
+
/**
|
|
62
|
+
* Get current memory usage in MB
|
|
63
|
+
*/
|
|
64
|
+
getMemoryUsageMB(): number;
|
|
65
|
+
/**
|
|
66
|
+
* Manually trigger cleanup of expired entries
|
|
67
|
+
*/
|
|
68
|
+
cleanup(): number;
|
|
69
|
+
private moveToFront;
|
|
70
|
+
private addToFront;
|
|
71
|
+
private removeNode;
|
|
72
|
+
private evictIfNecessary;
|
|
73
|
+
private evictLeastRecentlyUsed;
|
|
74
|
+
private estimateSize;
|
|
75
|
+
}
|
|
76
|
+
/**
|
|
77
|
+
* Factory for creating optimized LRU caches for different use cases
|
|
78
|
+
*/
|
|
79
|
+
export declare class CacheFactory {
|
|
80
|
+
/**
|
|
81
|
+
* Create cache optimized for search results
|
|
82
|
+
*/
|
|
83
|
+
static createSearchResultCache<T>(options?: Partial<LRUCacheOptions>): LRUCache<T>;
|
|
84
|
+
/**
|
|
85
|
+
* Create cache optimized for index data
|
|
86
|
+
*/
|
|
87
|
+
static createIndexCache<T>(options?: Partial<LRUCacheOptions>): LRUCache<T>;
|
|
88
|
+
/**
|
|
89
|
+
* Create cache optimized for API responses
|
|
90
|
+
*/
|
|
91
|
+
static createAPICache<T>(options?: Partial<LRUCacheOptions>): LRUCache<T>;
|
|
92
|
+
}
|
|
93
|
+
//# sourceMappingURL=LRUCache.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"LRUCache.d.ts","sourceRoot":"","sources":["../../src/cache/LRUCache.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAIH,MAAM,WAAW,eAAe;IAC9B,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,UAAU,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG,KAAK,IAAI,CAAC;CAChD;AAED,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,aAAa,EAAE,MAAM,CAAC;IACtB,aAAa,EAAE,MAAM,CAAC;IACtB,OAAO,EAAE,MAAM,CAAC;CACjB;AAWD,qBAAa,QAAQ,CAAC,CAAC;IACrB,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAS;IACjC,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAS;IACxC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAS;IAC/B,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAkC;IAE9D,OAAO,CAAC,KAAK,CAAmC;IAChD,OAAO,CAAC,IAAI,CAA6B;IACzC,OAAO,CAAC,IAAI,CAA6B;IACzC,OAAO,CAAC,kBAAkB,CAAK;IAG/B,OAAO,CAAC,QAAQ,CAAK;IACrB,OAAO,CAAC,SAAS,CAAK;IACtB,OAAO,CAAC,aAAa,CAAK;gBAEd,OAAO,EAAE,eAAe;IAOpC;;OAEG;IACH,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,CAAC,GAAG,IAAI;IAqB1B;;OAEG;IACH,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,GAAG,IAAI;IAgChC;;OAEG;IACH,MAAM,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO;IAiB5B;;OAEG;IACH,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO;IAezB;;OAEG;IACH,KAAK,IAAI,IAAI;IAcb;;OAEG;IACH,QAAQ,IAAI,UAAU;IAYtB;;OAEG;IACH,IAAI,IAAI,MAAM,EAAE;IAYhB;;OAEG;IACH,gBAAgB,IAAI,MAAM;IAI1B;;OAEG;IACH,OAAO,IAAI,MAAM;IAuBjB,OAAO,CAAC,WAAW;IAYnB,OAAO,CAAC,UAAU;IAelB,OAAO,CAAC,UAAU;IAclB,OAAO,CAAC,gBAAgB;IAiBxB,OAAO,CAAC,sBAAsB;IAgB9B,OAAO,CAAC,YAAY;CA8BrB;AAED;;GAEG;AACH,qBAAa,YAAY;IACvB;;OAEG;IACH,MAAM,CAAC,uBAAuB,CAAC,CAAC,EAAE,OAAO,CAAC,EAAE,OAAO,CAAC,eAAe,CAAC,GAAG,QAAQ,CAAC,CAAC,CAAC;IASlF;;OAEG;IACH,MAAM,CAAC,gBAAgB,CAAC,CAAC,EAAE,OAAO,CAAC,EAAE,OAAO,CAAC,eAAe,CAAC,GAAG,QAAQ,CAAC,CAAC,CAAC;IAS3E;;OAEG;IACH,MAAM,CAAC,cAAc,CAAC,CAAC,EAAE,OAAO,CAAC,EAAE,OAAO,CAAC,eAAe,CAAC,GAAG,QAAQ,CAAC,CAAC,CAAC;CAQ1E"}
|
|
@@ -0,0 +1,299 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* High-performance LRU Cache with memory monitoring and automatic cleanup
|
|
3
|
+
* Optimized for large-scale indexing operations with configurable memory limits
|
|
4
|
+
*/
|
|
5
|
+
export class LRUCache {
|
|
6
|
+
maxSize;
|
|
7
|
+
maxMemoryBytes;
|
|
8
|
+
ttlMs;
|
|
9
|
+
onEviction;
|
|
10
|
+
cache = new Map();
|
|
11
|
+
head = null;
|
|
12
|
+
tail = null;
|
|
13
|
+
currentMemoryBytes = 0;
|
|
14
|
+
// Performance counters
|
|
15
|
+
hitCount = 0;
|
|
16
|
+
missCount = 0;
|
|
17
|
+
evictionCount = 0;
|
|
18
|
+
constructor(options) {
|
|
19
|
+
this.maxSize = options.maxSize;
|
|
20
|
+
this.maxMemoryBytes = (options.maxMemoryMB || 50) * 1024 * 1024; // Convert MB to bytes
|
|
21
|
+
this.ttlMs = options.ttlMs || 0; // 0 means no TTL
|
|
22
|
+
this.onEviction = options.onEviction;
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* Get value from cache with automatic cleanup
|
|
26
|
+
*/
|
|
27
|
+
get(key) {
|
|
28
|
+
const node = this.cache.get(key);
|
|
29
|
+
if (!node) {
|
|
30
|
+
this.missCount++;
|
|
31
|
+
return null;
|
|
32
|
+
}
|
|
33
|
+
// Check TTL if enabled
|
|
34
|
+
if (this.ttlMs > 0 && Date.now() - node.timestamp > this.ttlMs) {
|
|
35
|
+
this.delete(key);
|
|
36
|
+
this.missCount++;
|
|
37
|
+
return null;
|
|
38
|
+
}
|
|
39
|
+
// Move to front (most recently used)
|
|
40
|
+
this.moveToFront(node);
|
|
41
|
+
this.hitCount++;
|
|
42
|
+
return node.value;
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* Set value in cache with automatic eviction
|
|
46
|
+
*/
|
|
47
|
+
set(key, value) {
|
|
48
|
+
const existingNode = this.cache.get(key);
|
|
49
|
+
if (existingNode) {
|
|
50
|
+
// Update existing node
|
|
51
|
+
const oldSize = existingNode.size;
|
|
52
|
+
existingNode.value = value;
|
|
53
|
+
existingNode.timestamp = Date.now();
|
|
54
|
+
existingNode.size = this.estimateSize(value);
|
|
55
|
+
this.currentMemoryBytes += existingNode.size - oldSize;
|
|
56
|
+
this.moveToFront(existingNode);
|
|
57
|
+
}
|
|
58
|
+
else {
|
|
59
|
+
// Create new node
|
|
60
|
+
const newNode = {
|
|
61
|
+
key,
|
|
62
|
+
value,
|
|
63
|
+
prev: null,
|
|
64
|
+
next: null,
|
|
65
|
+
timestamp: Date.now(),
|
|
66
|
+
size: this.estimateSize(value)
|
|
67
|
+
};
|
|
68
|
+
this.cache.set(key, newNode);
|
|
69
|
+
this.currentMemoryBytes += newNode.size;
|
|
70
|
+
this.addToFront(newNode);
|
|
71
|
+
}
|
|
72
|
+
// Evict if necessary
|
|
73
|
+
this.evictIfNecessary();
|
|
74
|
+
}
|
|
75
|
+
/**
|
|
76
|
+
* Delete specific key from cache
|
|
77
|
+
*/
|
|
78
|
+
delete(key) {
|
|
79
|
+
const node = this.cache.get(key);
|
|
80
|
+
if (!node) {
|
|
81
|
+
return false;
|
|
82
|
+
}
|
|
83
|
+
this.removeNode(node);
|
|
84
|
+
this.cache.delete(key);
|
|
85
|
+
this.currentMemoryBytes -= node.size;
|
|
86
|
+
if (this.onEviction) {
|
|
87
|
+
this.onEviction(key, node.value);
|
|
88
|
+
}
|
|
89
|
+
return true;
|
|
90
|
+
}
|
|
91
|
+
/**
|
|
92
|
+
* Check if key exists in cache
|
|
93
|
+
*/
|
|
94
|
+
has(key) {
|
|
95
|
+
const node = this.cache.get(key);
|
|
96
|
+
if (!node) {
|
|
97
|
+
return false;
|
|
98
|
+
}
|
|
99
|
+
// Check TTL
|
|
100
|
+
if (this.ttlMs > 0 && Date.now() - node.timestamp > this.ttlMs) {
|
|
101
|
+
this.delete(key);
|
|
102
|
+
return false;
|
|
103
|
+
}
|
|
104
|
+
return true;
|
|
105
|
+
}
|
|
106
|
+
/**
|
|
107
|
+
* Clear all entries from cache
|
|
108
|
+
*/
|
|
109
|
+
clear() {
|
|
110
|
+
if (this.onEviction) {
|
|
111
|
+
for (const [key, node] of this.cache) {
|
|
112
|
+
this.onEviction(key, node.value);
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
this.cache.clear();
|
|
116
|
+
this.head = null;
|
|
117
|
+
this.tail = null;
|
|
118
|
+
this.currentMemoryBytes = 0;
|
|
119
|
+
this.evictionCount += this.cache.size;
|
|
120
|
+
}
|
|
121
|
+
/**
|
|
122
|
+
* Get cache statistics
|
|
123
|
+
*/
|
|
124
|
+
getStats() {
|
|
125
|
+
return {
|
|
126
|
+
size: this.cache.size,
|
|
127
|
+
maxSize: this.maxSize,
|
|
128
|
+
hitCount: this.hitCount,
|
|
129
|
+
missCount: this.missCount,
|
|
130
|
+
evictionCount: this.evictionCount,
|
|
131
|
+
memoryUsageMB: this.currentMemoryBytes / (1024 * 1024),
|
|
132
|
+
hitRate: this.hitCount + this.missCount > 0 ? this.hitCount / (this.hitCount + this.missCount) : 0
|
|
133
|
+
};
|
|
134
|
+
}
|
|
135
|
+
/**
|
|
136
|
+
* Get all keys in access order (most recent first)
|
|
137
|
+
*/
|
|
138
|
+
keys() {
|
|
139
|
+
const keys = [];
|
|
140
|
+
let current = this.head;
|
|
141
|
+
while (current) {
|
|
142
|
+
keys.push(current.key);
|
|
143
|
+
current = current.next;
|
|
144
|
+
}
|
|
145
|
+
return keys;
|
|
146
|
+
}
|
|
147
|
+
/**
|
|
148
|
+
* Get current memory usage in MB
|
|
149
|
+
*/
|
|
150
|
+
getMemoryUsageMB() {
|
|
151
|
+
return this.currentMemoryBytes / (1024 * 1024);
|
|
152
|
+
}
|
|
153
|
+
/**
|
|
154
|
+
* Manually trigger cleanup of expired entries
|
|
155
|
+
*/
|
|
156
|
+
cleanup() {
|
|
157
|
+
if (this.ttlMs <= 0) {
|
|
158
|
+
return 0;
|
|
159
|
+
}
|
|
160
|
+
const now = Date.now();
|
|
161
|
+
const keysToDelete = [];
|
|
162
|
+
for (const [key, node] of this.cache) {
|
|
163
|
+
if (now - node.timestamp > this.ttlMs) {
|
|
164
|
+
keysToDelete.push(key);
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
for (const key of keysToDelete) {
|
|
168
|
+
this.delete(key);
|
|
169
|
+
}
|
|
170
|
+
return keysToDelete.length;
|
|
171
|
+
}
|
|
172
|
+
// Private methods
|
|
173
|
+
moveToFront(node) {
|
|
174
|
+
if (node === this.head) {
|
|
175
|
+
return; // Already at front
|
|
176
|
+
}
|
|
177
|
+
// Remove from current position
|
|
178
|
+
this.removeNode(node);
|
|
179
|
+
// Add to front
|
|
180
|
+
this.addToFront(node);
|
|
181
|
+
}
|
|
182
|
+
addToFront(node) {
|
|
183
|
+
node.prev = null;
|
|
184
|
+
node.next = this.head;
|
|
185
|
+
if (this.head) {
|
|
186
|
+
this.head.prev = node;
|
|
187
|
+
}
|
|
188
|
+
this.head = node;
|
|
189
|
+
if (!this.tail) {
|
|
190
|
+
this.tail = node;
|
|
191
|
+
}
|
|
192
|
+
}
|
|
193
|
+
removeNode(node) {
|
|
194
|
+
if (node.prev) {
|
|
195
|
+
node.prev.next = node.next;
|
|
196
|
+
}
|
|
197
|
+
else {
|
|
198
|
+
this.head = node.next;
|
|
199
|
+
}
|
|
200
|
+
if (node.next) {
|
|
201
|
+
node.next.prev = node.prev;
|
|
202
|
+
}
|
|
203
|
+
else {
|
|
204
|
+
this.tail = node.prev;
|
|
205
|
+
}
|
|
206
|
+
}
|
|
207
|
+
evictIfNecessary() {
|
|
208
|
+
// Evict by size
|
|
209
|
+
while (this.cache.size > this.maxSize) {
|
|
210
|
+
this.evictLeastRecentlyUsed();
|
|
211
|
+
}
|
|
212
|
+
// Evict by memory
|
|
213
|
+
while (this.currentMemoryBytes > this.maxMemoryBytes && this.tail) {
|
|
214
|
+
this.evictLeastRecentlyUsed();
|
|
215
|
+
}
|
|
216
|
+
// Cleanup expired entries if TTL is enabled
|
|
217
|
+
if (this.ttlMs > 0 && Math.random() < 0.1) { // 10% chance to trigger cleanup
|
|
218
|
+
this.cleanup();
|
|
219
|
+
}
|
|
220
|
+
}
|
|
221
|
+
evictLeastRecentlyUsed() {
|
|
222
|
+
if (!this.tail) {
|
|
223
|
+
return;
|
|
224
|
+
}
|
|
225
|
+
const evicted = this.tail;
|
|
226
|
+
this.removeNode(evicted);
|
|
227
|
+
this.cache.delete(evicted.key);
|
|
228
|
+
this.currentMemoryBytes -= evicted.size;
|
|
229
|
+
this.evictionCount++;
|
|
230
|
+
if (this.onEviction) {
|
|
231
|
+
this.onEviction(evicted.key, evicted.value);
|
|
232
|
+
}
|
|
233
|
+
}
|
|
234
|
+
estimateSize(value) {
|
|
235
|
+
try {
|
|
236
|
+
// Simple estimation - can be improved with more sophisticated sizing
|
|
237
|
+
if (value === null || value === undefined) {
|
|
238
|
+
return 8; // Basic pointer size
|
|
239
|
+
}
|
|
240
|
+
if (typeof value === 'string') {
|
|
241
|
+
return value.length * 2; // UTF-16 characters
|
|
242
|
+
}
|
|
243
|
+
if (typeof value === 'number' || typeof value === 'boolean') {
|
|
244
|
+
return 8;
|
|
245
|
+
}
|
|
246
|
+
if (Array.isArray(value)) {
|
|
247
|
+
return value.reduce((acc, item) => acc + this.estimateSize(item), 32); // Array overhead
|
|
248
|
+
}
|
|
249
|
+
if (typeof value === 'object') {
|
|
250
|
+
// Rough estimation for objects
|
|
251
|
+
const jsonStr = JSON.stringify(value);
|
|
252
|
+
return jsonStr.length * 2 + 64; // String size + object overhead
|
|
253
|
+
}
|
|
254
|
+
return 64; // Default size for unknown types
|
|
255
|
+
}
|
|
256
|
+
catch {
|
|
257
|
+
return 64; // Fallback size
|
|
258
|
+
}
|
|
259
|
+
}
|
|
260
|
+
}
|
|
261
|
+
/**
|
|
262
|
+
* Factory for creating optimized LRU caches for different use cases
|
|
263
|
+
*/
|
|
264
|
+
export class CacheFactory {
|
|
265
|
+
/**
|
|
266
|
+
* Create cache optimized for search results
|
|
267
|
+
*/
|
|
268
|
+
static createSearchResultCache(options) {
|
|
269
|
+
return new LRUCache({
|
|
270
|
+
maxSize: 100,
|
|
271
|
+
maxMemoryMB: 10,
|
|
272
|
+
ttlMs: 5 * 60 * 1000, // 5 minutes
|
|
273
|
+
...options
|
|
274
|
+
});
|
|
275
|
+
}
|
|
276
|
+
/**
|
|
277
|
+
* Create cache optimized for index data
|
|
278
|
+
*/
|
|
279
|
+
static createIndexCache(options) {
|
|
280
|
+
return new LRUCache({
|
|
281
|
+
maxSize: 50,
|
|
282
|
+
maxMemoryMB: 25,
|
|
283
|
+
ttlMs: 15 * 60 * 1000, // 15 minutes
|
|
284
|
+
...options
|
|
285
|
+
});
|
|
286
|
+
}
|
|
287
|
+
/**
|
|
288
|
+
* Create cache optimized for API responses
|
|
289
|
+
*/
|
|
290
|
+
static createAPICache(options) {
|
|
291
|
+
return new LRUCache({
|
|
292
|
+
maxSize: 200,
|
|
293
|
+
maxMemoryMB: 5,
|
|
294
|
+
ttlMs: 10 * 60 * 1000, // 10 minutes
|
|
295
|
+
...options
|
|
296
|
+
});
|
|
297
|
+
}
|
|
298
|
+
}
|
|
299
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiTFJVQ2FjaGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvY2FjaGUvTFJVQ2FjaGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7OztHQUdHO0FBOEJILE1BQU0sT0FBTyxRQUFRO0lBQ0YsT0FBTyxDQUFTO0lBQ2hCLGNBQWMsQ0FBUztJQUN2QixLQUFLLENBQVM7SUFDZCxVQUFVLENBQW1DO0lBRXRELEtBQUssR0FBRyxJQUFJLEdBQUcsRUFBd0IsQ0FBQztJQUN4QyxJQUFJLEdBQXdCLElBQUksQ0FBQztJQUNqQyxJQUFJLEdBQXdCLElBQUksQ0FBQztJQUNqQyxrQkFBa0IsR0FBRyxDQUFDLENBQUM7SUFFL0IsdUJBQXVCO0lBQ2YsUUFBUSxHQUFHLENBQUMsQ0FBQztJQUNiLFNBQVMsR0FBRyxDQUFDLENBQUM7SUFDZCxhQUFhLEdBQUcsQ0FBQyxDQUFDO0lBRTFCLFlBQVksT0FBd0I7UUFDbEMsSUFBSSxDQUFDLE9BQU8sR0FBRyxPQUFPLENBQUMsT0FBTyxDQUFDO1FBQy9CLElBQUksQ0FBQyxjQUFjLEdBQUcsQ0FBQyxPQUFPLENBQUMsV0FBVyxJQUFJLEVBQUUsQ0FBQyxHQUFHLElBQUksR0FBRyxJQUFJLENBQUMsQ0FBQyxzQkFBc0I7UUFDdkYsSUFBSSxDQUFDLEtBQUssR0FBRyxPQUFPLENBQUMsS0FBSyxJQUFJLENBQUMsQ0FBQyxDQUFDLGlCQUFpQjtRQUNsRCxJQUFJLENBQUMsVUFBVSxHQUFHLE9BQU8sQ0FBQyxVQUFVLENBQUM7SUFDdkMsQ0FBQztJQUVEOztPQUVHO0lBQ0gsR0FBRyxDQUFDLEdBQVc7UUFDYixNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUVqQyxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUM7WUFDVixJQUFJLENBQUMsU0FBUyxFQUFFLENBQUM7WUFDakIsT0FBTyxJQUFJLENBQUM7UUFDZCxDQUFDO1FBRUQsdUJB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WUFDUCxPQUFPLEVBQUUsQ0FBQyxDQUFDLGdCQUFnQjtRQUM3QixDQUFDO0lBQ0gsQ0FBQztDQUNGO0FBRUQ7O0dBRUc7QUFDSCxNQUFNLE9BQU8sWUFBWTtJQUN2Qjs7T0FFRztJQUNILE1BQU0sQ0FBQyx1QkFBdUIsQ0FBSSxPQUFrQztRQUNsRSxPQUFPLElBQUksUUFBUSxDQUFJO1lBQ3JCLE9BQU8sRUFBRSxHQUFHO1lBQ1osV0FBVyxFQUFFLEVBQUU7WUFDZixLQUFLLEVBQUUsQ0FBQyxHQUFHLEVBQUUsR0FBRyxJQUFJLEVBQUUsWUFBWTtZQUNsQyxHQUFHLE9BQU87U0FDWCxDQUFDLENBQUM7SUFDTCxDQUFDO0lBRUQ7O09BRUc7SUFDSCxNQUFNLENBQUMsZ0JBQWdCLENBQUksT0FBa0M7UUFDM0QsT0FBTyxJQUFJLFFBQVEsQ0FBSTtZQUNyQixPQUFPLEVBQUUsRUFBRTtZQUNYLFdBQVcsRUFBRSxFQUFFO1lBQ2YsS0FBSyxFQUFFLEVBQUUsR0FBRyxFQUFFLEdBQUcsSUFBSSxFQUFFLGFBQWE7WUFDcEMsR0FBRyxPQUFPO1NBQ1gsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVEOztPQUVHO0lBQ0gsTUFBTSxDQUFDLGNBQWMsQ0FBSSxPQUFrQztRQUN6RCxPQUFPLElBQUksUUFBUSxDQUFJO1lBQ3JCLE9BQU8sRUFBRSxHQUFHO1lBQ1osV0FBVyxFQUFFLENBQUM7WUFDZCxLQUFLLEVBQUUsRUFBRSxHQUFHLEVBQUUsR0FBRyxJQUFJLEVBQUUsYUFBYTtZQUNwQyxHQUFHLE9BQU87U0FDWCxDQUFDLENBQUM7SUFDTCxDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEhpZ2gtcGVyZm9ybWFuY2UgTFJVIENhY2hlIHdpdGggbWVtb3J5IG1vbml0b3JpbmcgYW5kIGF1dG9tYXRpYyBjbGVhbnVwXG4gKiBPcHRpbWl6ZWQgZm9yIGxhcmdlLXNjYWxlIGluZGV4aW5nIG9wZXJhdGlvbnMgd2l0aCBjb25maWd1cmFibGUgbWVtb3J5IGxpbWl0c1xuICovXG5cbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL3V0aWxzL2xvZ2dlci5qcyc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgTFJVQ2FjaGVPcHRpb25zIHtcbiAgbWF4U2l6ZTogbnVtYmVyO1xuICBtYXhNZW1vcnlNQj86IG51bWJlcjtcbiAgdHRsTXM/OiBudW1iZXI7XG4gIG9uRXZpY3Rpb24/OiAoa2V5OiBzdHJpbmcsIHZhbHVlOiBhbnkpID0+IHZvaWQ7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQ2FjaGVTdGF0cyB7XG4gIHNpemU6IG51bWJlcjtcbiAgbWF4U2l6ZTogbnVtYmVyO1xuICBoaXRDb3VudDogbnVtYmVyO1xuICBtaXNzQ291bnQ6IG51bWJlcjtcbiAgZXZpY3Rpb25Db3VudDogbnVtYmVyO1xuICBtZW1vcnlVc2FnZU1COiBudW1iZXI7XG4gIGhpdFJhdGU6IG51bWJlcjtcbn1cblxuaW50ZXJmYWNlIENhY2hlTm9kZTxUPiB7XG4gIGtleTogc3RyaW5nO1xuICB2YWx1ZTogVDtcbiAgcHJldjogQ2FjaGVOb2RlPFQ+IHwgbnVsbDtcbiAgbmV4dDogQ2FjaGVOb2RlPFQ+IHwgbnVsbDtcbiAgdGltZXN0YW1wOiBudW1iZXI7XG4gIHNpemU6IG51bWJlcjsgLy8gRXN0aW1hdGVkIHNpemUgaW4gYnl0ZXNcbn1cblxuZXhwb3J0IGNsYXNzIExSVUNhY2hlPFQ+IHtcbiAgcHJpdmF0ZSByZWFkb25seSBtYXhTaXplOiBudW1iZXI7XG4gIHByaXZhdGUgcmVhZG9ubHkgbWF4TWVtb3J5Qnl0ZXM6IG51bWJlcjtcbiAgcHJpdmF0ZSByZWFkb25seSB0dGxNczogbnVtYmVyO1xuICBwcml2YXRlIHJlYWRvbmx5IG9uRXZpY3Rpb24/OiAoa2V5OiBzdHJpbmcsIHZhbHVlOiBUKSA9PiB2b2lkO1xuXG4gIHByaXZhdGUgY2FjaGUgPSBuZXcgTWFwPHN0cmluZywgQ2FjaGVOb2RlPFQ+PigpO1xuICBwcml2YXRlIGhlYWQ6IENhY2hlTm9kZTxUPiB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIHRhaWw6IENhY2hlTm9kZTxUPiB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIGN1cnJlbnRNZW1vcnlCeXRlcyA9IDA7XG5cbiAgLy8gUGVyZm9ybWFuY2UgY291bnRlcnNcbiAgcHJpdmF0ZSBoaXRDb3VudCA9IDA7XG4gIHByaXZhdGUgbWlzc0NvdW50ID0gMDtcbiAgcHJpdmF0ZSBldmljdGlvbkNvdW50ID0gMDtcblxuICBjb25zdHJ1Y3RvcihvcHRpb25zOiBMUlVDYWNoZU9wdGlvbnMpIHtcbiAgICB0aGlzLm1heFNpemUgPSBvcHRpb25zLm1heFNpemU7XG4gICAgdGhpcy5tYXhNZW1vcnlCeXRlcyA9IChvcHRpb25zLm1heE1lbW9yeU1CIHx8IDUwKSAqIDEwMjQgKiAxMDI0OyAvLyBDb252ZXJ0IE1CIHRvIGJ5dGVzXG4gICAgdGhpcy50dGxNcyA9IG9wdGlvbnMudHRsTXMgfHwgMDsgLy8gMCBtZWFucyBubyBUVExcbiAgICB0aGlzLm9uRXZpY3Rpb24gPSBvcHRpb25zLm9uRXZpY3Rpb247XG4gIH1cblxuICAvKipcbiAgICogR2V0IHZhbHVlIGZyb20gY2FjaGUgd2l0aCBhdXRvbWF0aWMgY2xlYW51cFxuICAgKi9cbiAgZ2V0KGtleTogc3RyaW5nKTogVCB8IG51bGwge1xuICAgIGNvbnN0IG5vZGUgPSB0aGlzLmNhY2hlLmdldChrZXkpO1xuICAgIFxuICAgIGlmICghbm9kZSkge1xuICAgICAgdGhpcy5taXNzQ291bnQrKztcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIC8vIENoZWNrIFRUTCBpZiBlbmFibGVkXG4gICAgaWYgKHRoaXMudHRsTXMgPiAwICYmIERhdGUubm93KCkgLSBub2RlLnRpbWVzdGFtcCA+IHRoaXMudHRsTXMpIHtcbiAgICAgIHRoaXMuZGVsZXRlKGtleSk7XG4gICAgICB0aGlzLm1pc3NDb3VudCsrO1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgLy8gTW92ZSB0byBmcm9udCAobW9zdCByZWNlbnRseSB1c2VkKVxuICAgIHRoaXMubW92ZVRvRnJvbnQobm9kZSk7XG4gICAgdGhpcy5oaXRDb3VudCsrO1xuICAgIHJldHVybiBub2RlLnZhbHVlO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldCB2YWx1ZSBpbiBjYWNoZSB3aXRoIGF1dG9tYXRpYyBldmljdGlvblxuICAgKi9cbiAgc2V0KGtleTogc3RyaW5nLCB2YWx1ZTogVCk6IHZvaWQge1xuICAgIGNvbnN0IGV4aXN0aW5nTm9kZSA9IHRoaXMuY2FjaGUuZ2V0KGtleSk7XG4gICAgXG4gICAgaWYgKGV4aXN0aW5nTm9kZSkge1xuICAgICAgLy8gVXBkYXRlIGV4aXN0aW5nIG5vZGVcbiAgICAgIGNvbnN0IG9sZFNpemUgPSBleGlzdGluZ05vZGUuc2l6ZTtcbiAgICAgIGV4aXN0aW5nTm9kZS52YWx1ZSA9IHZhbHVlO1xuICAgICAgZXhpc3RpbmdOb2RlLnRpbWVzdGFtcCA9IERhdGUubm93KCk7XG4gICAgICBleGlzdGluZ05vZGUuc2l6ZSA9IHRoaXMuZXN0aW1hdGVTaXplKHZhbHVlKTtcbiAgICAgIFxuICAgICAgdGhpcy5jdXJyZW50TWVtb3J5Qnl0ZXMgKz0gZXhpc3RpbmdOb2RlLnNpemUgLSBvbGRTaXplO1xuICAgICAgdGhpcy5tb3ZlVG9Gcm9udChleGlzdGluZ05vZGUpO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBDcmVhdGUgbmV3IG5vZGVcbiAgICAgIGNvbnN0IG5ld05vZGU6IENhY2hlTm9kZTxUPiA9IHtcbiAgICAgICAga2V5LFxuICAgICAgICB2YWx1ZSxcbiAgICAgICAgcHJldjogbnVsbCxcbiAgICAgICAgbmV4dDogbnVsbCxcbiAgICAgICAgdGltZXN0YW1wOiBEYXRlLm5vdygpLFxuICAgICAgICBzaXplOiB0aGlzLmVzdGltYXRlU2l6ZSh2YWx1ZSlcbiAgICAgIH07XG5cbiAgICAgIHRoaXMuY2FjaGUuc2V0KGtleSwgbmV3Tm9kZSk7XG4gICAgICB0aGlzLmN1cnJlbnRNZW1vcnlCeXRlcyArPSBuZXdOb2RlLnNpemU7XG4gICAgICB0aGlzLmFkZFRvRnJvbnQobmV3Tm9kZSk7XG4gICAgfVxuXG4gICAgLy8gRXZpY3QgaWYgbmVjZXNzYXJ5XG4gICAgdGhpcy5ldmljdElmTmVjZXNzYXJ5KCk7XG4gIH1cblxuICAvKipcbiAgICogRGVsZXRlIHNwZWNpZmljIGtleSBmcm9tIGNhY2hlXG4gICAqL1xuICBkZWxldGUoa2V5OiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICBjb25zdCBub2RlID0gdGhpcy5jYWNoZS5nZXQoa2V5KTtcbiAgICBpZiAoIW5vZGUpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICB0aGlzLnJlbW92ZU5vZGUobm9kZSk7XG4gICAgdGhpcy5jYWNoZS5kZWxldGUoa2V5KTtcbiAgICB0aGlzLmN1cnJlbnRNZW1vcnlCeXRlcyAtPSBub2RlLnNpemU7XG5cbiAgICBpZiAodGhpcy5vbkV2aWN0aW9uKSB7XG4gICAgICB0aGlzLm9uRXZpY3Rpb24oa2V5LCBub2RlLnZhbHVlKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVjayBpZiBrZXkgZXhpc3RzIGluIGNhY2hlXG4gICAqL1xuICBoYXMoa2V5OiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICBjb25zdCBub2RlID0gdGhpcy5jYWNoZS5nZXQoa2V5KTtcbiAgICBpZiAoIW5vZGUpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICAvLyBDaGVjayBUVExcbiAgICBpZiAodGhpcy50dGxNcyA+IDAgJiYgRGF0ZS5ub3coKSAtIG5vZGUudGltZXN0YW1wID4gdGhpcy50dGxNcykge1xuICAgICAgdGhpcy5kZWxldGUoa2V5KTtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDbGVhciBhbGwgZW50cmllcyBmcm9tIGNhY2hlXG4gICAqL1xuICBjbGVhcigpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5vbkV2aWN0aW9uKSB7XG4gICAgICBmb3IgKGNvbnN0IFtrZXksIG5vZGVdIG9mIHRoaXMuY2FjaGUpIHtcbiAgICAgICAgdGhpcy5vbkV2aWN0aW9uKGtleSwgbm9kZS52YWx1ZSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgdGhpcy5jYWNoZS5jbGVhcigpO1xuICAgIHRoaXMuaGVhZCA9IG51bGw7XG4gICAgdGhpcy50YWlsID0gbnVsbDtcbiAgICB0aGlzLmN1cnJlbnRNZW1vcnlCeXRlcyA9IDA7XG4gICAgdGhpcy5ldmljdGlvbkNvdW50ICs9IHRoaXMuY2FjaGUuc2l6ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgY2FjaGUgc3RhdGlzdGljc1xuICAgKi9cbiAgZ2V0U3RhdHMoKTogQ2FjaGVTdGF0cyB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHNpemU6IHRoaXMuY2FjaGUuc2l6ZSxcbiAgICAgIG1heFNpemU6IHRoaXMubWF4U2l6ZSxcbiAgICAgIGhpdENvdW50OiB0aGlzLmhpdENvdW50LFxuICAgICAgbWlzc0NvdW50OiB0aGlzLm1pc3NDb3VudCxcbiAgICAgIGV2aWN0aW9uQ291bnQ6IHRoaXMuZXZpY3Rpb25Db3VudCxcbiAgICAgIG1lbW9yeVVzYWdlTUI6IHRoaXMuY3VycmVudE1lbW9yeUJ5dGVzIC8gKDEwMjQgKiAxMDI0KSxcbiAgICAgIGhpdFJhdGU6IHRoaXMuaGl0Q291bnQgKyB0aGlzLm1pc3NDb3VudCA+IDAgPyB0aGlzLmhpdENvdW50IC8gKHRoaXMuaGl0Q291bnQgKyB0aGlzLm1pc3NDb3VudCkgOiAwXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgYWxsIGtleXMgaW4gYWNjZXNzIG9yZGVyIChtb3N0IHJlY2VudCBmaXJzdClcbiAgICovXG4gIGtleXMoKTogc3RyaW5nW10ge1xuICAgIGNvbnN0IGtleXM6IHN0cmluZ1tdID0gW107XG4gICAgbGV0IGN1cnJlbnQgPSB0aGlzLmhlYWQ7XG4gICAgXG4gICAgd2hpbGUgKGN1cnJlbnQpIHtcbiAgICAgIGtleXMucHVzaChjdXJyZW50LmtleSk7XG4gICAgICBjdXJyZW50ID0gY3VycmVudC5uZXh0O1xuICAgIH1cbiAgICBcbiAgICByZXR1cm4ga2V5cztcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgY3VycmVudCBtZW1vcnkgdXNhZ2UgaW4gTUJcbiAgICovXG4gIGdldE1lbW9yeVVzYWdlTUIoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5jdXJyZW50TWVtb3J5Qnl0ZXMgLyAoMTAyNCAqIDEwMjQpO1xuICB9XG5cbiAgLyoqXG4gICAqIE1hbnVhbGx5IHRyaWdnZXIgY2xlYW51cCBvZiBleHBpcmVkIGVudHJpZXNcbiAgICovXG4gIGNsZWFudXAoKTogbnVtYmVyIHtcbiAgICBpZiAodGhpcy50dGxNcyA8PSAwKSB7XG4gICAgICByZXR1cm4gMDtcbiAgICB9XG5cbiAgICBjb25zdCBub3cgPSBEYXRlLm5vdygpO1xuICAgIGNvbnN0IGtleXNUb0RlbGV0ZTogc3RyaW5nW10gPSBbXTtcblxuICAgIGZvciAoY29uc3QgW2tleSwgbm9kZV0gb2YgdGhpcy5jYWNoZSkge1xuICAgICAgaWYgKG5vdyAtIG5vZGUudGltZXN0YW1wID4gdGhpcy50dGxNcykge1xuICAgICAgICBrZXlzVG9EZWxldGUucHVzaChrZXkpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGZvciAoY29uc3Qga2V5IG9mIGtleXNUb0RlbGV0ZSkge1xuICAgICAgdGhpcy5kZWxldGUoa2V5KTtcbiAgICB9XG5cbiAgICByZXR1cm4ga2V5c1RvRGVsZXRlLmxlbmd0aDtcbiAgfVxuXG4gIC8vIFByaXZhdGUgbWV0aG9kc1xuXG4gIHByaXZhdGUgbW92ZVRvRnJvbnQobm9kZTogQ2FjaGVOb2RlPFQ+KTogdm9pZCB7XG4gICAgaWYgKG5vZGUgPT09IHRoaXMuaGVhZCkge1xuICAgICAgcmV0dXJuOyAvLyBBbHJlYWR5IGF0IGZyb250XG4gICAgfVxuXG4gICAgLy8gUmVtb3ZlIGZyb20gY3VycmVudCBwb3NpdGlvblxuICAgIHRoaXMucmVtb3ZlTm9kZShub2RlKTtcbiAgICBcbiAgICAvLyBBZGQgdG8gZnJvbnRcbiAgICB0aGlzLmFkZFRvRnJvbnQobm9kZSk7XG4gIH1cblxuICBwcml2YXRlIGFkZFRvRnJvbnQobm9kZTogQ2FjaGVOb2RlPFQ+KTogdm9pZCB7XG4gICAgbm9kZS5wcmV2ID0gbnVsbDtcbiAgICBub2RlLm5leHQgPSB0aGlzLmhlYWQ7XG5cbiAgICBpZiAodGhpcy5oZWFkKSB7XG4gICAgICB0aGlzLmhlYWQucHJldiA9IG5vZGU7XG4gICAgfVxuICAgIFxuICAgIHRoaXMuaGVhZCA9IG5vZGU7XG5cbiAgICBpZiAoIXRoaXMudGFpbCkge1xuICAgICAgdGhpcy50YWlsID0gbm9kZTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHJlbW92ZU5vZGUobm9kZTogQ2FjaGVOb2RlPFQ+KTogdm9pZCB7XG4gICAgaWYgKG5vZGUucHJldikge1xuICAgICAgbm9kZS5wcmV2Lm5leHQgPSBub2RlLm5leHQ7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuaGVhZCA9IG5vZGUubmV4dDtcbiAgICB9XG5cbiAgICBpZiAobm9kZS5uZXh0KSB7XG4gICAgICBub2RlLm5leHQucHJldiA9IG5vZGUucHJldjtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy50YWlsID0gbm9kZS5wcmV2O1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgZXZpY3RJZk5lY2Vzc2FyeSgpOiB2b2lkIHtcbiAgICAvLyBFdmljdCBieSBzaXplXG4gICAgd2hpbGUgKHRoaXMuY2FjaGUuc2l6ZSA+IHRoaXMubWF4U2l6ZSkge1xuICAgICAgdGhpcy5ldmljdExlYXN0UmVjZW50bHlVc2VkKCk7XG4gICAgfVxuXG4gICAgLy8gRXZpY3QgYnkgbWVtb3J5XG4gICAgd2hpbGUgKHRoaXMuY3VycmVudE1lbW9yeUJ5dGVzID4gdGhpcy5tYXhNZW1vcnlCeXRlcyAmJiB0aGlzLnRhaWwpIHtcbiAgICAgIHRoaXMuZXZpY3RMZWFzdFJlY2VudGx5VXNlZCgpO1xuICAgIH1cblxuICAgIC8vIENsZWFudXAgZXhwaXJlZCBlbnRyaWVzIGlmIFRUTCBpcyBlbmFibGVkXG4gICAgaWYgKHRoaXMudHRsTXMgPiAwICYmIE1hdGgucmFuZG9tKCkgPCAwLjEpIHsgLy8gMTAlIGNoYW5jZSB0byB0cmlnZ2VyIGNsZWFudXBcbiAgICAgIHRoaXMuY2xlYW51cCgpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgZXZpY3RMZWFzdFJlY2VudGx5VXNlZCgpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMudGFpbCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IGV2aWN0ZWQgPSB0aGlzLnRhaWw7XG4gICAgdGhpcy5yZW1vdmVOb2RlKGV2aWN0ZWQpO1xuICAgIHRoaXMuY2FjaGUuZGVsZXRlKGV2aWN0ZWQua2V5KTtcbiAgICB0aGlzLmN1cnJlbnRNZW1vcnlCeXRlcyAtPSBldmljdGVkLnNpemU7XG4gICAgdGhpcy5ldmljdGlvbkNvdW50Kys7XG5cbiAgICBpZiAodGhpcy5vbkV2aWN0aW9uKSB7XG4gICAgICB0aGlzLm9uRXZpY3Rpb24oZXZpY3RlZC5rZXksIGV2aWN0ZWQudmFsdWUpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgZXN0aW1hdGVTaXplKHZhbHVlOiBUKTogbnVtYmVyIHtcbiAgICB0cnkge1xuICAgICAgLy8gU2ltcGxlIGVzdGltYXRpb24gLSBjYW4gYmUgaW1wcm92ZWQgd2l0aCBtb3JlIHNvcGhpc3RpY2F0ZWQgc2l6aW5nXG4gICAgICBpZiAodmFsdWUgPT09IG51bGwgfHwgdmFsdWUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICByZXR1cm4gODsgLy8gQmFzaWMgcG9pbnRlciBzaXplXG4gICAgICB9XG5cbiAgICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgIHJldHVybiB2YWx1ZS5sZW5ndGggKiAyOyAvLyBVVEYtMTYgY2hhcmFjdGVyc1xuICAgICAgfVxuXG4gICAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnbnVtYmVyJyB8fCB0eXBlb2YgdmFsdWUgPT09ICdib29sZWFuJykge1xuICAgICAgICByZXR1cm4gODtcbiAgICAgIH1cblxuICAgICAgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpKSB7XG4gICAgICAgIHJldHVybiB2YWx1ZS5yZWR1Y2UoKGFjYywgaXRlbSkgPT4gYWNjICsgdGhpcy5lc3RpbWF0ZVNpemUoaXRlbSksIDMyKTsgLy8gQXJyYXkgb3ZlcmhlYWRcbiAgICAgIH1cblxuICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcpIHtcbiAgICAgICAgLy8gUm91Z2ggZXN0aW1hdGlvbiBmb3Igb2JqZWN0c1xuICAgICAgICBjb25zdCBqc29uU3RyID0gSlNPTi5zdHJpbmdpZnkodmFsdWUpO1xuICAgICAgICByZXR1cm4ganNvblN0ci5sZW5ndGggKiAyICsgNjQ7IC8vIFN0cmluZyBzaXplICsgb2JqZWN0IG92ZXJoZWFkXG4gICAgICB9XG5cbiAgICAgIHJldHVybiA2NDsgLy8gRGVmYXVsdCBzaXplIGZvciB1bmtub3duIHR5cGVzXG4gICAgfSBjYXRjaCB7XG4gICAgICByZXR1cm4gNjQ7IC8vIEZhbGxiYWNrIHNpemVcbiAgICB9XG4gIH1cbn1cblxuLyoqXG4gKiBGYWN0b3J5IGZvciBjcmVhdGluZyBvcHRpbWl6ZWQgTFJVIGNhY2hlcyBmb3IgZGlmZmVyZW50IHVzZSBjYXNlc1xuICovXG5leHBvcnQgY2xhc3MgQ2FjaGVGYWN0b3J5IHtcbiAgLyoqXG4gICAqIENyZWF0ZSBjYWNoZSBvcHRpbWl6ZWQgZm9yIHNlYXJjaCByZXN1bHRzXG4gICAqL1xuICBzdGF0aWMgY3JlYXRlU2VhcmNoUmVzdWx0Q2FjaGU8VD4ob3B0aW9ucz86IFBhcnRpYWw8TFJVQ2FjaGVPcHRpb25zPik6IExSVUNhY2hlPFQ+IHtcbiAgICByZXR1cm4gbmV3IExSVUNhY2hlPFQ+KHtcbiAgICAgIG1heFNpemU6IDEwMCxcbiAgICAgIG1heE1lbW9yeU1COiAxMCxcbiAgICAgIHR0bE1zOiA1ICogNjAgKiAxMDAwLCAvLyA1IG1pbnV0ZXNcbiAgICAgIC4uLm9wdGlvbnNcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGUgY2FjaGUgb3B0aW1pemVkIGZvciBpbmRleCBkYXRhXG4gICAqL1xuICBzdGF0aWMgY3JlYXRlSW5kZXhDYWNoZTxUPihvcHRpb25zPzogUGFydGlhbDxMUlVDYWNoZU9wdGlvbnM+KTogTFJVQ2FjaGU8VD4ge1xuICAgIHJldHVybiBuZXcgTFJVQ2FjaGU8VD4oe1xuICAgICAgbWF4U2l6ZTogNTAsXG4gICAgICBtYXhNZW1vcnlNQjogMjUsXG4gICAgICB0dGxNczogMTUgKiA2MCAqIDEwMDAsIC8vIDE1IG1pbnV0ZXNcbiAgICAgIC4uLm9wdGlvbnNcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGUgY2FjaGUgb3B0aW1pemVkIGZvciBBUEkgcmVzcG9uc2VzXG4gICAqL1xuICBzdGF0aWMgY3JlYXRlQVBJQ2FjaGU8VD4ob3B0aW9ucz86IFBhcnRpYWw8TFJVQ2FjaGVPcHRpb25zPik6IExSVUNhY2hlPFQ+IHtcbiAgICByZXR1cm4gbmV3IExSVUNhY2hlPFQ+KHtcbiAgICAgIG1heFNpemU6IDIwMCxcbiAgICAgIG1heE1lbW9yeU1COiA1LFxuICAgICAgdHRsTXM6IDEwICogNjAgKiAxMDAwLCAvLyAxMCBtaW51dGVzXG4gICAgICAuLi5vcHRpb25zXG4gICAgfSk7XG4gIH1cbn0iXX0=
|
package/dist/cache/index.d.ts
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/cache/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,cAAc,eAAe,CAAC;AAC9B,cAAc,sBAAsB,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/cache/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,cAAc,eAAe,CAAC;AAC9B,cAAc,sBAAsB,CAAC;AACrC,cAAc,2BAA2B,CAAC"}
|
package/dist/cache/index.js
CHANGED
|
@@ -3,4 +3,5 @@
|
|
|
3
3
|
*/
|
|
4
4
|
export * from './APICache.js';
|
|
5
5
|
export * from './CollectionCache.js';
|
|
6
|
-
|
|
6
|
+
export * from './CollectionIndexCache.js';
|
|
7
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvY2FjaGUvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7O0dBRUc7QUFFSCxjQUFjLGVBQWUsQ0FBQztBQUM5QixjQUFjLHNCQUFzQixDQUFDO0FBQ3JDLGNBQWMsMkJBQTJCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIENhY2hlIG1vZHVsZSBleHBvcnRzXG4gKi9cblxuZXhwb3J0ICogZnJvbSAnLi9BUElDYWNoZS5qcyc7XG5leHBvcnQgKiBmcm9tICcuL0NvbGxlY3Rpb25DYWNoZS5qcyc7XG5leHBvcnQgKiBmcm9tICcuL0NvbGxlY3Rpb25JbmRleENhY2hlLmpzJzsiXX0=
|
|
@@ -3,13 +3,16 @@
|
|
|
3
3
|
*/
|
|
4
4
|
import { GitHubClient } from './GitHubClient.js';
|
|
5
5
|
import { CollectionCache } from '../cache/CollectionCache.js';
|
|
6
|
+
import { CollectionIndexManager } from './CollectionIndexManager.js';
|
|
6
7
|
export declare class CollectionBrowser {
|
|
7
8
|
private githubClient;
|
|
8
9
|
private collectionCache;
|
|
10
|
+
private indexManager;
|
|
9
11
|
private baseUrl;
|
|
10
|
-
constructor(githubClient: GitHubClient, collectionCache?: CollectionCache);
|
|
12
|
+
constructor(githubClient: GitHubClient, collectionCache?: CollectionCache, indexManager?: CollectionIndexManager);
|
|
11
13
|
/**
|
|
12
14
|
* Browse collection content by section and type
|
|
15
|
+
* Uses CollectionIndexManager for fast browsing with background refresh
|
|
13
16
|
* Falls back to cached data when GitHub API is not available or not authenticated
|
|
14
17
|
* @param section - Top level section: library, showcase, or catalog
|
|
15
18
|
* @param type - Optional content type within the library section (personas, skills, etc.)
|
|
@@ -19,6 +22,23 @@ export declare class CollectionBrowser {
|
|
|
19
22
|
categories: any[];
|
|
20
23
|
sections?: any[];
|
|
21
24
|
}>;
|
|
25
|
+
/**
|
|
26
|
+
* Browse collection using the fast collection index
|
|
27
|
+
* Returns null if index is not available or browsing fails
|
|
28
|
+
*/
|
|
29
|
+
private browseFromIndex;
|
|
30
|
+
/**
|
|
31
|
+
* Get unique content types from collection index
|
|
32
|
+
*/
|
|
33
|
+
private getContentTypesFromIndex;
|
|
34
|
+
/**
|
|
35
|
+
* Get items from collection index by section and type
|
|
36
|
+
*/
|
|
37
|
+
private getItemsFromIndex;
|
|
38
|
+
/**
|
|
39
|
+
* Convert index entries to GitHub API format for compatibility
|
|
40
|
+
*/
|
|
41
|
+
private convertIndexItemsToGitHubFormat;
|
|
22
42
|
/**
|
|
23
43
|
* Browse collection from cached data
|
|
24
44
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"CollectionBrowser.d.ts","sourceRoot":"","sources":["../../src/collection/CollectionBrowser.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACjD,OAAO,EAAE,eAAe,EAAkB,MAAM,6BAA6B,CAAC;
|
|
1
|
+
{"version":3,"file":"CollectionBrowser.d.ts","sourceRoot":"","sources":["../../src/collection/CollectionBrowser.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACjD,OAAO,EAAE,eAAe,EAAkB,MAAM,6BAA6B,CAAC;AAE9E,OAAO,EAAE,sBAAsB,EAAE,MAAM,6BAA6B,CAAC;AA+BrE,qBAAa,iBAAiB;IAC5B,OAAO,CAAC,YAAY,CAAe;IACnC,OAAO,CAAC,eAAe,CAAkB;IACzC,OAAO,CAAC,YAAY,CAAyB;IAC7C,OAAO,CAAC,OAAO,CAAmE;gBAEtE,YAAY,EAAE,YAAY,EAAE,eAAe,CAAC,EAAE,eAAe,EAAE,YAAY,CAAC,EAAE,sBAAsB;IAMhH;;;;;;OAMG;IACG,gBAAgB,CAAC,OAAO,CAAC,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC;QAAE,KAAK,EAAE,GAAG,EAAE,CAAC;QAAC,UAAU,EAAE,GAAG,EAAE,CAAC;QAAC,QAAQ,CAAC,EAAE,GAAG,EAAE,CAAA;KAAE,CAAC;IA+DvH;;;OAGG;YACW,eAAe;IAiC7B;;OAEG;IACH,OAAO,CAAC,wBAAwB;IAiBhC;;OAEG;IACH,OAAO,CAAC,iBAAiB;IAiBzB;;OAEG;IACH,OAAO,CAAC,+BAA+B;IAWvC;;OAEG;YACW,eAAe;IAwC7B;;OAEG;IACH,OAAO,CAAC,kBAAkB;IAmB1B;;OAEG;IACH,OAAO,CAAC,wBAAwB;IAqBhC;;OAEG;IACH,OAAO,CAAC,oBAAoB;IAgB5B;;OAEG;IACH,OAAO,CAAC,+BAA+B;IAWvC;;OAEG;IACH,mBAAmB,CAAC,KAAK,EAAE,GAAG,EAAE,EAAE,UAAU,EAAE,GAAG,EAAE,EAAE,OAAO,CAAC,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,EAAE,gBAAgB,GAAE,MAAW,GAAG,MAAM;CA6E7H"}
|