@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,41 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Type definitions for portfolio tools
|
|
3
|
+
* This file provides shared types to avoid circular dependencies
|
|
4
|
+
*
|
|
5
|
+
* SECURITY NOTE: This file contains only TypeScript type definitions.
|
|
6
|
+
* No actual user input processing occurs here. Any security scanner
|
|
7
|
+
* warnings about Unicode normalization are false positives as these
|
|
8
|
+
* are compile-time type definitions, not runtime code.
|
|
9
|
+
*
|
|
10
|
+
* FIXES IMPLEMENTED (PR #503):
|
|
11
|
+
* 1. TYPE SAFETY: Created shared type definitions to resolve circular dependencies
|
|
12
|
+
* 2. FALSE POSITIVE: Added documentation to clarify no user input processing
|
|
13
|
+
*/
|
|
14
|
+
import { ElementType } from '../../portfolio/types.js';
|
|
15
|
+
import { IElementMetadata } from '../../types/elements/IElement.js';
|
|
16
|
+
/**
|
|
17
|
+
* Simple portfolio element for submission
|
|
18
|
+
* This is a simplified version that doesn't require full IElement implementation
|
|
19
|
+
*/
|
|
20
|
+
export interface SimplePortfolioElement {
|
|
21
|
+
type: ElementType;
|
|
22
|
+
metadata: Partial<IElementMetadata>;
|
|
23
|
+
content: string;
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* Parameters for submitting content to portfolio
|
|
27
|
+
*/
|
|
28
|
+
export interface SubmitToPortfolioParams {
|
|
29
|
+
name: string;
|
|
30
|
+
type?: ElementType;
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Result from portfolio submission
|
|
34
|
+
*/
|
|
35
|
+
export interface SubmitToPortfolioResult {
|
|
36
|
+
success: boolean;
|
|
37
|
+
message: string;
|
|
38
|
+
url?: string;
|
|
39
|
+
error?: string;
|
|
40
|
+
}
|
|
41
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/tools/portfolio/types.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;AACvD,OAAO,EAAE,gBAAgB,EAAE,MAAM,kCAAkC,CAAC;AAEpE;;;GAGG;AACH,MAAM,WAAW,sBAAsB;IACrC,IAAI,EAAE,WAAW,CAAC;IAClB,QAAQ,EAAE,OAAO,CAAC,gBAAgB,CAAC,CAAC;IACpC,OAAO,EAAE,MAAM,CAAC;CACjB;AAED;;GAEG;AACH,MAAM,WAAW,uBAAuB;IACtC,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,WAAW,CAAC;CACpB;AAED;;GAEG;AACH,MAAM,WAAW,uBAAuB;IACtC,OAAO,EAAE,OAAO,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Type definitions for portfolio tools
|
|
3
|
+
* This file provides shared types to avoid circular dependencies
|
|
4
|
+
*
|
|
5
|
+
* SECURITY NOTE: This file contains only TypeScript type definitions.
|
|
6
|
+
* No actual user input processing occurs here. Any security scanner
|
|
7
|
+
* warnings about Unicode normalization are false positives as these
|
|
8
|
+
* are compile-time type definitions, not runtime code.
|
|
9
|
+
*
|
|
10
|
+
* FIXES IMPLEMENTED (PR #503):
|
|
11
|
+
* 1. TYPE SAFETY: Created shared type definitions to resolve circular dependencies
|
|
12
|
+
* 2. FALSE POSITIVE: Added documentation to clarify no user input processing
|
|
13
|
+
*/
|
|
14
|
+
export {};
|
|
15
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHlwZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvdG9vbHMvcG9ydGZvbGlvL3R5cGVzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7R0FZRyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogVHlwZSBkZWZpbml0aW9ucyBmb3IgcG9ydGZvbGlvIHRvb2xzXG4gKiBUaGlzIGZpbGUgcHJvdmlkZXMgc2hhcmVkIHR5cGVzIHRvIGF2b2lkIGNpcmN1bGFyIGRlcGVuZGVuY2llc1xuICogXG4gKiBTRUNVUklUWSBOT1RFOiBUaGlzIGZpbGUgY29udGFpbnMgb25seSBUeXBlU2NyaXB0IHR5cGUgZGVmaW5pdGlvbnMuXG4gKiBObyBhY3R1YWwgdXNlciBpbnB1dCBwcm9jZXNzaW5nIG9jY3VycyBoZXJlLiBBbnkgc2VjdXJpdHkgc2Nhbm5lclxuICogd2FybmluZ3MgYWJvdXQgVW5pY29kZSBub3JtYWxpemF0aW9uIGFyZSBmYWxzZSBwb3NpdGl2ZXMgYXMgdGhlc2VcbiAqIGFyZSBjb21waWxlLXRpbWUgdHlwZSBkZWZpbml0aW9ucywgbm90IHJ1bnRpbWUgY29kZS5cbiAqIFxuICogRklYRVMgSU1QTEVNRU5URUQgKFBSICM1MDMpOlxuICogMS4gVFlQRSBTQUZFVFk6IENyZWF0ZWQgc2hhcmVkIHR5cGUgZGVmaW5pdGlvbnMgdG8gcmVzb2x2ZSBjaXJjdWxhciBkZXBlbmRlbmNpZXNcbiAqIDIuIEZBTFNFIFBPU0lUSVZFOiBBZGRlZCBkb2N1bWVudGF0aW9uIHRvIGNsYXJpZnkgbm8gdXNlciBpbnB1dCBwcm9jZXNzaW5nXG4gKi9cblxuaW1wb3J0IHsgRWxlbWVudFR5cGUgfSBmcm9tICcuLi8uLi9wb3J0Zm9saW8vdHlwZXMuanMnO1xuaW1wb3J0IHsgSUVsZW1lbnRNZXRhZGF0YSB9IGZyb20gJy4uLy4uL3R5cGVzL2VsZW1lbnRzL0lFbGVtZW50LmpzJztcblxuLyoqXG4gKiBTaW1wbGUgcG9ydGZvbGlvIGVsZW1lbnQgZm9yIHN1Ym1pc3Npb25cbiAqIFRoaXMgaXMgYSBzaW1wbGlmaWVkIHZlcnNpb24gdGhhdCBkb2Vzbid0IHJlcXVpcmUgZnVsbCBJRWxlbWVudCBpbXBsZW1lbnRhdGlvblxuICovXG5leHBvcnQgaW50ZXJmYWNlIFNpbXBsZVBvcnRmb2xpb0VsZW1lbnQge1xuICB0eXBlOiBFbGVtZW50VHlwZTtcbiAgbWV0YWRhdGE6IFBhcnRpYWw8SUVsZW1lbnRNZXRhZGF0YT47XG4gIGNvbnRlbnQ6IHN0cmluZztcbn1cblxuLyoqXG4gKiBQYXJhbWV0ZXJzIGZvciBzdWJtaXR0aW5nIGNvbnRlbnQgdG8gcG9ydGZvbGlvXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU3VibWl0VG9Qb3J0Zm9saW9QYXJhbXMge1xuICBuYW1lOiBzdHJpbmc7XG4gIHR5cGU/OiBFbGVtZW50VHlwZTtcbn1cblxuLyoqXG4gKiBSZXN1bHQgZnJvbSBwb3J0Zm9saW8gc3VibWlzc2lvblxuICovXG5leHBvcnQgaW50ZXJmYWNlIFN1Ym1pdFRvUG9ydGZvbGlvUmVzdWx0IHtcbiAgc3VjY2VzczogYm9vbGVhbjtcbiAgbWVzc2FnZTogc3RyaW5nO1xuICB1cmw/OiBzdHJpbmc7XG4gIGVycm9yPzogc3RyaW5nO1xufSJdfQ==
|
|
@@ -20,4 +20,55 @@ export interface CollectionSearchResult {
|
|
|
20
20
|
property: string;
|
|
21
21
|
}>;
|
|
22
22
|
}
|
|
23
|
+
export interface IndexEntry {
|
|
24
|
+
path: string;
|
|
25
|
+
type: string;
|
|
26
|
+
name: string;
|
|
27
|
+
description: string;
|
|
28
|
+
version: string;
|
|
29
|
+
author: string;
|
|
30
|
+
tags: string[];
|
|
31
|
+
sha: string;
|
|
32
|
+
category?: string;
|
|
33
|
+
created: string;
|
|
34
|
+
license?: string;
|
|
35
|
+
}
|
|
36
|
+
export interface CollectionIndex {
|
|
37
|
+
version: string;
|
|
38
|
+
generated: string;
|
|
39
|
+
total_elements: number;
|
|
40
|
+
index: {
|
|
41
|
+
[elementType: string]: IndexEntry[];
|
|
42
|
+
};
|
|
43
|
+
metadata: {
|
|
44
|
+
build_time_ms: number;
|
|
45
|
+
file_count: number;
|
|
46
|
+
skipped_files: number;
|
|
47
|
+
categories: number;
|
|
48
|
+
nodejs_version: string;
|
|
49
|
+
builder_version: string;
|
|
50
|
+
};
|
|
51
|
+
}
|
|
52
|
+
export interface CachedIndex {
|
|
53
|
+
data: CollectionIndex;
|
|
54
|
+
fetchedAt: Date;
|
|
55
|
+
etag?: string;
|
|
56
|
+
lastModified?: string;
|
|
57
|
+
}
|
|
58
|
+
export interface SearchResults {
|
|
59
|
+
items: IndexEntry[];
|
|
60
|
+
total: number;
|
|
61
|
+
page: number;
|
|
62
|
+
pageSize: number;
|
|
63
|
+
hasMore: boolean;
|
|
64
|
+
query: string;
|
|
65
|
+
searchTime: number;
|
|
66
|
+
}
|
|
67
|
+
export interface SearchOptions {
|
|
68
|
+
page?: number;
|
|
69
|
+
pageSize?: number;
|
|
70
|
+
elementType?: string;
|
|
71
|
+
sortBy?: 'relevance' | 'name' | 'date';
|
|
72
|
+
category?: string;
|
|
73
|
+
}
|
|
23
74
|
//# sourceMappingURL=collection.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"collection.d.ts","sourceRoot":"","sources":["../../src/types/collection.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,MAAM,WAAW,iBAAiB;IAChC,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,MAAM,CAAC;IACb,YAAY,EAAE,MAAM,CAAC;IACrB,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,sBAAsB;IACrC,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE;QACV,SAAS,EAAE,MAAM,CAAC;KACnB,CAAC;IACF,YAAY,CAAC,EAAE,KAAK,CAAC;QACnB,QAAQ,EAAE,MAAM,CAAC;QACjB,QAAQ,EAAE,MAAM,CAAC;KAClB,CAAC,CAAC;CACJ"}
|
|
1
|
+
{"version":3,"file":"collection.d.ts","sourceRoot":"","sources":["../../src/types/collection.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,MAAM,WAAW,iBAAiB;IAChC,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,MAAM,CAAC;IACb,YAAY,EAAE,MAAM,CAAC;IACrB,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,sBAAsB;IACrC,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE;QACV,SAAS,EAAE,MAAM,CAAC;KACnB,CAAC;IACF,YAAY,CAAC,EAAE,KAAK,CAAC;QACnB,QAAQ,EAAE,MAAM,CAAC;QACjB,QAAQ,EAAE,MAAM,CAAC;KAClB,CAAC,CAAC;CACJ;AAGD,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,GAAG,EAAE,MAAM,CAAC;IACZ,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,eAAe;IAC9B,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,cAAc,EAAE,MAAM,CAAC;IACvB,KAAK,EAAE;QACL,CAAC,WAAW,EAAE,MAAM,GAAG,UAAU,EAAE,CAAC;KACrC,CAAC;IACF,QAAQ,EAAE;QACR,aAAa,EAAE,MAAM,CAAC;QACtB,UAAU,EAAE,MAAM,CAAC;QACnB,aAAa,EAAE,MAAM,CAAC;QACtB,UAAU,EAAE,MAAM,CAAC;QACnB,cAAc,EAAE,MAAM,CAAC;QACvB,eAAe,EAAE,MAAM,CAAC;KACzB,CAAC;CACH;AAED,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,eAAe,CAAC;IACtB,SAAS,EAAE,IAAI,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,WAAW,aAAa;IAC5B,KAAK,EAAE,UAAU,EAAE,CAAC;IACpB,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,OAAO,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,aAAa;IAC5B,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,MAAM,CAAC,EAAE,WAAW,GAAG,MAAM,GAAG,MAAM,CAAC;IACvC,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB"}
|
package/dist/types/collection.js
CHANGED
|
@@ -2,4 +2,4 @@
|
|
|
2
2
|
* Type definitions for collection functionality
|
|
3
3
|
*/
|
|
4
4
|
export {};
|
|
5
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
5
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29sbGVjdGlvbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy90eXBlcy9jb2xsZWN0aW9uLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOztHQUVHIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBUeXBlIGRlZmluaXRpb25zIGZvciBjb2xsZWN0aW9uIGZ1bmN0aW9uYWxpdHlcbiAqL1xuXG5leHBvcnQgaW50ZXJmYWNlIENvbGxlY3Rpb25Db250ZW50IHtcbiAgbmFtZTogc3RyaW5nO1xuICBwYXRoOiBzdHJpbmc7XG4gIHNoYTogc3RyaW5nO1xuICBzaXplOiBudW1iZXI7XG4gIGRvd25sb2FkX3VybDogc3RyaW5nO1xuICBodG1sX3VybDogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIENvbGxlY3Rpb25TZWFyY2hSZXN1bHQge1xuICBwYXRoOiBzdHJpbmc7XG4gIGh0bWxfdXJsOiBzdHJpbmc7XG4gIHJlcG9zaXRvcnk6IHtcbiAgICBmdWxsX25hbWU6IHN0cmluZztcbiAgfTtcbiAgdGV4dF9tYXRjaGVzPzogQXJyYXk8e1xuICAgIGZyYWdtZW50OiBzdHJpbmc7XG4gICAgcHJvcGVydHk6IHN0cmluZztcbiAgfT47XG59XG5cbi8vIENvbGxlY3Rpb24gSW5kZXggVHlwZXNcbmV4cG9ydCBpbnRlcmZhY2UgSW5kZXhFbnRyeSB7XG4gIHBhdGg6IHN0cmluZztcbiAgdHlwZTogc3RyaW5nO1xuICBuYW1lOiBzdHJpbmc7XG4gIGRlc2NyaXB0aW9uOiBzdHJpbmc7XG4gIHZlcnNpb246IHN0cmluZztcbiAgYXV0aG9yOiBzdHJpbmc7XG4gIHRhZ3M6IHN0cmluZ1tdO1xuICBzaGE6IHN0cmluZztcbiAgY2F0ZWdvcnk/OiBzdHJpbmc7XG4gIGNyZWF0ZWQ6IHN0cmluZztcbiAgbGljZW5zZT86IHN0cmluZztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBDb2xsZWN0aW9uSW5kZXgge1xuICB2ZXJzaW9uOiBzdHJpbmc7XG4gIGdlbmVyYXRlZDogc3RyaW5nO1xuICB0b3RhbF9lbGVtZW50czogbnVtYmVyO1xuICBpbmRleDoge1xuICAgIFtlbGVtZW50VHlwZTogc3RyaW5nXTogSW5kZXhFbnRyeVtdO1xuICB9O1xuICBtZXRhZGF0YToge1xuICAgIGJ1aWxkX3RpbWVfbXM6IG51bWJlcjtcbiAgICBmaWxlX2NvdW50OiBudW1iZXI7XG4gICAgc2tpcHBlZF9maWxlczogbnVtYmVyO1xuICAgIGNhdGVnb3JpZXM6IG51bWJlcjtcbiAgICBub2RlanNfdmVyc2lvbjogc3RyaW5nO1xuICAgIGJ1aWxkZXJfdmVyc2lvbjogc3RyaW5nO1xuICB9O1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIENhY2hlZEluZGV4IHtcbiAgZGF0YTogQ29sbGVjdGlvbkluZGV4O1xuICBmZXRjaGVkQXQ6IERhdGU7XG4gIGV0YWc/OiBzdHJpbmc7XG4gIGxhc3RNb2RpZmllZD86IHN0cmluZztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBTZWFyY2hSZXN1bHRzIHtcbiAgaXRlbXM6IEluZGV4RW50cnlbXTtcbiAgdG90YWw6IG51bWJlcjtcbiAgcGFnZTogbnVtYmVyO1xuICBwYWdlU2l6ZTogbnVtYmVyO1xuICBoYXNNb3JlOiBib29sZWFuO1xuICBxdWVyeTogc3RyaW5nO1xuICBzZWFyY2hUaW1lOiBudW1iZXI7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgU2VhcmNoT3B0aW9ucyB7XG4gIHBhZ2U/OiBudW1iZXI7XG4gIHBhZ2VTaXplPzogbnVtYmVyO1xuICBlbGVtZW50VHlwZT86IHN0cmluZztcbiAgc29ydEJ5PzogJ3JlbGV2YW5jZScgfCAnbmFtZScgfCAnZGF0ZSc7XG4gIGNhdGVnb3J5Pzogc3RyaW5nO1xufSJdfQ==
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* EarlyTerminationSearch - Utility for parallel searches with early termination
|
|
3
|
+
*
|
|
4
|
+
* Optimizes search operations by terminating when exact matches are found,
|
|
5
|
+
* while still providing comprehensive results for diagnostics.
|
|
6
|
+
*/
|
|
7
|
+
export interface SearchResult<T> {
|
|
8
|
+
success: boolean;
|
|
9
|
+
result: T | null;
|
|
10
|
+
error?: string;
|
|
11
|
+
}
|
|
12
|
+
export interface EarlyTerminationResult<T> {
|
|
13
|
+
matches: T[];
|
|
14
|
+
exactMatch?: T;
|
|
15
|
+
totalSearches: number;
|
|
16
|
+
completedSearches: number;
|
|
17
|
+
failures: Array<{
|
|
18
|
+
index: number;
|
|
19
|
+
error: string;
|
|
20
|
+
}>;
|
|
21
|
+
earlyTerminationTriggered: boolean;
|
|
22
|
+
performanceGain?: string;
|
|
23
|
+
}
|
|
24
|
+
export declare class EarlyTerminationSearch {
|
|
25
|
+
/**
|
|
26
|
+
* Perform parallel searches with early termination when exact match found
|
|
27
|
+
* @param searches Array of search functions to execute
|
|
28
|
+
* @param isExactMatch Function to determine if a result is an exact match
|
|
29
|
+
* @param options Configuration options
|
|
30
|
+
*/
|
|
31
|
+
static executeWithEarlyTermination<T>(searches: Array<() => Promise<T | null>>, isExactMatch: (result: T) => boolean, options?: {
|
|
32
|
+
operationName: string;
|
|
33
|
+
timeoutAfterExactMatch?: number;
|
|
34
|
+
maxParallelSearches?: number;
|
|
35
|
+
}): Promise<EarlyTerminationResult<T>>;
|
|
36
|
+
/**
|
|
37
|
+
* Process batch results and update the main results object
|
|
38
|
+
*/
|
|
39
|
+
private static processBatchResults;
|
|
40
|
+
}
|
|
41
|
+
//# sourceMappingURL=EarlyTerminationSearch.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"EarlyTerminationSearch.d.ts","sourceRoot":"","sources":["../../src/utils/EarlyTerminationSearch.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAIH,MAAM,WAAW,YAAY,CAAC,CAAC;IAC7B,OAAO,EAAE,OAAO,CAAC;IACjB,MAAM,EAAE,CAAC,GAAG,IAAI,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,sBAAsB,CAAC,CAAC;IACvC,OAAO,EAAE,CAAC,EAAE,CAAC;IACb,UAAU,CAAC,EAAE,CAAC,CAAC;IACf,aAAa,EAAE,MAAM,CAAC;IACtB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,QAAQ,EAAE,KAAK,CAAC;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAClD,yBAAyB,EAAE,OAAO,CAAC;IACnC,eAAe,CAAC,EAAE,MAAM,CAAC;CAC1B;AAED,qBAAa,sBAAsB;IACjC;;;;;OAKG;WACU,2BAA2B,CAAC,CAAC,EACxC,QAAQ,EAAE,KAAK,CAAC,MAAM,OAAO,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,EACxC,YAAY,EAAE,CAAC,MAAM,EAAE,CAAC,KAAK,OAAO,EACpC,OAAO,GAAE;QACP,aAAa,EAAE,MAAM,CAAC;QACtB,sBAAsB,CAAC,EAAE,MAAM,CAAC;QAChC,mBAAmB,CAAC,EAAE,MAAM,CAAC;KACA,GAC9B,OAAO,CAAC,sBAAsB,CAAC,CAAC,CAAC,CAAC;IA8IrC;;OAEG;IACH,OAAO,CAAC,MAAM,CAAC,mBAAmB;CAwBnC"}
|
|
@@ -0,0 +1,164 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* EarlyTerminationSearch - Utility for parallel searches with early termination
|
|
3
|
+
*
|
|
4
|
+
* Optimizes search operations by terminating when exact matches are found,
|
|
5
|
+
* while still providing comprehensive results for diagnostics.
|
|
6
|
+
*/
|
|
7
|
+
import { logger } from './logger.js';
|
|
8
|
+
export class EarlyTerminationSearch {
|
|
9
|
+
/**
|
|
10
|
+
* Perform parallel searches with early termination when exact match found
|
|
11
|
+
* @param searches Array of search functions to execute
|
|
12
|
+
* @param isExactMatch Function to determine if a result is an exact match
|
|
13
|
+
* @param options Configuration options
|
|
14
|
+
*/
|
|
15
|
+
static async executeWithEarlyTermination(searches, isExactMatch, options = { operationName: 'search' }) {
|
|
16
|
+
const { operationName, timeoutAfterExactMatch = 1000, maxParallelSearches = 10 } = options;
|
|
17
|
+
const startTime = Date.now();
|
|
18
|
+
const results = {
|
|
19
|
+
matches: [],
|
|
20
|
+
totalSearches: searches.length,
|
|
21
|
+
completedSearches: 0,
|
|
22
|
+
failures: [],
|
|
23
|
+
earlyTerminationTriggered: false
|
|
24
|
+
};
|
|
25
|
+
if (searches.length === 0) {
|
|
26
|
+
logger.debug(`${operationName}: No searches to execute`);
|
|
27
|
+
return results;
|
|
28
|
+
}
|
|
29
|
+
// Execute searches in batches if there are many
|
|
30
|
+
const batches = [];
|
|
31
|
+
for (let i = 0; i < searches.length; i += maxParallelSearches) {
|
|
32
|
+
batches.push(searches.slice(i, i + maxParallelSearches));
|
|
33
|
+
}
|
|
34
|
+
let exactMatchFound = false;
|
|
35
|
+
let exactMatch = null;
|
|
36
|
+
for (const batch of batches) {
|
|
37
|
+
// Create promises for the current batch
|
|
38
|
+
const batchPromises = batch.map(async (search, batchIndex) => {
|
|
39
|
+
const globalIndex = batches.indexOf(batch) * maxParallelSearches + batchIndex;
|
|
40
|
+
try {
|
|
41
|
+
const result = await search();
|
|
42
|
+
if (result) {
|
|
43
|
+
// Check if this is an exact match
|
|
44
|
+
if (!exactMatchFound && isExactMatch(result)) {
|
|
45
|
+
exactMatchFound = true;
|
|
46
|
+
exactMatch = result;
|
|
47
|
+
logger.debug(`${operationName}: Exact match found at index ${globalIndex}`, {
|
|
48
|
+
operationName,
|
|
49
|
+
exactMatchIndex: globalIndex,
|
|
50
|
+
timeToExactMatch: Date.now() - startTime
|
|
51
|
+
});
|
|
52
|
+
}
|
|
53
|
+
return { success: true, result, index: globalIndex };
|
|
54
|
+
}
|
|
55
|
+
return { success: true, result: null, index: globalIndex };
|
|
56
|
+
}
|
|
57
|
+
catch (error) {
|
|
58
|
+
return {
|
|
59
|
+
success: false,
|
|
60
|
+
result: null,
|
|
61
|
+
error: error?.message || String(error),
|
|
62
|
+
index: globalIndex
|
|
63
|
+
};
|
|
64
|
+
}
|
|
65
|
+
});
|
|
66
|
+
// If we found an exact match in a previous batch, use timeout for remaining batches
|
|
67
|
+
if (exactMatchFound && timeoutAfterExactMatch > 0) {
|
|
68
|
+
logger.debug(`${operationName}: Using early termination timeout for remaining searches`, {
|
|
69
|
+
operationName,
|
|
70
|
+
timeoutMs: timeoutAfterExactMatch,
|
|
71
|
+
remainingBatches: batches.length - batches.indexOf(batch)
|
|
72
|
+
});
|
|
73
|
+
try {
|
|
74
|
+
// Race between batch completion and timeout
|
|
75
|
+
const batchResults = await Promise.race([
|
|
76
|
+
Promise.allSettled(batchPromises),
|
|
77
|
+
new Promise((_, reject) => {
|
|
78
|
+
setTimeout(() => {
|
|
79
|
+
reject(new Error('Early termination timeout'));
|
|
80
|
+
}, timeoutAfterExactMatch);
|
|
81
|
+
})
|
|
82
|
+
]);
|
|
83
|
+
this.processBatchResults(batchResults, results);
|
|
84
|
+
}
|
|
85
|
+
catch (error) {
|
|
86
|
+
if (error.message === 'Early termination timeout') {
|
|
87
|
+
results.earlyTerminationTriggered = true;
|
|
88
|
+
results.performanceGain = `Terminated early after exact match, saving ${searches.length - results.completedSearches} searches`;
|
|
89
|
+
logger.info(`${operationName}: Early termination triggered`, {
|
|
90
|
+
operationName,
|
|
91
|
+
exactMatch: exactMatch ? 'found' : 'none',
|
|
92
|
+
completedSearches: results.completedSearches,
|
|
93
|
+
totalSearches: results.totalSearches,
|
|
94
|
+
timeSaved: `${Date.now() - startTime}ms`
|
|
95
|
+
});
|
|
96
|
+
break;
|
|
97
|
+
}
|
|
98
|
+
throw error;
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
else {
|
|
102
|
+
// Normal execution without timeout
|
|
103
|
+
const batchResults = await Promise.allSettled(batchPromises);
|
|
104
|
+
this.processBatchResults(batchResults, results);
|
|
105
|
+
}
|
|
106
|
+
// If we found an exact match and this is the first batch, we can potentially terminate
|
|
107
|
+
if (exactMatchFound && batches.indexOf(batch) === 0 && batches.length > 1) {
|
|
108
|
+
logger.debug(`${operationName}: Considering early termination after first batch`, {
|
|
109
|
+
operationName,
|
|
110
|
+
exactMatchFound: true,
|
|
111
|
+
remainingBatches: batches.length - 1
|
|
112
|
+
});
|
|
113
|
+
// Continue to next batch with timeout
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
// Add exact match to results if found
|
|
117
|
+
if (exactMatch) {
|
|
118
|
+
results.exactMatch = exactMatch;
|
|
119
|
+
// Ensure exact match is in matches array
|
|
120
|
+
if (!results.matches.some(m => m === exactMatch)) {
|
|
121
|
+
results.matches.unshift(exactMatch); // Put exact match first
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
const totalTime = Date.now() - startTime;
|
|
125
|
+
logger.debug(`${operationName}: Search operation completed`, {
|
|
126
|
+
operationName,
|
|
127
|
+
totalTime: `${totalTime}ms`,
|
|
128
|
+
totalSearches: results.totalSearches,
|
|
129
|
+
completedSearches: results.completedSearches,
|
|
130
|
+
matches: results.matches.length,
|
|
131
|
+
failures: results.failures.length,
|
|
132
|
+
exactMatchFound: !!results.exactMatch,
|
|
133
|
+
earlyTerminationTriggered: results.earlyTerminationTriggered,
|
|
134
|
+
performanceGain: results.performanceGain
|
|
135
|
+
});
|
|
136
|
+
return results;
|
|
137
|
+
}
|
|
138
|
+
/**
|
|
139
|
+
* Process batch results and update the main results object
|
|
140
|
+
*/
|
|
141
|
+
static processBatchResults(batchResults, results) {
|
|
142
|
+
for (const promiseResult of batchResults) {
|
|
143
|
+
if (promiseResult.status === 'fulfilled') {
|
|
144
|
+
const { success, result, error, index } = promiseResult.value;
|
|
145
|
+
results.completedSearches++;
|
|
146
|
+
if (success && result) {
|
|
147
|
+
results.matches.push(result);
|
|
148
|
+
}
|
|
149
|
+
else if (!success && error) {
|
|
150
|
+
results.failures.push({ index, error });
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
else {
|
|
154
|
+
// Promise itself was rejected
|
|
155
|
+
results.completedSearches++;
|
|
156
|
+
results.failures.push({
|
|
157
|
+
index: -1, // Unknown index for rejected promise
|
|
158
|
+
error: promiseResult.reason?.message || String(promiseResult.reason)
|
|
159
|
+
});
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiRWFybHlUZXJtaW5hdGlvblNlYXJjaC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy91dGlscy9FYXJseVRlcm1pbmF0aW9uU2VhcmNoLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7OztHQUtHO0FBRUgsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLGFBQWEsQ0FBQztBQWtCckMsTUFBTSxPQUFPLHNCQUFzQjtJQUNqQzs7Ozs7T0FLRztJQUNILE1BQU0sQ0FBQyxLQUFLLENBQUMsMkJBQTJCLENBQ3RDLFFBQXdDLEVBQ3hDLFlBQW9DLEVBQ3BDLFVBSUksRUFBRSxhQUFhLEVBQUUsUUFBUSxFQUFFO1FBRS9CLE1BQU0sRUFDSixhQUFhLEVBQ2Isc0JBQXNCLEdBQUcsSUFBSSxFQUM3QixtQkFBbUIsR0FBRyxFQUFFLEVBQ3pCLEdBQUcsT0FBTyxDQUFDO1FBRVosTUFBTSxTQUFTLEdBQUcsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDO1FBQzdCLE1BQU0sT0FBTyxHQUE4QjtZQUN6QyxPQUFPLEVBQUUsRUFBRTtZQUNYLGFBQWEsRUFBRSxRQUFRLENBQUMsTUFBTTtZQUM5QixpQkFBaUIsRUFBRSxDQUFDO1lBQ3BCLFFBQVEsRUFBRSxFQUFFO1lBQ1oseUJBQXlCLEVBQUUsS0FBSztTQUNqQyxDQUFDO1FBRUYsSUFBSSxRQUFRLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRSxDQUFDO1lBQzFCLE1BQU0sQ0FBQyxLQUFLLENBQUMsR0FBRyxhQUFhLDBCQUEwQixDQUFDLENBQUM7WUFDekQsT0FBTyxPQUFPLENBQUM7UUFDakIsQ0FBQztRQUVELGdEQUFnRDtRQUNoRCxNQUFNLE9BQU8sR0FBMEMsRUFBRSxDQUFDO1FBQzFELEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxRQUFRLENBQUMsTUFBTSxFQUFFLENBQUMsSUFBSSxtQkFBbUIsRUFBRSxDQUFDO1lBQzlELE9BQU8sQ0FBQyxJQUFJLENB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LEtBQUssQ0FBQztnQkFDOUQsT0FBTyxDQUFDLGlCQUFpQixFQUFFLENBQUM7Z0JBRTVCLElBQUksT0FBTyxJQUFJLE1BQU0sRUFBRSxDQUFDO29CQUN0QixPQUFPLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztnQkFDL0IsQ0FBQztxQkFBTSxJQUFJLENBQUMsT0FBTyxJQUFJLEtBQUssRUFBRSxDQUFDO29CQUM3QixPQUFPLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsQ0FBQyxDQUFDO2dCQUMxQyxDQUFDO1lBQ0gsQ0FBQztpQkFBTSxDQUFDO2dCQUNOLDhCQUE4QjtnQkFDOUIsT0FBTyxDQUFDLGlCQUFpQixFQUFFLENBQUM7Z0JBQzVCLE9BQU8sQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDO29CQUNwQixLQUFLLEVBQUUsQ0FBQyxDQUFDLEVBQUUscUNBQXFDO29CQUNoRCxLQUFLLEVBQUUsYUFBYSxDQUFDLE1BQU0sRUFBRSxPQUFPLElBQUksTUFBTSxDQUFDLGFBQWEsQ0FBQyxNQUFNLENBQUM7aUJBQ3JFLENBQUMsQ0FBQztZQUNMLENBQUM7UUFDSCxDQUFDO0lBQ0gsQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBFYXJseVRlcm1pbmF0aW9uU2VhcmNoIC0gVXRpbGl0eSBmb3IgcGFyYWxsZWwgc2VhcmNoZXMgd2l0aCBlYXJseSB0ZXJtaW5hdGlvblxuICogXG4gKiBPcHRpbWl6ZXMgc2VhcmNoIG9wZXJhdGlvbnMgYnkgdGVybWluYXRpbmcgd2hlbiBleGFjdCBtYXRjaGVzIGFyZSBmb3VuZCxcbiAqIHdoaWxlIHN0aWxsIHByb3ZpZGluZyBjb21wcmVoZW5zaXZlIHJlc3VsdHMgZm9yIGRpYWdub3N0aWNzLlxuICovXG5cbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4vbG9nZ2VyLmpzJztcblxuZXhwb3J0IGludGVyZmFjZSBTZWFyY2hSZXN1bHQ8VD4ge1xuICBzdWNjZXNzOiBib29sZWFuO1xuICByZXN1bHQ6IFQgfCBudWxsO1xuICBlcnJvcj86IHN0cmluZztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBFYXJseVRlcm1pbmF0aW9uUmVzdWx0PFQ+IHtcbiAgbWF0Y2hlczogVFtdO1xuICBleGFjdE1hdGNoPzogVDtcbiAgdG90YWxTZWFyY2hlczogbnVtYmVyO1xuICBjb21wbGV0ZWRTZWFyY2hlczogbnVtYmVyO1xuICBmYWlsdXJlczogQXJyYXk8eyBpbmRleDogbnVtYmVyOyBlcnJvcjogc3RyaW5nIH0+O1xuICBlYXJseVRlcm1pbmF0aW9uVHJpZ2dlcmVkOiBib29sZWFuO1xuICBwZXJmb3JtYW5jZUdhaW4/OiBzdHJpbmc7XG59XG5cbmV4cG9ydCBjbGFzcyBFYXJseVRlcm1pbmF0aW9uU2VhcmNoIHtcbiAgLyoqXG4gICAqIFBlcmZvcm0gcGFyYWxsZWwgc2VhcmNoZXMgd2l0aCBlYXJseSB0ZXJtaW5hdGlvbiB3aGVuIGV4YWN0IG1hdGNoIGZvdW5kXG4gICAqIEBwYXJhbSBzZWFyY2hlcyBBcnJheSBvZiBzZWFyY2ggZnVuY3Rpb25zIHRvIGV4ZWN1dGVcbiAgICogQHBhcmFtIGlzRXhhY3RNYXRjaCBGdW5jdGlvbiB0byBkZXRlcm1pbmUgaWYgYSByZXN1bHQgaXMgYW4gZXhhY3QgbWF0Y2hcbiAgICogQHBhcmFtIG9wdGlvbnMgQ29uZmlndXJhdGlvbiBvcHRpb25zXG4gICAqL1xuICBzdGF0aWMgYXN5bmMgZXhlY3V0ZVdpdGhFYXJseVRlcm1pbmF0aW9uPFQ+KFxuICAgIHNlYXJjaGVzOiBBcnJheTwoKSA9PiBQcm9taXNlPFQgfCBudWxsPj4sXG4gICAgaXNFeGFjdE1hdGNoOiAocmVzdWx0OiBUKSA9PiBib29sZWFuLFxuICAgIG9wdGlvbnM6IHtcbiAgICAgIG9wZXJhdGlvbk5hbWU6IHN0cmluZztcbiAgICAgIHRpbWVvdXRBZnRlckV4YWN0TWF0Y2g/OiBudW1iZXI7IC8vIG1zIHRvIHdhaXQgZm9yIG90aGVyIHNlYXJjaGVzIGFmdGVyIGV4YWN0IG1hdGNoXG4gICAgICBtYXhQYXJhbGxlbFNlYXJjaGVzPzogbnVtYmVyOyAvLyBsaW1pdCBjb25jdXJyZW50IHNlYXJjaGVzXG4gICAgfSA9IHsgb3BlcmF0aW9uTmFtZTogJ3NlYXJjaCcgfVxuICApOiBQcm9taXNlPEVhcmx5VGVybWluYXRpb25SZXN1bHQ8VD4+IHtcbiAgICBjb25zdCB7XG4gICAgICBvcGVyYXRpb25OYW1lLFxuICAgICAgdGltZW91dEFmdGVyRXhhY3RNYXRjaCA9IDEwMDAsXG4gICAgICBtYXhQYXJhbGxlbFNlYXJjaGVzID0gMTBcbiAgICB9ID0gb3B0aW9ucztcblxuICAgIGNvbnN0IHN0YXJ0VGltZSA9IERhdGUubm93KCk7XG4gICAgY29uc3QgcmVzdWx0czogRWFybHlUZXJtaW5hdGlvblJlc3VsdDxUPiA9IHtcbiAgICAgIG1hdGNoZXM6IFtdLFxuICAgICAgdG90YWxTZWFyY2hlczogc2VhcmNoZXMubGVuZ3RoLFxuICAgICAgY29tcGxldGVkU2VhcmNoZXM6IDAsXG4gICAgICBmYWlsdXJlczogW10sXG4gICAgICBlYXJseVRlcm1pbmF0aW9uVHJpZ2dlcmVkOiBmYWxzZVxuICAgIH07XG5cbiAgICBpZiAoc2VhcmNoZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICBsb2dnZXIuZGVidWcoYCR7b3BlcmF0aW9uTmFtZX06IE5vIHNlYXJjaGVzIHRvIGV4ZWN1dGVgKTtcbiAgICAgIHJldHVybiByZXN1bHRzO1xuICAgIH1cblxuICAgIC8vIEV4ZWN1dGUgc2VhcmNoZXMgaW4gYmF0Y2hlcyBpZiB0aGVyZSBhcmUgbWFueVxuICAgIGNvbnN0IGJhdGNoZXM6IEFycmF5PEFycmF5PCgpID0+IFByb21pc2U8VCB8IG51bGw+Pj4gPSBbXTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHNlYXJjaGVzLmxlbmd0aDsgaSArPSBtYXhQYXJhbGxlbFNlYXJjaGVzKSB7XG4gICAgICBiYXRjaGVzLnB1c2goc2VhcmNoZXMuc2xpY2UoaSwgaSArIG1heFBhcmFsbGVsU2VhcmNoZXMpKTtcbiAgICB9XG5cbiAgICBsZXQgZXhhY3RNYXRjaEZvdW5kID0gZmFsc2U7XG4gICAgbGV0IGV4YWN0TWF0Y2g6IFQgfCBudWxsID0gbnVsbDtcblxuICAgIGZvciAoY29uc3QgYmF0Y2ggb2YgYmF0Y2hlcykge1xuICAgICAgLy8gQ3JlYXRlIHByb21pc2VzIGZvciB0aGUgY3VycmVudCBiYXRjaFxuICAgICAgY29uc3QgYmF0Y2hQcm9taXNlcyA9IGJhdGNoLm1hcChhc3luYyAoc2VhcmNoLCBiYXRjaEluZGV4KSA9PiB7XG4gICAgICAgIGNvbnN0IGdsb2JhbEluZGV4ID0gYmF0Y2hlcy5pbmRleE9mKGJhdGNoKSAqIG1heFBhcmFsbGVsU2VhcmNoZXMgKyBiYXRjaEluZGV4O1xuICAgICAgICBcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBzZWFyY2goKTtcbiAgICAgICAgICBcbiAgICAgICAgICBpZiAocmVzdWx0KSB7XG4gICAgICAgICAgICAvLyBDaGVjayBpZiB0aGlzIGlzIGFuIGV4YWN0IG1hdGNoXG4gICAgICAgICAgICBpZiAoIWV4YWN0TWF0Y2hGb3VuZCAmJiBpc0V4YWN0TWF0Y2gocmVzdWx0KSkge1xuICAgICAgICAgICAgICBleGFjdE1hdGNoRm91bmQgPSB0cnVlO1xuICAgICAgICAgICAgICBleGFjdE1hdGNoID0gcmVzdWx0O1xuICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKGAke29wZXJhdGlvbk5hbWV9OiBFeGFjdCBtYXRjaCBmb3VuZCBhdCBpbmRleCAke2dsb2JhbEluZGV4fWAsIHtcbiAgICAgICAgICAgICAgICBvcGVyYXRpb25OYW1lLFxuICAgICAgICAgICAgICAgIGV4YWN0TWF0Y2hJbmRleDogZ2xvYmFsSW5kZXgsXG4gICAgICAgICAgICAgICAgdGltZVRvRXhhY3RNYXRjaDogRGF0ZS5ub3coKSAtIHN0YXJ0VGltZVxuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIFxuICAgICAgICAgICAgcmV0dXJuIHsgc3VjY2VzczogdHJ1ZSwgcmVzdWx0LCBpbmRleDogZ2xvYmFsSW5kZXggfTtcbiAgICAgICAgICB9XG4gICAgICAgICAgXG4gICAgICAgICAgcmV0dXJuIHsgc3VjY2VzczogdHJ1ZSwgcmVzdWx0OiBudWxsLCBpbmRleDogZ2xvYmFsSW5kZXggfTtcbiAgICAgICAgfSBjYXRjaCAoZXJyb3I6IGFueSkge1xuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBzdWNjZXNzOiBmYWxzZSxcbiAgICAgICAgICAgIHJlc3VsdDogbnVsbCxcbiAgICAgICAgICAgIGVycm9yOiBlcnJvcj8ubWVzc2FnZSB8fCBTdHJpbmcoZXJyb3IpLFxuICAgICAgICAgICAgaW5kZXg6IGdsb2JhbEluZGV4XG4gICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgfSk7XG5cbiAgICAgIC8vIElmIHdlIGZvdW5kIGFuIGV4YWN0IG1hdGNoIGluIGEgcHJldmlvdXMgYmF0Y2gsIHVzZSB0aW1lb3V0IGZvciByZW1haW5pbmcgYmF0Y2hlc1xuICAgICAgaWYgKGV4YWN0TWF0Y2hGb3VuZCAmJiB0aW1lb3V0QWZ0ZXJFeGFjdE1hdGNoID4gMCkge1xuICAgICAgICBsb2dnZXIuZGVidWcoYCR7b3BlcmF0aW9uTmFtZX06IFVzaW5nIGVhcmx5IHRlcm1pbmF0aW9uIHRpbWVvdXQgZm9yIHJlbWFpbmluZyBzZWFyY2hlc2AsIHtcbiAgICAgICAgICBvcGVyYXRpb25OYW1lLFxuICAgICAgICAgIHRpbWVvdXRNczogdGltZW91dEFmdGVyRXhhY3RNYXRjaCxcbiAgICAgICAgICByZW1haW5pbmdCYXRjaGVzOiBiYXRjaGVzLmxlbmd0aCAtIGJhdGNoZXMuaW5kZXhPZihiYXRjaClcbiAgICAgICAgfSk7XG5cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAvLyBSYWNlIGJldHdlZW4gYmF0Y2ggY29tcGxldGlvbiBhbmQgdGltZW91dFxuICAgICAgICAgIGNvbnN0IGJhdGNoUmVzdWx0cyA9IGF3YWl0IFByb21pc2UucmFjZShbXG4gICAgICAgICAgICBQcm9taXNlLmFsbFNldHRsZWQoYmF0Y2hQcm9taXNlcyksXG4gICAgICAgICAgICBuZXcgUHJvbWlzZTxuZXZlcj4oKF8sIHJlamVjdCkgPT4ge1xuICAgICAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgICAgICByZWplY3QobmV3IEVycm9yKCdFYXJseSB0ZXJtaW5hdGlvbiB0aW1lb3V0JykpO1xuICAgICAgICAgICAgICB9LCB0aW1lb3V0QWZ0ZXJFeGFjdE1hdGNoKTtcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgXSk7XG5cbiAgICAgICAgICB0aGlzLnByb2Nlc3NCYXRjaFJlc3VsdHMoYmF0Y2hSZXN1bHRzLCByZXN1bHRzKTtcbiAgICAgICAgfSBjYXRjaCAoZXJyb3I6IGFueSkge1xuICAgICAgICAgIGlmIChlcnJvci5tZXNzYWdlID09PSAnRWFybHkgdGVybWluYXRpb24gdGltZW91dCcpIHtcbiAgICAgICAgICAgIHJlc3VsdHMuZWFybHlUZXJtaW5hdGlvblRyaWdnZXJlZCA9IHRydWU7XG4gICAgICAgICAgICByZXN1bHRzLnBlcmZvcm1hbmNlR2FpbiA9IGBUZXJtaW5hdGVkIGVhcmx5IGFmdGVyIGV4YWN0IG1hdGNoLCBzYXZpbmcgJHtzZWFyY2hlcy5sZW5ndGggLSByZXN1bHRzLmNvbXBsZXRlZFNlYXJjaGVzfSBzZWFyY2hlc2A7XG4gICAgICAgICAgICBsb2dnZXIuaW5mbyhgJHtvcGVyYXRpb25OYW1lfTogRWFybHkgdGVybWluYXRpb24gdHJpZ2dlcmVkYCwge1xuICAgICAgICAgICAgICBvcGVyYXRpb25OYW1lLFxuICAgICAgICAgICAgICBleGFjdE1hdGNoOiBleGFjdE1hdGNoID8gJ2ZvdW5kJyA6ICdub25lJyxcbiAgICAgICAgICAgICAgY29tcGxldGVkU2VhcmNoZXM6IHJlc3VsdHMuY29tcGxldGVkU2VhcmNoZXMsXG4gICAgICAgICAgICAgIHRvdGFsU2VhcmNoZXM6IHJlc3VsdHMudG90YWxTZWFyY2hlcyxcbiAgICAgICAgICAgICAgdGltZVNhdmVkOiBgJHtEYXRlLm5vdygpIC0gc3RhcnRUaW1lfW1zYFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG4gICAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIE5vcm1hbCBleGVjdXRpb24gd2l0aG91dCB0aW1lb3V0XG4gICAgICAgIGNvbnN0IGJhdGNoUmVzdWx0cyA9IGF3YWl0IFByb21pc2UuYWxsU2V0dGxlZChiYXRjaFByb21pc2VzKTtcbiAgICAgICAgdGhpcy5wcm9jZXNzQmF0Y2hSZXN1bHRzKGJhdGNoUmVzdWx0cywgcmVzdWx0cyk7XG4gICAgICB9XG5cbiAgICAgIC8vIElmIHdlIGZvdW5kIGFuIGV4YWN0IG1hdGNoIGFuZCB0aGlzIGlzIHRoZSBmaXJzdCBiYXRjaCwgd2UgY2FuIHBvdGVudGlhbGx5IHRlcm1pbmF0ZVxuICAgICAgaWYgKGV4YWN0TWF0Y2hGb3VuZCAmJiBiYXRjaGVzLmluZGV4T2YoYmF0Y2gpID09PSAwICYmIGJhdGNoZXMubGVuZ3RoID4gMSkge1xuICAgICAgICBsb2dnZXIuZGVidWcoYCR7b3BlcmF0aW9uTmFtZX06IENvbnNpZGVyaW5nIGVhcmx5IHRlcm1pbmF0aW9uIGFmdGVyIGZpcnN0IGJhdGNoYCwge1xuICAgICAgICAgIG9wZXJhdGlvbk5hbWUsXG4gICAgICAgICAgZXhhY3RNYXRjaEZvdW5kOiB0cnVlLFxuICAgICAgICAgIHJlbWFpbmluZ0JhdGNoZXM6IGJhdGNoZXMubGVuZ3RoIC0gMVxuICAgICAgICB9KTtcbiAgICAgICAgLy8gQ29udGludWUgdG8gbmV4dCBiYXRjaCB3aXRoIHRpbWVvdXRcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBBZGQgZXhhY3QgbWF0Y2ggdG8gcmVzdWx0cyBpZiBmb3VuZFxuICAgIGlmIChleGFjdE1hdGNoKSB7XG4gICAgICByZXN1bHRzLmV4YWN0TWF0Y2ggPSBleGFjdE1hdGNoO1xuICAgICAgLy8gRW5zdXJlIGV4YWN0IG1hdGNoIGlzIGluIG1hdGNoZXMgYXJyYXlcbiAgICAgIGlmICghcmVzdWx0cy5tYXRjaGVzLnNvbWUobSA9PiBtID09PSBleGFjdE1hdGNoKSkge1xuICAgICAgICByZXN1bHRzLm1hdGNoZXMudW5zaGlmdChleGFjdE1hdGNoKTsgLy8gUHV0IGV4YWN0IG1hdGNoIGZpcnN0XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3QgdG90YWxUaW1lID0gRGF0ZS5ub3coKSAtIHN0YXJ0VGltZTtcbiAgICBsb2dnZXIuZGVidWcoYCR7b3BlcmF0aW9uTmFtZX06IFNlYXJjaCBvcGVyYXRpb24gY29tcGxldGVkYCwge1xuICAgICAgb3BlcmF0aW9uTmFtZSxcbiAgICAgIHRvdGFsVGltZTogYCR7dG90YWxUaW1lfW1zYCxcbiAgICAgIHRvdGFsU2VhcmNoZXM6IHJlc3VsdHMudG90YWxTZWFyY2hlcyxcbiAgICAgIGNvbXBsZXRlZFNlYXJjaGVzOiByZXN1bHRzLmNvbXBsZXRlZFNlYXJjaGVzLFxuICAgICAgbWF0Y2hlczogcmVzdWx0cy5tYXRjaGVzLmxlbmd0aCxcbiAgICAgIGZhaWx1cmVzOiByZXN1bHRzLmZhaWx1cmVzLmxlbmd0aCxcbiAgICAgIGV4YWN0TWF0Y2hGb3VuZDogISFyZXN1bHRzLmV4YWN0TWF0Y2gsXG4gICAgICBlYXJseVRlcm1pbmF0aW9uVHJpZ2dlcmVkOiByZXN1bHRzLmVhcmx5VGVybWluYXRpb25UcmlnZ2VyZWQsXG4gICAgICBwZXJmb3JtYW5jZUdhaW46IHJlc3VsdHMucGVyZm9ybWFuY2VHYWluXG4gICAgfSk7XG5cbiAgICByZXR1cm4gcmVzdWx0cztcbiAgfVxuXG4gIC8qKlxuICAgKiBQcm9jZXNzIGJhdGNoIHJlc3VsdHMgYW5kIHVwZGF0ZSB0aGUgbWFpbiByZXN1bHRzIG9iamVjdFxuICAgKi9cbiAgcHJpdmF0ZSBzdGF0aWMgcHJvY2Vzc0JhdGNoUmVzdWx0czxUPihcbiAgICBiYXRjaFJlc3VsdHM6IFByb21pc2VTZXR0bGVkUmVzdWx0PHsgc3VjY2VzczogYm9vbGVhbjsgcmVzdWx0OiBUIHwgbnVsbDsgZXJyb3I/OiBzdHJpbmc7IGluZGV4OiBudW1iZXIgfT5bXSxcbiAgICByZXN1bHRzOiBFYXJseVRlcm1pbmF0aW9uUmVzdWx0PFQ+XG4gICk6IHZvaWQge1xuICAgIGZvciAoY29uc3QgcHJvbWlzZVJlc3VsdCBvZiBiYXRjaFJlc3VsdHMpIHtcbiAgICAgIGlmIChwcm9taXNlUmVzdWx0LnN0YXR1cyA9PT0gJ2Z1bGZpbGxlZCcpIHtcbiAgICAgICAgY29uc3QgeyBzdWNjZXNzLCByZXN1bHQsIGVycm9yLCBpbmRleCB9ID0gcHJvbWlzZVJlc3VsdC52YWx1ZTtcbiAgICAgICAgcmVzdWx0cy5jb21wbGV0ZWRTZWFyY2hlcysrO1xuICAgICAgICBcbiAgICAgICAgaWYgKHN1Y2Nlc3MgJiYgcmVzdWx0KSB7XG4gICAgICAgICAgcmVzdWx0cy5tYXRjaGVzLnB1c2gocmVzdWx0KTtcbiAgICAgICAgfSBlbHNlIGlmICghc3VjY2VzcyAmJiBlcnJvcikge1xuICAgICAgICAgIHJlc3VsdHMuZmFpbHVyZXMucHVzaCh7IGluZGV4LCBlcnJvciB9KTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gUHJvbWlzZSBpdHNlbGYgd2FzIHJlamVjdGVkXG4gICAgICAgIHJlc3VsdHMuY29tcGxldGVkU2VhcmNoZXMrKztcbiAgICAgICAgcmVzdWx0cy5mYWlsdXJlcy5wdXNoKHsgXG4gICAgICAgICAgaW5kZXg6IC0xLCAvLyBVbmtub3duIGluZGV4IGZvciByZWplY3RlZCBwcm9taXNlXG4gICAgICAgICAgZXJyb3I6IHByb21pc2VSZXN1bHQucmVhc29uPy5tZXNzYWdlIHx8IFN0cmluZyhwcm9taXNlUmVzdWx0LnJlYXNvbilcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuICB9XG59Il19
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Centralized error handling utilities for consistent error processing
|
|
3
|
+
* Preserves stack traces and provides user-friendly messages
|
|
4
|
+
*/
|
|
5
|
+
/**
|
|
6
|
+
* Error categories for better error handling
|
|
7
|
+
*/
|
|
8
|
+
export declare enum ErrorCategory {
|
|
9
|
+
USER_ERROR = "USER_ERROR",// User input issues
|
|
10
|
+
SYSTEM_ERROR = "SYSTEM_ERROR",// Internal system failures
|
|
11
|
+
NETWORK_ERROR = "NETWORK_ERROR",// API/network issues
|
|
12
|
+
AUTH_ERROR = "AUTH_ERROR",// Authentication/authorization
|
|
13
|
+
VALIDATION_ERROR = "VALIDATION_ERROR"
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* Structured error information
|
|
17
|
+
*/
|
|
18
|
+
export interface ErrorInfo {
|
|
19
|
+
message: string;
|
|
20
|
+
category: ErrorCategory;
|
|
21
|
+
code?: string;
|
|
22
|
+
details?: Record<string, unknown>;
|
|
23
|
+
stack?: string;
|
|
24
|
+
originalError?: Error;
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* Custom error class with additional context
|
|
28
|
+
*/
|
|
29
|
+
export declare class ApplicationError extends Error {
|
|
30
|
+
readonly category: ErrorCategory;
|
|
31
|
+
readonly code?: string;
|
|
32
|
+
readonly details?: Record<string, unknown>;
|
|
33
|
+
readonly originalError?: Error;
|
|
34
|
+
constructor(message: string, category?: ErrorCategory, code?: string, details?: Record<string, unknown>, originalError?: Error);
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* Utility class for consistent error handling
|
|
38
|
+
*/
|
|
39
|
+
export declare class ErrorHandler {
|
|
40
|
+
/**
|
|
41
|
+
* Maximum stack trace depth to prevent memory issues
|
|
42
|
+
*/
|
|
43
|
+
private static readonly MAX_STACK_DEPTH;
|
|
44
|
+
/**
|
|
45
|
+
* Maximum length for stack trace strings
|
|
46
|
+
*/
|
|
47
|
+
private static readonly MAX_STACK_LENGTH;
|
|
48
|
+
/**
|
|
49
|
+
* Truncate stack trace to prevent memory issues
|
|
50
|
+
*/
|
|
51
|
+
static truncateStack(stack?: string): string | undefined;
|
|
52
|
+
/**
|
|
53
|
+
* Extract error information while preserving context
|
|
54
|
+
*/
|
|
55
|
+
static extractErrorInfo(error: unknown): ErrorInfo;
|
|
56
|
+
/**
|
|
57
|
+
* Get user-friendly error message
|
|
58
|
+
*/
|
|
59
|
+
static getUserMessage(error: unknown): string;
|
|
60
|
+
/**
|
|
61
|
+
* Log error with appropriate level and context
|
|
62
|
+
*/
|
|
63
|
+
static logError(context: string, error: unknown, additionalInfo?: Record<string, unknown>): void;
|
|
64
|
+
/**
|
|
65
|
+
* Create an error with context preservation
|
|
66
|
+
*/
|
|
67
|
+
static createError(message: string, category?: ErrorCategory, code?: string, originalError?: unknown): ApplicationError;
|
|
68
|
+
/**
|
|
69
|
+
* Wrap an error with additional context
|
|
70
|
+
*/
|
|
71
|
+
static wrapError(error: unknown, context: string, category?: ErrorCategory): ApplicationError;
|
|
72
|
+
/**
|
|
73
|
+
* Check if error is of a specific category
|
|
74
|
+
*/
|
|
75
|
+
static isErrorCategory(error: unknown, category: ErrorCategory): boolean;
|
|
76
|
+
/**
|
|
77
|
+
* Format error for API response
|
|
78
|
+
*/
|
|
79
|
+
static formatForResponse(error: unknown): {
|
|
80
|
+
success: false;
|
|
81
|
+
message: string;
|
|
82
|
+
error: string;
|
|
83
|
+
details?: Record<string, unknown>;
|
|
84
|
+
};
|
|
85
|
+
}
|
|
86
|
+
//# sourceMappingURL=ErrorHandler.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ErrorHandler.d.ts","sourceRoot":"","sources":["../../src/utils/ErrorHandler.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAIH;;GAEG;AACH,oBAAY,aAAa;IACvB,UAAU,eAAe,CAAS,oBAAoB;IACtD,YAAY,iBAAiB,CAAK,2BAA2B;IAC7D,aAAa,kBAAkB,CAAG,qBAAqB;IACvD,UAAU,eAAe,CAAS,+BAA+B;IACjE,gBAAgB,qBAAqB;CACtC;AAED;;GAEG;AACH,MAAM,WAAW,SAAS;IACxB,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,aAAa,CAAC;IACxB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAClC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,aAAa,CAAC,EAAE,KAAK,CAAC;CACvB;AAED;;GAEG;AACH,qBAAa,gBAAiB,SAAQ,KAAK;IACzC,SAAgB,QAAQ,EAAE,aAAa,CAAC;IACxC,SAAgB,IAAI,CAAC,EAAE,MAAM,CAAC;IAC9B,SAAgB,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAClD,SAAgB,aAAa,CAAC,EAAE,KAAK,CAAC;gBAGpC,OAAO,EAAE,MAAM,EACf,QAAQ,GAAE,aAA0C,EACpD,IAAI,CAAC,EAAE,MAAM,EACb,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EACjC,aAAa,CAAC,EAAE,KAAK;CAexB;AAED;;GAEG;AACH,qBAAa,YAAY;IACvB;;OAEG;IACH,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,eAAe,CAAM;IAE7C;;OAEG;IACH,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,gBAAgB,CAAQ;IAEhD;;OAEG;WACW,aAAa,CAAC,KAAK,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS;IAiB/D;;OAEG;IACH,MAAM,CAAC,gBAAgB,CAAC,KAAK,EAAE,OAAO,GAAG,SAAS;IAuClD;;OAEG;IACH,MAAM,CAAC,cAAc,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM;IAmB7C;;OAEG;IACH,MAAM,CAAC,QAAQ,CACb,OAAO,EAAE,MAAM,EACf,KAAK,EAAE,OAAO,EACd,cAAc,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GACvC,IAAI;IAwCP;;OAEG;IACH,MAAM,CAAC,WAAW,CAChB,OAAO,EAAE,MAAM,EACf,QAAQ,GAAE,aAA0C,EACpD,IAAI,CAAC,EAAE,MAAM,EACb,aAAa,CAAC,EAAE,OAAO,GACtB,gBAAgB;IAKnB;;OAEG;IACH,MAAM,CAAC,SAAS,CACd,KAAK,EAAE,OAAO,EACd,OAAO,EAAE,MAAM,EACf,QAAQ,CAAC,EAAE,aAAa,GACvB,gBAAgB;IAWnB;;OAEG;IACH,MAAM,CAAC,eAAe,CAAC,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,aAAa,GAAG,OAAO;IAKxE;;OAEG;IACH,MAAM,CAAC,iBAAiB,CAAC,KAAK,EAAE,OAAO,GAAG;QACxC,OAAO,EAAE,KAAK,CAAC;QACf,OAAO,EAAE,MAAM,CAAC;QAChB,KAAK,EAAE,MAAM,CAAC;QACd,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;KACnC;CAYF"}
|