@nahisaho/musubix-security 1.8.0 → 1.8.1
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/README.md +27 -0
- package/dist/analyzers/ai/index.d.ts +6 -0
- package/dist/analyzers/ai/index.d.ts.map +1 -0
- package/dist/analyzers/ai/index.js +6 -0
- package/dist/analyzers/ai/index.js.map +1 -0
- package/dist/analyzers/ai/prompt-injection-detector.d.ts +152 -0
- package/dist/analyzers/ai/prompt-injection-detector.d.ts.map +1 -0
- package/dist/analyzers/ai/prompt-injection-detector.js +468 -0
- package/dist/analyzers/ai/prompt-injection-detector.js.map +1 -0
- package/dist/analyzers/api/api-security-analyzer.d.ts +263 -0
- package/dist/analyzers/api/api-security-analyzer.d.ts.map +1 -0
- package/dist/analyzers/api/api-security-analyzer.js +581 -0
- package/dist/analyzers/api/api-security-analyzer.js.map +1 -0
- package/dist/analyzers/compliance/compliance-checker.d.ts +201 -0
- package/dist/analyzers/compliance/compliance-checker.d.ts.map +1 -0
- package/dist/analyzers/compliance/compliance-checker.js +772 -0
- package/dist/analyzers/compliance/compliance-checker.js.map +1 -0
- package/dist/analyzers/container/image-scanner.d.ts +163 -0
- package/dist/analyzers/container/image-scanner.d.ts.map +1 -0
- package/dist/analyzers/container/image-scanner.js +459 -0
- package/dist/analyzers/container/image-scanner.js.map +1 -0
- package/dist/analyzers/container/index.d.ts +6 -0
- package/dist/analyzers/container/index.d.ts.map +1 -0
- package/dist/analyzers/container/index.js +6 -0
- package/dist/analyzers/container/index.js.map +1 -0
- package/dist/analyzers/dashboard/security-dashboard.d.ts +286 -0
- package/dist/analyzers/dashboard/security-dashboard.d.ts.map +1 -0
- package/dist/analyzers/dashboard/security-dashboard.js +796 -0
- package/dist/analyzers/dashboard/security-dashboard.js.map +1 -0
- package/dist/analyzers/iac/iac-checker.d.ts +124 -0
- package/dist/analyzers/iac/iac-checker.d.ts.map +1 -0
- package/dist/analyzers/iac/iac-checker.js +755 -0
- package/dist/analyzers/iac/iac-checker.js.map +1 -0
- package/dist/analyzers/iac/index.d.ts +6 -0
- package/dist/analyzers/iac/index.d.ts.map +1 -0
- package/dist/analyzers/iac/index.js +6 -0
- package/dist/analyzers/iac/index.js.map +1 -0
- package/dist/analyzers/index.d.ts +9 -0
- package/dist/analyzers/index.d.ts.map +1 -0
- package/dist/analyzers/index.js +13 -0
- package/dist/analyzers/index.js.map +1 -0
- package/dist/analyzers/monitor/realtime-monitor.d.ts +216 -0
- package/dist/analyzers/monitor/realtime-monitor.d.ts.map +1 -0
- package/dist/analyzers/monitor/realtime-monitor.js +601 -0
- package/dist/analyzers/monitor/realtime-monitor.js.map +1 -0
- package/dist/analyzers/sast/index.d.ts +7 -0
- package/dist/analyzers/sast/index.d.ts.map +1 -0
- package/dist/analyzers/sast/index.js +7 -0
- package/dist/analyzers/sast/index.js.map +1 -0
- package/dist/analyzers/sast/interprocedural-analyzer.d.ts +276 -0
- package/dist/analyzers/sast/interprocedural-analyzer.d.ts.map +1 -0
- package/dist/analyzers/sast/interprocedural-analyzer.js +635 -0
- package/dist/analyzers/sast/interprocedural-analyzer.js.map +1 -0
- package/dist/analyzers/sast/zero-day-detector.d.ts +183 -0
- package/dist/analyzers/sast/zero-day-detector.d.ts.map +1 -0
- package/dist/analyzers/sast/zero-day-detector.js +593 -0
- package/dist/analyzers/sast/zero-day-detector.js.map +1 -0
- package/dist/analyzers/sca/dependency-scanner.d.ts +275 -0
- package/dist/analyzers/sca/dependency-scanner.d.ts.map +1 -0
- package/dist/analyzers/sca/dependency-scanner.js +642 -0
- package/dist/analyzers/sca/dependency-scanner.js.map +1 -0
- package/dist/core/index.d.ts +8 -0
- package/dist/core/index.d.ts.map +1 -0
- package/dist/core/index.js +10 -0
- package/dist/core/index.js.map +1 -0
- package/dist/core/pipeline-manager.d.ts +105 -0
- package/dist/core/pipeline-manager.d.ts.map +1 -0
- package/dist/core/pipeline-manager.js +449 -0
- package/dist/core/pipeline-manager.js.map +1 -0
- package/dist/core/result-aggregator.d.ts +96 -0
- package/dist/core/result-aggregator.d.ts.map +1 -0
- package/dist/core/result-aggregator.js +462 -0
- package/dist/core/result-aggregator.js.map +1 -0
- package/dist/index.d.ts +15 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +68 -0
- package/dist/index.js.map +1 -1
- package/dist/integrations/ci-integration.d.ts +227 -0
- package/dist/integrations/ci-integration.d.ts.map +1 -0
- package/dist/integrations/ci-integration.js +472 -0
- package/dist/integrations/ci-integration.js.map +1 -0
- package/dist/integrations/git-hooks.d.ts +155 -0
- package/dist/integrations/git-hooks.d.ts.map +1 -0
- package/dist/integrations/git-hooks.js +425 -0
- package/dist/integrations/git-hooks.js.map +1 -0
- package/dist/integrations/index.d.ts +9 -0
- package/dist/integrations/index.d.ts.map +1 -0
- package/dist/integrations/index.js +9 -0
- package/dist/integrations/index.js.map +1 -0
- package/dist/integrations/report-aggregator.d.ts +250 -0
- package/dist/integrations/report-aggregator.d.ts.map +1 -0
- package/dist/integrations/report-aggregator.js +488 -0
- package/dist/integrations/report-aggregator.js.map +1 -0
- package/dist/integrations/vscode-integration.d.ts +245 -0
- package/dist/integrations/vscode-integration.d.ts.map +1 -0
- package/dist/integrations/vscode-integration.js +449 -0
- package/dist/integrations/vscode-integration.js.map +1 -0
- package/dist/intelligence/attack-pattern-matcher.d.ts +217 -0
- package/dist/intelligence/attack-pattern-matcher.d.ts.map +1 -0
- package/dist/intelligence/attack-pattern-matcher.js +887 -0
- package/dist/intelligence/attack-pattern-matcher.js.map +1 -0
- package/dist/intelligence/index.d.ts +12 -0
- package/dist/intelligence/index.d.ts.map +1 -0
- package/dist/intelligence/index.js +18 -0
- package/dist/intelligence/index.js.map +1 -0
- package/dist/intelligence/neuro-symbolic-core.d.ts +88 -0
- package/dist/intelligence/neuro-symbolic-core.d.ts.map +1 -0
- package/dist/intelligence/neuro-symbolic-core.js +403 -0
- package/dist/intelligence/neuro-symbolic-core.js.map +1 -0
- package/dist/intelligence/predictive-analyzer.d.ts +317 -0
- package/dist/intelligence/predictive-analyzer.d.ts.map +1 -0
- package/dist/intelligence/predictive-analyzer.js +714 -0
- package/dist/intelligence/predictive-analyzer.js.map +1 -0
- package/dist/intelligence/risk-scorer.d.ts +333 -0
- package/dist/intelligence/risk-scorer.d.ts.map +1 -0
- package/dist/intelligence/risk-scorer.js +824 -0
- package/dist/intelligence/risk-scorer.js.map +1 -0
- package/dist/intelligence/security-analytics.d.ts +349 -0
- package/dist/intelligence/security-analytics.d.ts.map +1 -0
- package/dist/intelligence/security-analytics.js +813 -0
- package/dist/intelligence/security-analytics.js.map +1 -0
- package/dist/intelligence/threat-intelligence.d.ts +288 -0
- package/dist/intelligence/threat-intelligence.d.ts.map +1 -0
- package/dist/intelligence/threat-intelligence.js +639 -0
- package/dist/intelligence/threat-intelligence.js.map +1 -0
- package/dist/policy/index.d.ts +6 -0
- package/dist/policy/index.d.ts.map +1 -0
- package/dist/policy/index.js +6 -0
- package/dist/policy/index.js.map +1 -0
- package/dist/policy/policy-engine.d.ts +254 -0
- package/dist/policy/policy-engine.d.ts.map +1 -0
- package/dist/policy/policy-engine.js +651 -0
- package/dist/policy/policy-engine.js.map +1 -0
- package/dist/remediation/auto-fixer.d.ts +179 -0
- package/dist/remediation/auto-fixer.d.ts.map +1 -0
- package/dist/remediation/auto-fixer.js +540 -0
- package/dist/remediation/auto-fixer.js.map +1 -0
- package/dist/remediation/fix-validator.d.ts +195 -0
- package/dist/remediation/fix-validator.d.ts.map +1 -0
- package/dist/remediation/fix-validator.js +462 -0
- package/dist/remediation/fix-validator.js.map +1 -0
- package/dist/remediation/index.d.ts +10 -0
- package/dist/remediation/index.d.ts.map +1 -0
- package/dist/remediation/index.js +15 -0
- package/dist/remediation/index.js.map +1 -0
- package/dist/remediation/patch-generator.d.ts +203 -0
- package/dist/remediation/patch-generator.d.ts.map +1 -0
- package/dist/remediation/patch-generator.js +533 -0
- package/dist/remediation/patch-generator.js.map +1 -0
- package/dist/remediation/remediation-planner.d.ts +262 -0
- package/dist/remediation/remediation-planner.d.ts.map +1 -0
- package/dist/remediation/remediation-planner.js +531 -0
- package/dist/remediation/remediation-planner.js.map +1 -0
- package/dist/remediation/secure-code-transformer.d.ts +222 -0
- package/dist/remediation/secure-code-transformer.d.ts.map +1 -0
- package/dist/remediation/secure-code-transformer.js +625 -0
- package/dist/remediation/secure-code-transformer.js.map +1 -0
- package/dist/types/fix.d.ts +3 -1
- package/dist/types/fix.d.ts.map +1 -1
- package/dist/types/index.d.ts +6 -0
- package/dist/types/index.d.ts.map +1 -1
- package/dist/types/index.js +1 -0
- package/dist/types/index.js.map +1 -1
- package/dist/types/interprocedural.d.ts +203 -0
- package/dist/types/interprocedural.d.ts.map +1 -0
- package/dist/types/interprocedural.js +7 -0
- package/dist/types/interprocedural.js.map +1 -0
- package/dist/types/neuro-symbolic.d.ts +179 -0
- package/dist/types/neuro-symbolic.d.ts.map +1 -0
- package/dist/types/neuro-symbolic.js +7 -0
- package/dist/types/neuro-symbolic.js.map +1 -0
- package/dist/types/pipeline.d.ts +173 -0
- package/dist/types/pipeline.d.ts.map +1 -0
- package/dist/types/pipeline.js +7 -0
- package/dist/types/pipeline.js.map +1 -0
- package/dist/types/result.d.ts +134 -0
- package/dist/types/result.d.ts.map +1 -0
- package/dist/types/result.js +25 -0
- package/dist/types/result.js.map +1 -0
- package/dist/types/vulnerability.d.ts +2 -2
- package/dist/types/vulnerability.d.ts.map +1 -1
- package/dist/types/zero-day.d.ts +146 -0
- package/dist/types/zero-day.d.ts.map +1 -0
- package/dist/types/zero-day.js +7 -0
- package/dist/types/zero-day.js.map +1 -0
- package/package.json +2 -2
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview Core orchestration components
|
|
3
|
+
* @module @nahisaho/musubix-security/core
|
|
4
|
+
* @trace DES-SEC2-ORCH-001, DES-SEC2-ORCH-002, DES-SEC2-ORCH-003
|
|
5
|
+
*/
|
|
6
|
+
export { PipelineManager, createPipelineManager, createStandardPipeline, } from './pipeline-manager.js';
|
|
7
|
+
export { ResultAggregator, createResultAggregator, mergeSimilarByLocation, } from './result-aggregator.js';
|
|
8
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/core/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,EACL,eAAe,EACf,qBAAqB,EACrB,sBAAsB,GACvB,MAAM,uBAAuB,CAAC;AAG/B,OAAO,EACL,gBAAgB,EAChB,sBAAsB,EACtB,sBAAsB,GACvB,MAAM,wBAAwB,CAAC"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview Core orchestration components
|
|
3
|
+
* @module @nahisaho/musubix-security/core
|
|
4
|
+
* @trace DES-SEC2-ORCH-001, DES-SEC2-ORCH-002, DES-SEC2-ORCH-003
|
|
5
|
+
*/
|
|
6
|
+
// Pipeline Manager
|
|
7
|
+
export { PipelineManager, createPipelineManager, createStandardPipeline, } from './pipeline-manager.js';
|
|
8
|
+
// Result Aggregator
|
|
9
|
+
export { ResultAggregator, createResultAggregator, mergeSimilarByLocation, } from './result-aggregator.js';
|
|
10
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/core/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,mBAAmB;AACnB,OAAO,EACL,eAAe,EACf,qBAAqB,EACrB,sBAAsB,GACvB,MAAM,uBAAuB,CAAC;AAE/B,oBAAoB;AACpB,OAAO,EACL,gBAAgB,EAChB,sBAAsB,EACtB,sBAAsB,GACvB,MAAM,wBAAwB,CAAC"}
|
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview Pipeline Manager - orchestrates security analysis pipelines
|
|
3
|
+
* @module @nahisaho/musubix-security/core/pipeline-manager
|
|
4
|
+
* @trace DES-SEC2-ORCH-002, REQ-SEC2-PERF-001
|
|
5
|
+
*/
|
|
6
|
+
import type { Pipeline, PipelineConfig, PipelineResult, PipelineProgress, IPipelineManager, AnalyzerType, AnalyzerInstance } from '../types/index.js';
|
|
7
|
+
/**
|
|
8
|
+
* Analyzer factory for creating analyzer instances
|
|
9
|
+
*/
|
|
10
|
+
type AnalyzerFactory = () => AnalyzerInstance;
|
|
11
|
+
/**
|
|
12
|
+
* Pipeline Manager implementation
|
|
13
|
+
* @trace DES-SEC2-ORCH-002
|
|
14
|
+
*/
|
|
15
|
+
export declare class PipelineManager implements IPipelineManager {
|
|
16
|
+
private runningPipelines;
|
|
17
|
+
private analyzerFactories;
|
|
18
|
+
constructor();
|
|
19
|
+
/**
|
|
20
|
+
* Register a custom analyzer factory
|
|
21
|
+
*/
|
|
22
|
+
registerAnalyzer(type: AnalyzerType, factory: AnalyzerFactory): void;
|
|
23
|
+
/**
|
|
24
|
+
* Create a new pipeline from configuration
|
|
25
|
+
* @trace DES-SEC2-ORCH-002
|
|
26
|
+
*/
|
|
27
|
+
createPipeline(config: PipelineConfig): Pipeline;
|
|
28
|
+
/**
|
|
29
|
+
* Execute multiple pipelines in parallel
|
|
30
|
+
* @trace REQ-SEC2-PERF-001
|
|
31
|
+
*/
|
|
32
|
+
executeParallel(pipelines: Pipeline[]): Promise<PipelineResult[]>;
|
|
33
|
+
/**
|
|
34
|
+
* Execute a single pipeline sequentially
|
|
35
|
+
*/
|
|
36
|
+
executeSequential(pipeline: Pipeline): Promise<PipelineResult>;
|
|
37
|
+
/**
|
|
38
|
+
* Cancel a running pipeline
|
|
39
|
+
*/
|
|
40
|
+
cancel(pipelineId: string): void;
|
|
41
|
+
/**
|
|
42
|
+
* Get current pipeline status
|
|
43
|
+
*/
|
|
44
|
+
getStatus(pipelineId: string): PipelineProgress | undefined;
|
|
45
|
+
/**
|
|
46
|
+
* Execute a pipeline with dependency resolution
|
|
47
|
+
*/
|
|
48
|
+
private executePipeline;
|
|
49
|
+
/**
|
|
50
|
+
* Resolve stage dependencies and return execution order
|
|
51
|
+
*/
|
|
52
|
+
private resolveDependencies;
|
|
53
|
+
/**
|
|
54
|
+
* Execute stages respecting dependencies with parallel execution
|
|
55
|
+
*/
|
|
56
|
+
private executeStagesWithDependencies;
|
|
57
|
+
/**
|
|
58
|
+
* Execute a single stage
|
|
59
|
+
*/
|
|
60
|
+
private executeStage;
|
|
61
|
+
/**
|
|
62
|
+
* Run analyzer based on type
|
|
63
|
+
*/
|
|
64
|
+
private runAnalyzer;
|
|
65
|
+
/**
|
|
66
|
+
* Create timeout promise
|
|
67
|
+
*/
|
|
68
|
+
private createTimeout;
|
|
69
|
+
/**
|
|
70
|
+
* Skip stages that depend on a failed stage
|
|
71
|
+
*/
|
|
72
|
+
private skipDependentStages;
|
|
73
|
+
/**
|
|
74
|
+
* Calculate current progress
|
|
75
|
+
*/
|
|
76
|
+
private calculateProgress;
|
|
77
|
+
/**
|
|
78
|
+
* Notify progress callback
|
|
79
|
+
*/
|
|
80
|
+
private notifyProgress;
|
|
81
|
+
/**
|
|
82
|
+
* Build final pipeline result
|
|
83
|
+
*/
|
|
84
|
+
private buildResult;
|
|
85
|
+
/**
|
|
86
|
+
* Split array into chunks
|
|
87
|
+
*/
|
|
88
|
+
private chunkArray;
|
|
89
|
+
}
|
|
90
|
+
/**
|
|
91
|
+
* Create a default pipeline manager instance
|
|
92
|
+
*/
|
|
93
|
+
export declare function createPipelineManager(): PipelineManager;
|
|
94
|
+
/**
|
|
95
|
+
* Create a standard security scan pipeline
|
|
96
|
+
* @trace REQ-SEC2-CLI-001
|
|
97
|
+
*/
|
|
98
|
+
export declare function createStandardPipeline(targets: string[], options?: {
|
|
99
|
+
vulnerabilities?: boolean;
|
|
100
|
+
taint?: boolean;
|
|
101
|
+
secrets?: boolean;
|
|
102
|
+
dependencies?: boolean;
|
|
103
|
+
}): PipelineConfig;
|
|
104
|
+
export {};
|
|
105
|
+
//# sourceMappingURL=pipeline-manager.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pipeline-manager.d.ts","sourceRoot":"","sources":["../../src/core/pipeline-manager.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,KAAK,EACV,QAAQ,EACR,cAAc,EACd,cAAc,EACd,gBAAgB,EAIhB,gBAAgB,EAEhB,YAAY,EACZ,gBAAgB,EAEjB,MAAM,mBAAmB,CAAC;AAqB3B;;GAEG;AACH,KAAK,eAAe,GAAG,MAAM,gBAAgB,CAAC;AAE9C;;;GAGG;AACH,qBAAa,eAAgB,YAAW,gBAAgB;IACtD,OAAO,CAAC,gBAAgB,CAA2C;IACnE,OAAO,CAAC,iBAAiB,CAAqC;;IAyC9D;;OAEG;IACH,gBAAgB,CAAC,IAAI,EAAE,YAAY,EAAE,OAAO,EAAE,eAAe,GAAG,IAAI;IAIpE;;;OAGG;IACH,cAAc,CAAC,MAAM,EAAE,cAAc,GAAG,QAAQ;IAwBhD;;;OAGG;IACG,eAAe,CAAC,SAAS,EAAE,QAAQ,EAAE,GAAG,OAAO,CAAC,cAAc,EAAE,CAAC;IAYvE;;OAEG;IACG,iBAAiB,CAAC,QAAQ,EAAE,QAAQ,GAAG,OAAO,CAAC,cAAc,CAAC;IAQpE;;OAEG;IACH,MAAM,CAAC,UAAU,EAAE,MAAM,GAAG,IAAI;IAehC;;OAEG;IACH,SAAS,CAAC,UAAU,EAAE,MAAM,GAAG,gBAAgB,GAAG,SAAS;IAO3D;;OAEG;YACW,eAAe;IAsC7B;;OAEG;IACH,OAAO,CAAC,mBAAmB;IAiC3B;;OAEG;YACW,6BAA6B;IAuB3C;;OAEG;YACW,YAAY;IAyE1B;;OAEG;YACW,WAAW;IA0BzB;;OAEG;IACH,OAAO,CAAC,aAAa;IAQrB;;OAEG;IACH,OAAO,CAAC,mBAAmB;IAY3B;;OAEG;IACH,OAAO,CAAC,iBAAiB;IA2BzB;;OAEG;IACH,OAAO,CAAC,cAAc;IAMtB;;OAEG;IACH,OAAO,CAAC,WAAW;IAqCnB;;OAEG;IACH,OAAO,CAAC,UAAU;CAOnB;AAED;;GAEG;AACH,wBAAgB,qBAAqB,IAAI,eAAe,CAEvD;AAED;;;GAGG;AACH,wBAAgB,sBAAsB,CACpC,OAAO,EAAE,MAAM,EAAE,EACjB,OAAO,GAAE;IACP,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,YAAY,CAAC,EAAE,OAAO,CAAC;CACnB,GACL,cAAc,CA6ChB"}
|
|
@@ -0,0 +1,449 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview Pipeline Manager - orchestrates security analysis pipelines
|
|
3
|
+
* @module @nahisaho/musubix-security/core/pipeline-manager
|
|
4
|
+
* @trace DES-SEC2-ORCH-002, REQ-SEC2-PERF-001
|
|
5
|
+
*/
|
|
6
|
+
import { randomUUID } from 'node:crypto';
|
|
7
|
+
import { VulnerabilityScanner } from '../analysis/index.js';
|
|
8
|
+
import { TaintAnalyzer } from '../analysis/index.js';
|
|
9
|
+
import { SecretDetector } from '../analysis/index.js';
|
|
10
|
+
import { DependencyAuditor } from '../analysis/index.js';
|
|
11
|
+
/**
|
|
12
|
+
* Pipeline Manager implementation
|
|
13
|
+
* @trace DES-SEC2-ORCH-002
|
|
14
|
+
*/
|
|
15
|
+
export class PipelineManager {
|
|
16
|
+
runningPipelines = new Map();
|
|
17
|
+
analyzerFactories;
|
|
18
|
+
constructor() {
|
|
19
|
+
// Initialize analyzer factories with explicit typing
|
|
20
|
+
// Wrap existing analyzers to conform to AnalyzerInstance interface
|
|
21
|
+
const factories = [
|
|
22
|
+
['vulnerability-scanner', () => {
|
|
23
|
+
const scanner = new VulnerabilityScanner();
|
|
24
|
+
return {
|
|
25
|
+
scan: async (path, options) => scanner.scanDirectory(path, options),
|
|
26
|
+
};
|
|
27
|
+
}],
|
|
28
|
+
['taint-tracker', () => {
|
|
29
|
+
const analyzer = new TaintAnalyzer();
|
|
30
|
+
return {
|
|
31
|
+
analyze: async (path, _options) => analyzer.analyzeFile(path),
|
|
32
|
+
};
|
|
33
|
+
}],
|
|
34
|
+
['secret-detector', () => {
|
|
35
|
+
const detector = new SecretDetector();
|
|
36
|
+
return {
|
|
37
|
+
detect: async (path, _options) => detector.scan(path),
|
|
38
|
+
};
|
|
39
|
+
}],
|
|
40
|
+
['dependency-auditor', () => {
|
|
41
|
+
const auditor = new DependencyAuditor();
|
|
42
|
+
return {
|
|
43
|
+
audit: async (path, _options) => auditor.audit(path),
|
|
44
|
+
};
|
|
45
|
+
}],
|
|
46
|
+
// Placeholders for new analyzers (to be implemented in Phase 2)
|
|
47
|
+
['image-scanner', () => ({ scan: async () => ({ vulnerabilities: [] }) })],
|
|
48
|
+
['iac-checker', () => ({ analyze: async () => ({ issues: [] }) })],
|
|
49
|
+
['prompt-injection-detector', () => ({ detect: async () => ({ findings: [] }) })],
|
|
50
|
+
['compliance-validator', () => ({ validate: async () => ({ compliant: true }) })],
|
|
51
|
+
['zero-day-detector', () => ({ detect: async () => ({ candidates: [] }) })],
|
|
52
|
+
['interprocedural-analyzer', () => ({ analyze: async () => ({ callGraph: { nodes: [], edges: [], roots: [], leaves: [] } }) })],
|
|
53
|
+
];
|
|
54
|
+
this.analyzerFactories = new Map(factories);
|
|
55
|
+
}
|
|
56
|
+
/**
|
|
57
|
+
* Register a custom analyzer factory
|
|
58
|
+
*/
|
|
59
|
+
registerAnalyzer(type, factory) {
|
|
60
|
+
this.analyzerFactories.set(type, factory);
|
|
61
|
+
}
|
|
62
|
+
/**
|
|
63
|
+
* Create a new pipeline from configuration
|
|
64
|
+
* @trace DES-SEC2-ORCH-002
|
|
65
|
+
*/
|
|
66
|
+
createPipeline(config) {
|
|
67
|
+
const id = randomUUID();
|
|
68
|
+
const context = {
|
|
69
|
+
id,
|
|
70
|
+
config,
|
|
71
|
+
status: 'pending',
|
|
72
|
+
stageStatuses: new Map(config.stages.map(s => [s.id, 'pending'])),
|
|
73
|
+
stageResults: new Map(),
|
|
74
|
+
cancelled: false,
|
|
75
|
+
};
|
|
76
|
+
this.runningPipelines.set(id, context);
|
|
77
|
+
const pipeline = {
|
|
78
|
+
id,
|
|
79
|
+
config,
|
|
80
|
+
execute: () => this.executePipeline(context),
|
|
81
|
+
cancel: () => this.cancel(id),
|
|
82
|
+
};
|
|
83
|
+
return pipeline;
|
|
84
|
+
}
|
|
85
|
+
/**
|
|
86
|
+
* Execute multiple pipelines in parallel
|
|
87
|
+
* @trace REQ-SEC2-PERF-001
|
|
88
|
+
*/
|
|
89
|
+
async executeParallel(pipelines) {
|
|
90
|
+
const promises = pipelines.map(p => {
|
|
91
|
+
const context = this.runningPipelines.get(p.id);
|
|
92
|
+
if (!context) {
|
|
93
|
+
throw new Error(`Pipeline ${p.id} not found`);
|
|
94
|
+
}
|
|
95
|
+
return this.executePipeline(context);
|
|
96
|
+
});
|
|
97
|
+
return Promise.all(promises);
|
|
98
|
+
}
|
|
99
|
+
/**
|
|
100
|
+
* Execute a single pipeline sequentially
|
|
101
|
+
*/
|
|
102
|
+
async executeSequential(pipeline) {
|
|
103
|
+
const context = this.runningPipelines.get(pipeline.id);
|
|
104
|
+
if (!context) {
|
|
105
|
+
throw new Error(`Pipeline ${pipeline.id} not found`);
|
|
106
|
+
}
|
|
107
|
+
return this.executePipeline(context);
|
|
108
|
+
}
|
|
109
|
+
/**
|
|
110
|
+
* Cancel a running pipeline
|
|
111
|
+
*/
|
|
112
|
+
cancel(pipelineId) {
|
|
113
|
+
const context = this.runningPipelines.get(pipelineId);
|
|
114
|
+
if (context) {
|
|
115
|
+
context.cancelled = true;
|
|
116
|
+
context.status = 'cancelled';
|
|
117
|
+
// Mark pending stages as cancelled
|
|
118
|
+
for (const [stageId, status] of context.stageStatuses) {
|
|
119
|
+
if (status === 'pending' || status === 'running') {
|
|
120
|
+
context.stageStatuses.set(stageId, 'cancelled');
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
/**
|
|
126
|
+
* Get current pipeline status
|
|
127
|
+
*/
|
|
128
|
+
getStatus(pipelineId) {
|
|
129
|
+
const context = this.runningPipelines.get(pipelineId);
|
|
130
|
+
if (!context)
|
|
131
|
+
return undefined;
|
|
132
|
+
return this.calculateProgress(context);
|
|
133
|
+
}
|
|
134
|
+
/**
|
|
135
|
+
* Execute a pipeline with dependency resolution
|
|
136
|
+
*/
|
|
137
|
+
async executePipeline(context) {
|
|
138
|
+
context.startTime = new Date();
|
|
139
|
+
context.status = 'running';
|
|
140
|
+
try {
|
|
141
|
+
// Build dependency graph
|
|
142
|
+
const stageOrder = this.resolveDependencies(context.config.stages);
|
|
143
|
+
// Execute stages respecting dependencies
|
|
144
|
+
const maxParallel = context.config.maxParallel ?? 4;
|
|
145
|
+
await this.executeStagesWithDependencies(context, stageOrder, maxParallel);
|
|
146
|
+
// Determine final status
|
|
147
|
+
const hasFailures = Array.from(context.stageStatuses.values())
|
|
148
|
+
.some(s => s === 'failed');
|
|
149
|
+
context.status = context.cancelled ? 'cancelled' :
|
|
150
|
+
hasFailures ? 'failed' : 'completed';
|
|
151
|
+
}
|
|
152
|
+
catch (error) {
|
|
153
|
+
// Rethrow circular dependency errors
|
|
154
|
+
if (error instanceof Error && error.message.includes('Circular dependency')) {
|
|
155
|
+
throw error;
|
|
156
|
+
}
|
|
157
|
+
context.status = 'failed';
|
|
158
|
+
}
|
|
159
|
+
context.endTime = new Date();
|
|
160
|
+
// Build result
|
|
161
|
+
const result = this.buildResult(context);
|
|
162
|
+
// Cleanup
|
|
163
|
+
this.runningPipelines.delete(context.id);
|
|
164
|
+
return result;
|
|
165
|
+
}
|
|
166
|
+
/**
|
|
167
|
+
* Resolve stage dependencies and return execution order
|
|
168
|
+
*/
|
|
169
|
+
resolveDependencies(stages) {
|
|
170
|
+
const levels = [];
|
|
171
|
+
const resolved = new Set();
|
|
172
|
+
while (resolved.size < stages.length) {
|
|
173
|
+
const level = [];
|
|
174
|
+
for (const stage of stages) {
|
|
175
|
+
if (resolved.has(stage.id))
|
|
176
|
+
continue;
|
|
177
|
+
const deps = stage.dependsOn ?? [];
|
|
178
|
+
const allDepsResolved = deps.every(d => resolved.has(d));
|
|
179
|
+
if (allDepsResolved) {
|
|
180
|
+
level.push(stage);
|
|
181
|
+
}
|
|
182
|
+
}
|
|
183
|
+
if (level.length === 0 && resolved.size < stages.length) {
|
|
184
|
+
// Circular dependency detected
|
|
185
|
+
throw new Error('Circular dependency detected in pipeline stages');
|
|
186
|
+
}
|
|
187
|
+
for (const stage of level) {
|
|
188
|
+
resolved.add(stage.id);
|
|
189
|
+
}
|
|
190
|
+
levels.push(level);
|
|
191
|
+
}
|
|
192
|
+
return levels;
|
|
193
|
+
}
|
|
194
|
+
/**
|
|
195
|
+
* Execute stages respecting dependencies with parallel execution
|
|
196
|
+
*/
|
|
197
|
+
async executeStagesWithDependencies(context, stageOrder, maxParallel) {
|
|
198
|
+
for (const level of stageOrder) {
|
|
199
|
+
if (context.cancelled)
|
|
200
|
+
break;
|
|
201
|
+
// Execute stages in this level in parallel (up to maxParallel)
|
|
202
|
+
const chunks = this.chunkArray(level, maxParallel);
|
|
203
|
+
for (const chunk of chunks) {
|
|
204
|
+
if (context.cancelled)
|
|
205
|
+
break;
|
|
206
|
+
await Promise.all(chunk.map(stage => this.executeStage(context, stage)));
|
|
207
|
+
this.notifyProgress(context);
|
|
208
|
+
}
|
|
209
|
+
}
|
|
210
|
+
}
|
|
211
|
+
/**
|
|
212
|
+
* Execute a single stage
|
|
213
|
+
*/
|
|
214
|
+
async executeStage(context, stage) {
|
|
215
|
+
if (context.cancelled) {
|
|
216
|
+
context.stageStatuses.set(stage.id, 'cancelled');
|
|
217
|
+
return;
|
|
218
|
+
}
|
|
219
|
+
context.stageStatuses.set(stage.id, 'running');
|
|
220
|
+
const startTime = new Date();
|
|
221
|
+
try {
|
|
222
|
+
const factory = this.analyzerFactories.get(stage.analyzer);
|
|
223
|
+
if (!factory) {
|
|
224
|
+
throw new Error(`Unknown analyzer type: ${stage.analyzer}`);
|
|
225
|
+
}
|
|
226
|
+
const analyzer = factory();
|
|
227
|
+
let result;
|
|
228
|
+
// Execute with timeout if specified
|
|
229
|
+
const timeout = stage.timeout ?? context.config.timeout ?? 300000; // 5 min default
|
|
230
|
+
const executePromise = this.runAnalyzer(analyzer, stage.analyzer, context.config.targets, stage.options);
|
|
231
|
+
result = await Promise.race([
|
|
232
|
+
executePromise,
|
|
233
|
+
this.createTimeout(timeout, stage.id),
|
|
234
|
+
]);
|
|
235
|
+
const endTime = new Date();
|
|
236
|
+
const stageResult = {
|
|
237
|
+
stageId: stage.id,
|
|
238
|
+
status: 'completed',
|
|
239
|
+
duration: endTime.getTime() - startTime.getTime(),
|
|
240
|
+
data: result,
|
|
241
|
+
startedAt: startTime,
|
|
242
|
+
endedAt: endTime,
|
|
243
|
+
};
|
|
244
|
+
context.stageResults.set(stage.id, stageResult);
|
|
245
|
+
context.stageStatuses.set(stage.id, 'completed');
|
|
246
|
+
}
|
|
247
|
+
catch (error) {
|
|
248
|
+
const endTime = new Date();
|
|
249
|
+
const stageResult = {
|
|
250
|
+
stageId: stage.id,
|
|
251
|
+
status: 'failed',
|
|
252
|
+
duration: endTime.getTime() - startTime.getTime(),
|
|
253
|
+
error: error instanceof Error ? error : new Error(String(error)),
|
|
254
|
+
startedAt: startTime,
|
|
255
|
+
endedAt: endTime,
|
|
256
|
+
};
|
|
257
|
+
context.stageResults.set(stage.id, stageResult);
|
|
258
|
+
context.stageStatuses.set(stage.id, 'failed');
|
|
259
|
+
// Check if we should continue on failure
|
|
260
|
+
if (!stage.continueOnFailure) {
|
|
261
|
+
// Mark dependent stages as skipped
|
|
262
|
+
this.skipDependentStages(context, stage.id);
|
|
263
|
+
}
|
|
264
|
+
}
|
|
265
|
+
}
|
|
266
|
+
/**
|
|
267
|
+
* Run analyzer based on type
|
|
268
|
+
*/
|
|
269
|
+
async runAnalyzer(analyzer, type, targets, options) {
|
|
270
|
+
const target = targets[0] ?? '.'; // Use first target or current directory
|
|
271
|
+
switch (type) {
|
|
272
|
+
case 'vulnerability-scanner':
|
|
273
|
+
return analyzer.scan?.(target, options);
|
|
274
|
+
case 'taint-tracker':
|
|
275
|
+
return analyzer.analyze?.(target, options);
|
|
276
|
+
case 'secret-detector':
|
|
277
|
+
return analyzer.detect?.(target, options);
|
|
278
|
+
case 'dependency-auditor':
|
|
279
|
+
return analyzer.audit?.(target, options);
|
|
280
|
+
default:
|
|
281
|
+
// Generic execution for other analyzers
|
|
282
|
+
if (analyzer.scan)
|
|
283
|
+
return analyzer.scan(target, options);
|
|
284
|
+
if (analyzer.analyze)
|
|
285
|
+
return analyzer.analyze(target, options);
|
|
286
|
+
if (analyzer.detect)
|
|
287
|
+
return analyzer.detect(target, options);
|
|
288
|
+
throw new Error(`Analyzer ${type} does not have a known execution method`);
|
|
289
|
+
}
|
|
290
|
+
}
|
|
291
|
+
/**
|
|
292
|
+
* Create timeout promise
|
|
293
|
+
*/
|
|
294
|
+
createTimeout(ms, stageId) {
|
|
295
|
+
return new Promise((_, reject) => {
|
|
296
|
+
setTimeout(() => {
|
|
297
|
+
reject(new Error(`Stage ${stageId} timed out after ${ms}ms`));
|
|
298
|
+
}, ms);
|
|
299
|
+
});
|
|
300
|
+
}
|
|
301
|
+
/**
|
|
302
|
+
* Skip stages that depend on a failed stage
|
|
303
|
+
*/
|
|
304
|
+
skipDependentStages(context, failedStageId) {
|
|
305
|
+
for (const stage of context.config.stages) {
|
|
306
|
+
if (stage.dependsOn?.includes(failedStageId)) {
|
|
307
|
+
if (context.stageStatuses.get(stage.id) === 'pending') {
|
|
308
|
+
context.stageStatuses.set(stage.id, 'skipped');
|
|
309
|
+
// Recursively skip dependent stages
|
|
310
|
+
this.skipDependentStages(context, stage.id);
|
|
311
|
+
}
|
|
312
|
+
}
|
|
313
|
+
}
|
|
314
|
+
}
|
|
315
|
+
/**
|
|
316
|
+
* Calculate current progress
|
|
317
|
+
*/
|
|
318
|
+
calculateProgress(context) {
|
|
319
|
+
const total = context.config.stages.length;
|
|
320
|
+
const completed = Array.from(context.stageStatuses.values())
|
|
321
|
+
.filter(s => s === 'completed' || s === 'failed' || s === 'skipped' || s === 'cancelled')
|
|
322
|
+
.length;
|
|
323
|
+
const runningStages = Array.from(context.stageStatuses.entries())
|
|
324
|
+
.filter(([_, status]) => status === 'running')
|
|
325
|
+
.map(([id]) => id);
|
|
326
|
+
const completedStages = Array.from(context.stageStatuses.entries())
|
|
327
|
+
.filter(([_, status]) => status === 'completed')
|
|
328
|
+
.map(([id]) => id);
|
|
329
|
+
const failedStages = Array.from(context.stageStatuses.entries())
|
|
330
|
+
.filter(([_, status]) => status === 'failed')
|
|
331
|
+
.map(([id]) => id);
|
|
332
|
+
return {
|
|
333
|
+
pipelineId: context.id,
|
|
334
|
+
percentage: Math.round((completed / total) * 100),
|
|
335
|
+
runningStages,
|
|
336
|
+
completedStages,
|
|
337
|
+
failedStages,
|
|
338
|
+
};
|
|
339
|
+
}
|
|
340
|
+
/**
|
|
341
|
+
* Notify progress callback
|
|
342
|
+
*/
|
|
343
|
+
notifyProgress(context) {
|
|
344
|
+
if (context.onProgress) {
|
|
345
|
+
context.onProgress(this.calculateProgress(context));
|
|
346
|
+
}
|
|
347
|
+
}
|
|
348
|
+
/**
|
|
349
|
+
* Build final pipeline result
|
|
350
|
+
*/
|
|
351
|
+
buildResult(context) {
|
|
352
|
+
const stageResults = Array.from(context.stageResults.values());
|
|
353
|
+
const statusCounts = {
|
|
354
|
+
completed: 0,
|
|
355
|
+
failed: 0,
|
|
356
|
+
skipped: 0,
|
|
357
|
+
cancelled: 0,
|
|
358
|
+
};
|
|
359
|
+
for (const status of context.stageStatuses.values()) {
|
|
360
|
+
if (status === 'completed')
|
|
361
|
+
statusCounts.completed++;
|
|
362
|
+
else if (status === 'failed')
|
|
363
|
+
statusCounts.failed++;
|
|
364
|
+
else if (status === 'skipped')
|
|
365
|
+
statusCounts.skipped++;
|
|
366
|
+
else if (status === 'cancelled')
|
|
367
|
+
statusCounts.cancelled++;
|
|
368
|
+
}
|
|
369
|
+
const endTime = context.endTime ?? new Date();
|
|
370
|
+
const startTime = context.startTime ?? endTime;
|
|
371
|
+
return {
|
|
372
|
+
pipelineId: context.id,
|
|
373
|
+
status: context.cancelled ? 'cancelled' :
|
|
374
|
+
statusCounts.failed > 0 ? 'failed' : 'completed',
|
|
375
|
+
stageResults,
|
|
376
|
+
duration: endTime.getTime() - startTime.getTime(),
|
|
377
|
+
startedAt: startTime,
|
|
378
|
+
endedAt: endTime,
|
|
379
|
+
summary: {
|
|
380
|
+
totalStages: context.config.stages.length,
|
|
381
|
+
completedStages: statusCounts.completed,
|
|
382
|
+
failedStages: statusCounts.failed,
|
|
383
|
+
skippedStages: statusCounts.skipped + statusCounts.cancelled,
|
|
384
|
+
},
|
|
385
|
+
};
|
|
386
|
+
}
|
|
387
|
+
/**
|
|
388
|
+
* Split array into chunks
|
|
389
|
+
*/
|
|
390
|
+
chunkArray(array, size) {
|
|
391
|
+
const chunks = [];
|
|
392
|
+
for (let i = 0; i < array.length; i += size) {
|
|
393
|
+
chunks.push(array.slice(i, i + size));
|
|
394
|
+
}
|
|
395
|
+
return chunks;
|
|
396
|
+
}
|
|
397
|
+
}
|
|
398
|
+
/**
|
|
399
|
+
* Create a default pipeline manager instance
|
|
400
|
+
*/
|
|
401
|
+
export function createPipelineManager() {
|
|
402
|
+
return new PipelineManager();
|
|
403
|
+
}
|
|
404
|
+
/**
|
|
405
|
+
* Create a standard security scan pipeline
|
|
406
|
+
* @trace REQ-SEC2-CLI-001
|
|
407
|
+
*/
|
|
408
|
+
export function createStandardPipeline(targets, options = {}) {
|
|
409
|
+
const stages = [];
|
|
410
|
+
if (options.vulnerabilities !== false) {
|
|
411
|
+
stages.push({
|
|
412
|
+
id: 'vuln-scan',
|
|
413
|
+
name: 'Vulnerability Scan',
|
|
414
|
+
analyzer: 'vulnerability-scanner',
|
|
415
|
+
options: {},
|
|
416
|
+
});
|
|
417
|
+
}
|
|
418
|
+
if (options.taint !== false) {
|
|
419
|
+
stages.push({
|
|
420
|
+
id: 'taint-analysis',
|
|
421
|
+
name: 'Taint Analysis',
|
|
422
|
+
analyzer: 'taint-tracker',
|
|
423
|
+
options: {},
|
|
424
|
+
});
|
|
425
|
+
}
|
|
426
|
+
if (options.secrets !== false) {
|
|
427
|
+
stages.push({
|
|
428
|
+
id: 'secret-detection',
|
|
429
|
+
name: 'Secret Detection',
|
|
430
|
+
analyzer: 'secret-detector',
|
|
431
|
+
options: {},
|
|
432
|
+
});
|
|
433
|
+
}
|
|
434
|
+
if (options.dependencies !== false) {
|
|
435
|
+
stages.push({
|
|
436
|
+
id: 'dep-audit',
|
|
437
|
+
name: 'Dependency Audit',
|
|
438
|
+
analyzer: 'dependency-auditor',
|
|
439
|
+
options: {},
|
|
440
|
+
});
|
|
441
|
+
}
|
|
442
|
+
return {
|
|
443
|
+
stages,
|
|
444
|
+
targets,
|
|
445
|
+
maxParallel: 4,
|
|
446
|
+
cache: true,
|
|
447
|
+
};
|
|
448
|
+
}
|
|
449
|
+
//# sourceMappingURL=pipeline-manager.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pipeline-manager.js","sourceRoot":"","sources":["../../src/core/pipeline-manager.ts"],"names":[],"mappings":"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"}
|