@skillsmith/core 0.1.2 → 0.2.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/dist/.tsbuildinfo +1 -1
- package/dist/src/analysis/CodebaseAnalyzer.d.ts +4 -134
- package/dist/src/analysis/CodebaseAnalyzer.d.ts.map +1 -1
- package/dist/src/analysis/CodebaseAnalyzer.js +7 -315
- package/dist/src/analysis/CodebaseAnalyzer.js.map +1 -1
- package/dist/src/analysis/framework-detector.d.ts +47 -0
- package/dist/src/analysis/framework-detector.d.ts.map +1 -0
- package/dist/src/analysis/framework-detector.js +151 -0
- package/dist/src/analysis/framework-detector.js.map +1 -0
- package/dist/src/analysis/index.d.ts +6 -1
- package/dist/src/analysis/index.d.ts.map +1 -1
- package/dist/src/analysis/index.js +10 -1
- package/dist/src/analysis/index.js.map +1 -1
- package/dist/src/analysis/parsers.d.ts +43 -0
- package/dist/src/analysis/parsers.d.ts.map +1 -0
- package/dist/src/analysis/parsers.js +219 -0
- package/dist/src/analysis/parsers.js.map +1 -0
- package/dist/src/analysis/types.d.ts +138 -0
- package/dist/src/analysis/types.d.ts.map +1 -0
- package/dist/src/analysis/types.js +25 -0
- package/dist/src/analysis/types.js.map +1 -0
- package/dist/src/analytics/AnalyticsRepository.d.ts.map +1 -1
- package/dist/src/analytics/AnalyticsRepository.js +4 -4
- package/dist/src/analytics/AnalyticsRepository.js.map +1 -1
- package/dist/src/api/cache.d.ts +108 -0
- package/dist/src/api/cache.d.ts.map +1 -0
- package/dist/src/api/cache.js +216 -0
- package/dist/src/api/cache.js.map +1 -0
- package/dist/src/api/client.d.ts +152 -0
- package/dist/src/api/client.d.ts.map +1 -0
- package/dist/src/api/client.js +221 -0
- package/dist/src/api/client.js.map +1 -0
- package/dist/src/api/index.d.ts +10 -0
- package/dist/src/api/index.d.ts.map +1 -0
- package/dist/src/api/index.js +10 -0
- package/dist/src/api/index.js.map +1 -0
- package/dist/src/benchmarks/BenchmarkRunner.d.ts +6 -175
- package/dist/src/benchmarks/BenchmarkRunner.d.ts.map +1 -1
- package/dist/src/benchmarks/BenchmarkRunner.js +6 -123
- package/dist/src/benchmarks/BenchmarkRunner.js.map +1 -1
- package/dist/src/benchmarks/MemoryProfiler.d.ts +4 -262
- package/dist/src/benchmarks/MemoryProfiler.d.ts.map +1 -1
- package/dist/src/benchmarks/MemoryProfiler.js +4 -400
- package/dist/src/benchmarks/MemoryProfiler.js.map +1 -1
- package/dist/src/benchmarks/comparator.d.ts +38 -0
- package/dist/src/benchmarks/comparator.d.ts.map +1 -0
- package/dist/src/benchmarks/comparator.js +81 -0
- package/dist/src/benchmarks/comparator.js.map +1 -0
- package/dist/src/benchmarks/formatters.d.ts +30 -0
- package/dist/src/benchmarks/formatters.d.ts.map +1 -0
- package/dist/src/benchmarks/formatters.js +88 -0
- package/dist/src/benchmarks/formatters.js.map +1 -0
- package/dist/src/benchmarks/index.d.ts +5 -1
- package/dist/src/benchmarks/index.d.ts.map +1 -1
- package/dist/src/benchmarks/index.js +9 -2
- package/dist/src/benchmarks/index.js.map +1 -1
- package/dist/src/benchmarks/memory/MemoryProfiler.d.ts +165 -0
- package/dist/src/benchmarks/memory/MemoryProfiler.d.ts.map +1 -0
- package/dist/src/benchmarks/memory/MemoryProfiler.js +312 -0
- package/dist/src/benchmarks/memory/MemoryProfiler.js.map +1 -0
- package/dist/src/benchmarks/memory/baseline-manager.d.ts +64 -0
- package/dist/src/benchmarks/memory/baseline-manager.d.ts.map +1 -0
- package/dist/src/benchmarks/memory/baseline-manager.js +95 -0
- package/dist/src/benchmarks/memory/baseline-manager.js.map +1 -0
- package/dist/src/benchmarks/memory/index.d.ts +12 -0
- package/dist/src/benchmarks/memory/index.d.ts.map +1 -0
- package/dist/src/benchmarks/memory/index.js +12 -0
- package/dist/src/benchmarks/memory/index.js.map +1 -0
- package/dist/src/benchmarks/memory/leak-detector.d.ts +23 -0
- package/dist/src/benchmarks/memory/leak-detector.d.ts.map +1 -0
- package/dist/src/benchmarks/memory/leak-detector.js +46 -0
- package/dist/src/benchmarks/memory/leak-detector.js.map +1 -0
- package/dist/src/benchmarks/memory/regression-detector.d.ts +17 -0
- package/dist/src/benchmarks/memory/regression-detector.d.ts.map +1 -0
- package/dist/src/benchmarks/memory/regression-detector.js +56 -0
- package/dist/src/benchmarks/memory/regression-detector.js.map +1 -0
- package/dist/src/benchmarks/memory/types.d.ts +111 -0
- package/dist/src/benchmarks/memory/types.d.ts.map +1 -0
- package/dist/src/benchmarks/memory/types.js +7 -0
- package/dist/src/benchmarks/memory/types.js.map +1 -0
- package/dist/src/benchmarks/memory/utils.d.ts +17 -0
- package/dist/src/benchmarks/memory/utils.d.ts.map +1 -0
- package/dist/src/benchmarks/memory/utils.js +29 -0
- package/dist/src/benchmarks/memory/utils.js.map +1 -0
- package/dist/src/benchmarks/types.d.ts +175 -0
- package/dist/src/benchmarks/types.d.ts.map +1 -0
- package/dist/src/benchmarks/types.js +20 -0
- package/dist/src/benchmarks/types.js.map +1 -0
- package/dist/src/index.d.ts +4 -2
- package/dist/src/index.d.ts.map +1 -1
- package/dist/src/index.js +7 -3
- package/dist/src/index.js.map +1 -1
- package/dist/src/repositories/QuarantineRepository.d.ts +4 -251
- package/dist/src/repositories/QuarantineRepository.d.ts.map +1 -1
- package/dist/src/repositories/QuarantineRepository.js +4 -441
- package/dist/src/repositories/QuarantineRepository.js.map +1 -1
- package/dist/src/repositories/quarantine/QuarantineRepository.d.ts +168 -0
- package/dist/src/repositories/quarantine/QuarantineRepository.d.ts.map +1 -0
- package/dist/src/repositories/quarantine/QuarantineRepository.js +341 -0
- package/dist/src/repositories/quarantine/QuarantineRepository.js.map +1 -0
- package/dist/src/repositories/quarantine/index.d.ts +10 -0
- package/dist/src/repositories/quarantine/index.d.ts.map +1 -0
- package/dist/src/repositories/quarantine/index.js +10 -0
- package/dist/src/repositories/quarantine/index.js.map +1 -0
- package/dist/src/repositories/quarantine/queries.d.ts +58 -0
- package/dist/src/repositories/quarantine/queries.d.ts.map +1 -0
- package/dist/src/repositories/quarantine/queries.js +88 -0
- package/dist/src/repositories/quarantine/queries.js.map +1 -0
- package/dist/src/repositories/quarantine/query-builder.d.ts +44 -0
- package/dist/src/repositories/quarantine/query-builder.d.ts.map +1 -0
- package/dist/src/repositories/quarantine/query-builder.js +87 -0
- package/dist/src/repositories/quarantine/query-builder.js.map +1 -0
- package/dist/src/repositories/quarantine/types.d.ts +155 -0
- package/dist/src/repositories/quarantine/types.d.ts.map +1 -0
- package/dist/src/repositories/quarantine/types.js +13 -0
- package/dist/src/repositories/quarantine/types.js.map +1 -0
- package/dist/src/scripts/__tests__/scan-imported-skills.test.d.ts +1 -0
- package/dist/src/scripts/__tests__/scan-imported-skills.test.d.ts.map +1 -1
- package/dist/src/scripts/__tests__/scan-imported-skills.test.js +7 -43
- package/dist/src/scripts/__tests__/scan-imported-skills.test.js.map +1 -1
- package/dist/src/scripts/github-import/checkpoint.d.ts +21 -0
- package/dist/src/scripts/github-import/checkpoint.d.ts.map +1 -0
- package/dist/src/scripts/github-import/checkpoint.js +52 -0
- package/dist/src/scripts/github-import/checkpoint.js.map +1 -0
- package/dist/src/scripts/github-import/deduplication.d.ts +15 -0
- package/dist/src/scripts/github-import/deduplication.d.ts.map +1 -0
- package/dist/src/scripts/github-import/deduplication.js +33 -0
- package/dist/src/scripts/github-import/deduplication.js.map +1 -0
- package/dist/src/scripts/github-import/github-client.d.ts +29 -0
- package/dist/src/scripts/github-import/github-client.d.ts.map +1 -0
- package/dist/src/scripts/github-import/github-client.js +184 -0
- package/dist/src/scripts/github-import/github-client.js.map +1 -0
- package/dist/src/scripts/github-import/index.d.ts +29 -0
- package/dist/src/scripts/github-import/index.d.ts.map +1 -0
- package/dist/src/scripts/github-import/index.js +198 -0
- package/dist/src/scripts/github-import/index.js.map +1 -0
- package/dist/src/scripts/github-import/output.d.ts +12 -0
- package/dist/src/scripts/github-import/output.d.ts.map +1 -0
- package/dist/src/scripts/github-import/output.js +34 -0
- package/dist/src/scripts/github-import/output.js.map +1 -0
- package/dist/src/scripts/github-import/types.d.ts +108 -0
- package/dist/src/scripts/github-import/types.d.ts.map +1 -0
- package/dist/src/scripts/github-import/types.js +44 -0
- package/dist/src/scripts/github-import/types.js.map +1 -0
- package/dist/src/scripts/github-import/utils.d.ts +13 -0
- package/dist/src/scripts/github-import/utils.d.ts.map +1 -0
- package/dist/src/scripts/github-import/utils.js +28 -0
- package/dist/src/scripts/github-import/utils.js.map +1 -0
- package/dist/src/scripts/import-github-skills.d.ts +3 -12
- package/dist/src/scripts/import-github-skills.d.ts.map +1 -1
- package/dist/src/scripts/import-github-skills.js +18 -398
- package/dist/src/scripts/import-github-skills.js.map +1 -1
- package/dist/src/scripts/scan-imported-skills.d.ts +7 -7
- package/dist/src/scripts/scan-imported-skills.d.ts.map +1 -1
- package/dist/src/scripts/scan-imported-skills.js +8 -397
- package/dist/src/scripts/scan-imported-skills.js.map +1 -1
- package/dist/src/scripts/skill-scanner/categorizer.d.ts +43 -0
- package/dist/src/scripts/skill-scanner/categorizer.d.ts.map +1 -0
- package/dist/src/scripts/skill-scanner/categorizer.js +61 -0
- package/dist/src/scripts/skill-scanner/categorizer.js.map +1 -0
- package/dist/src/scripts/skill-scanner/file-scanner.d.ts +43 -0
- package/dist/src/scripts/skill-scanner/file-scanner.d.ts.map +1 -0
- package/dist/src/scripts/skill-scanner/file-scanner.js +90 -0
- package/dist/src/scripts/skill-scanner/file-scanner.js.map +1 -0
- package/dist/src/scripts/skill-scanner/index.d.ts +22 -0
- package/dist/src/scripts/skill-scanner/index.d.ts.map +1 -0
- package/dist/src/scripts/skill-scanner/index.js +43 -0
- package/dist/src/scripts/skill-scanner/index.js.map +1 -0
- package/dist/src/scripts/skill-scanner/logger.d.ts +59 -0
- package/dist/src/scripts/skill-scanner/logger.d.ts.map +1 -0
- package/dist/src/scripts/skill-scanner/logger.js +104 -0
- package/dist/src/scripts/skill-scanner/logger.js.map +1 -0
- package/dist/src/scripts/skill-scanner/reporter.d.ts +56 -0
- package/dist/src/scripts/skill-scanner/reporter.d.ts.map +1 -0
- package/dist/src/scripts/skill-scanner/reporter.js +166 -0
- package/dist/src/scripts/skill-scanner/reporter.js.map +1 -0
- package/dist/src/scripts/skill-scanner/scanner.d.ts +44 -0
- package/dist/src/scripts/skill-scanner/scanner.d.ts.map +1 -0
- package/dist/src/scripts/skill-scanner/scanner.js +140 -0
- package/dist/src/scripts/skill-scanner/scanner.js.map +1 -0
- package/dist/src/scripts/skill-scanner/trust-scorer.d.ts +59 -0
- package/dist/src/scripts/skill-scanner/trust-scorer.d.ts.map +1 -0
- package/dist/src/scripts/skill-scanner/trust-scorer.js +62 -0
- package/dist/src/scripts/skill-scanner/trust-scorer.js.map +1 -0
- package/dist/src/scripts/skill-scanner/types.d.ts +98 -0
- package/dist/src/scripts/skill-scanner/types.d.ts.map +1 -0
- package/dist/src/scripts/skill-scanner/types.js +7 -0
- package/dist/src/scripts/skill-scanner/types.js.map +1 -0
- package/dist/src/scripts/validate-skills.d.ts +3 -172
- package/dist/src/scripts/validate-skills.d.ts.map +1 -1
- package/dist/src/scripts/validate-skills.js +6 -519
- package/dist/src/scripts/validate-skills.js.map +1 -1
- package/dist/src/scripts/validation/deduplication.d.ts +23 -0
- package/dist/src/scripts/validation/deduplication.d.ts.map +1 -0
- package/dist/src/scripts/validation/deduplication.js +127 -0
- package/dist/src/scripts/validation/deduplication.js.map +1 -0
- package/dist/src/scripts/validation/field-validators.d.ts +9 -0
- package/dist/src/scripts/validation/field-validators.d.ts.map +1 -0
- package/dist/src/scripts/validation/field-validators.js +135 -0
- package/dist/src/scripts/validation/field-validators.js.map +1 -0
- package/dist/src/scripts/validation/index.d.ts +29 -0
- package/dist/src/scripts/validation/index.d.ts.map +1 -0
- package/dist/src/scripts/validation/index.js +84 -0
- package/dist/src/scripts/validation/index.js.map +1 -0
- package/dist/src/scripts/validation/normalizers.d.ts +29 -0
- package/dist/src/scripts/validation/normalizers.d.ts.map +1 -0
- package/dist/src/scripts/validation/normalizers.js +79 -0
- package/dist/src/scripts/validation/normalizers.js.map +1 -0
- package/dist/src/scripts/validation/pipeline.d.ts +13 -0
- package/dist/src/scripts/validation/pipeline.d.ts.map +1 -0
- package/dist/src/scripts/validation/pipeline.js +126 -0
- package/dist/src/scripts/validation/pipeline.js.map +1 -0
- package/dist/src/scripts/validation/types.d.ts +128 -0
- package/dist/src/scripts/validation/types.d.ts.map +1 -0
- package/dist/src/scripts/validation/types.js +43 -0
- package/dist/src/scripts/validation/types.js.map +1 -0
- package/dist/src/security/index.d.ts +5 -4
- package/dist/src/security/index.d.ts.map +1 -1
- package/dist/src/security/index.js +8 -2
- package/dist/src/security/index.js.map +1 -1
- package/dist/src/security/rate-limiter/RateLimiter.d.ts +86 -0
- package/dist/src/security/rate-limiter/RateLimiter.d.ts.map +1 -0
- package/dist/src/security/rate-limiter/RateLimiter.js +260 -0
- package/dist/src/security/rate-limiter/RateLimiter.js.map +1 -0
- package/dist/src/security/rate-limiter/constants.d.ts +15 -0
- package/dist/src/security/rate-limiter/constants.d.ts.map +1 -0
- package/dist/src/security/rate-limiter/constants.js +15 -0
- package/dist/src/security/rate-limiter/constants.js.map +1 -0
- package/dist/src/security/rate-limiter/errors.d.ts +22 -0
- package/dist/src/security/rate-limiter/errors.d.ts.map +1 -0
- package/dist/src/security/rate-limiter/errors.js +32 -0
- package/dist/src/security/rate-limiter/errors.js.map +1 -0
- package/dist/src/security/rate-limiter/index.d.ts +12 -0
- package/dist/src/security/rate-limiter/index.d.ts.map +1 -0
- package/dist/src/security/rate-limiter/index.js +16 -0
- package/dist/src/security/rate-limiter/index.js.map +1 -0
- package/dist/src/security/rate-limiter/metrics-manager.d.ts +55 -0
- package/dist/src/security/rate-limiter/metrics-manager.d.ts.map +1 -0
- package/dist/src/security/rate-limiter/metrics-manager.js +144 -0
- package/dist/src/security/rate-limiter/metrics-manager.js.map +1 -0
- package/dist/src/security/rate-limiter/presets.d.ts +52 -0
- package/dist/src/security/rate-limiter/presets.d.ts.map +1 -0
- package/dist/src/security/rate-limiter/presets.js +53 -0
- package/dist/src/security/rate-limiter/presets.js.map +1 -0
- package/dist/src/security/rate-limiter/queue-manager.d.ts +59 -0
- package/dist/src/security/rate-limiter/queue-manager.d.ts.map +1 -0
- package/dist/src/security/rate-limiter/queue-manager.js +189 -0
- package/dist/src/security/rate-limiter/queue-manager.js.map +1 -0
- package/dist/src/security/rate-limiter/storage.d.ts +34 -0
- package/dist/src/security/rate-limiter/storage.d.ts.map +1 -0
- package/dist/src/security/rate-limiter/storage.js +80 -0
- package/dist/src/security/rate-limiter/storage.js.map +1 -0
- package/dist/src/security/rate-limiter/token-bucket.d.ts +44 -0
- package/dist/src/security/rate-limiter/token-bucket.d.ts.map +1 -0
- package/dist/src/security/rate-limiter/token-bucket.js +99 -0
- package/dist/src/security/rate-limiter/token-bucket.js.map +1 -0
- package/dist/src/security/rate-limiter/types.d.ts +104 -0
- package/dist/src/security/rate-limiter/types.d.ts.map +1 -0
- package/dist/src/security/rate-limiter/types.js +7 -0
- package/dist/src/security/rate-limiter/types.js.map +1 -0
- package/dist/src/security/scanner/SecurityScanner.d.ts +94 -0
- package/dist/src/security/scanner/SecurityScanner.d.ts.map +1 -0
- package/dist/src/security/scanner/SecurityScanner.js +403 -0
- package/dist/src/security/scanner/SecurityScanner.js.map +1 -0
- package/dist/src/security/scanner/index.d.ts +11 -0
- package/dist/src/security/scanner/index.d.ts.map +1 -0
- package/dist/src/security/scanner/index.js +14 -0
- package/dist/src/security/scanner/index.js.map +1 -0
- package/dist/src/security/scanner/patterns.d.ts +14 -0
- package/dist/src/security/scanner/patterns.d.ts.map +1 -0
- package/dist/src/security/scanner/patterns.js +147 -0
- package/dist/src/security/scanner/patterns.js.map +1 -0
- package/dist/src/security/scanner/regex-utils.d.ts +33 -0
- package/dist/src/security/scanner/regex-utils.d.ts.map +1 -0
- package/dist/src/security/scanner/regex-utils.js +41 -0
- package/dist/src/security/scanner/regex-utils.js.map +1 -0
- package/dist/src/security/scanner/types.d.ts +63 -0
- package/dist/src/security/scanner/types.d.ts.map +1 -0
- package/dist/src/security/scanner/types.js +7 -0
- package/dist/src/security/scanner/types.js.map +1 -0
- package/dist/src/security/scanner/weights.d.ts +15 -0
- package/dist/src/security/scanner/weights.d.ts.map +1 -0
- package/dist/src/security/scanner/weights.js +28 -0
- package/dist/src/security/scanner/weights.js.map +1 -0
- package/dist/src/session/SessionHealthMonitor.d.ts +5 -168
- package/dist/src/session/SessionHealthMonitor.d.ts.map +1 -1
- package/dist/src/session/SessionHealthMonitor.js +22 -91
- package/dist/src/session/SessionHealthMonitor.js.map +1 -1
- package/dist/src/session/health-checks.d.ts +37 -0
- package/dist/src/session/health-checks.d.ts.map +1 -0
- package/dist/src/session/health-checks.js +64 -0
- package/dist/src/session/health-checks.js.map +1 -0
- package/dist/src/session/health-types.d.ts +78 -0
- package/dist/src/session/health-types.d.ts.map +1 -0
- package/dist/src/session/health-types.js +16 -0
- package/dist/src/session/health-types.js.map +1 -0
- package/dist/src/session/index.d.ts +5 -1
- package/dist/src/session/index.d.ts.map +1 -1
- package/dist/src/session/index.js +9 -0
- package/dist/src/session/index.js.map +1 -1
- package/dist/src/session/metrics-collector.d.ts +23 -0
- package/dist/src/session/metrics-collector.d.ts.map +1 -0
- package/dist/src/session/metrics-collector.js +44 -0
- package/dist/src/session/metrics-collector.js.map +1 -0
- package/dist/src/session/typed-event-emitter.d.ts +70 -0
- package/dist/src/session/typed-event-emitter.d.ts.map +1 -0
- package/dist/src/session/typed-event-emitter.js +79 -0
- package/dist/src/session/typed-event-emitter.js.map +1 -0
- package/dist/src/sources/BaseSourceAdapter.d.ts +1 -1
- package/dist/src/sources/BaseSourceAdapter.d.ts.map +1 -1
- package/dist/src/sources/BaseSourceAdapter.js +2 -2
- package/dist/src/sources/BaseSourceAdapter.js.map +1 -1
- package/dist/src/telemetry/index.d.ts +1 -0
- package/dist/src/telemetry/index.d.ts.map +1 -1
- package/dist/src/telemetry/index.js +2 -0
- package/dist/src/telemetry/index.js.map +1 -1
- package/dist/src/telemetry/posthog.d.ts +125 -0
- package/dist/src/telemetry/posthog.d.ts.map +1 -0
- package/dist/src/telemetry/posthog.js +198 -0
- package/dist/src/telemetry/posthog.js.map +1 -0
- package/dist/tests/RateLimiter.test.js +4 -4
- package/dist/tests/RateLimiter.test.js.map +1 -1
- package/dist/tests/e2e/security/security.e2e.test.js +3 -3
- package/dist/tests/e2e/security/security.e2e.test.js.map +1 -1
- package/package.json +2 -1
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Rate Limiter Types - SMI-730, SMI-1013, SMI-1189
|
|
3
|
+
*
|
|
4
|
+
* Type definitions for rate limiting functionality.
|
|
5
|
+
*/
|
|
6
|
+
/**
|
|
7
|
+
* Rate limit metrics for monitoring and alerting
|
|
8
|
+
*/
|
|
9
|
+
export interface RateLimitMetrics {
|
|
10
|
+
/** Number of allowed requests */
|
|
11
|
+
allowed: number;
|
|
12
|
+
/** Number of blocked requests */
|
|
13
|
+
blocked: number;
|
|
14
|
+
/** Number of errors (storage failures, etc.) */
|
|
15
|
+
errors: number;
|
|
16
|
+
/** Last time metrics were reset */
|
|
17
|
+
lastReset: Date;
|
|
18
|
+
/** Last time metrics were updated */
|
|
19
|
+
lastUpdated: Date;
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* Rate limit configuration
|
|
23
|
+
*/
|
|
24
|
+
export interface RateLimitConfig {
|
|
25
|
+
/** Maximum tokens in bucket (burst capacity) */
|
|
26
|
+
maxTokens: number;
|
|
27
|
+
/** Tokens refilled per second */
|
|
28
|
+
refillRate: number;
|
|
29
|
+
/** Window duration in milliseconds (for cleanup) */
|
|
30
|
+
windowMs: number;
|
|
31
|
+
/** Key prefix for storage */
|
|
32
|
+
keyPrefix?: string;
|
|
33
|
+
/** Enable debug logging */
|
|
34
|
+
debug?: boolean;
|
|
35
|
+
/** Callback when rate limit is exceeded */
|
|
36
|
+
onLimitExceeded?: (key: string, metrics: RateLimitMetrics) => void;
|
|
37
|
+
/** Fail mode on storage errors: 'open' allows requests, 'closed' denies them (default: 'open') */
|
|
38
|
+
failMode?: 'open' | 'closed';
|
|
39
|
+
/** Enable request queuing when rate limited (SMI-1013, default: false) */
|
|
40
|
+
enableQueue?: boolean;
|
|
41
|
+
/** Maximum time to wait in queue in milliseconds (SMI-1013, default: 30000) */
|
|
42
|
+
queueTimeoutMs?: number;
|
|
43
|
+
/** Maximum number of requests that can wait in queue (SMI-1013, default: 100) */
|
|
44
|
+
maxQueueSize?: number;
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* Token bucket state
|
|
48
|
+
*/
|
|
49
|
+
export interface TokenBucket {
|
|
50
|
+
/** Current number of tokens */
|
|
51
|
+
tokens: number;
|
|
52
|
+
/** Last refill timestamp */
|
|
53
|
+
lastRefill: number;
|
|
54
|
+
/** First request timestamp (for window tracking) */
|
|
55
|
+
firstRequest: number;
|
|
56
|
+
}
|
|
57
|
+
/**
|
|
58
|
+
* Rate limit result
|
|
59
|
+
*/
|
|
60
|
+
export interface RateLimitResult {
|
|
61
|
+
/** Whether the request is allowed */
|
|
62
|
+
allowed: boolean;
|
|
63
|
+
/** Remaining tokens */
|
|
64
|
+
remaining: number;
|
|
65
|
+
/** Total tokens in bucket */
|
|
66
|
+
limit: number;
|
|
67
|
+
/** Milliseconds until bucket refills */
|
|
68
|
+
retryAfterMs?: number;
|
|
69
|
+
/** When the limit resets (ISO timestamp) */
|
|
70
|
+
resetAt?: string;
|
|
71
|
+
/** Current metrics for this key (optional) */
|
|
72
|
+
metrics?: RateLimitMetrics;
|
|
73
|
+
/** Whether the request waited in queue (SMI-1013) */
|
|
74
|
+
queued?: boolean;
|
|
75
|
+
/** Time spent waiting in queue in milliseconds (SMI-1013) */
|
|
76
|
+
queueWaitMs?: number;
|
|
77
|
+
}
|
|
78
|
+
/**
|
|
79
|
+
* Queued request waiting for a token (SMI-1013)
|
|
80
|
+
*/
|
|
81
|
+
export interface QueuedRequest {
|
|
82
|
+
/** Unique identifier for this request */
|
|
83
|
+
id: string;
|
|
84
|
+
/** Resolve function to signal the request can proceed */
|
|
85
|
+
resolve: (result: RateLimitResult) => void;
|
|
86
|
+
/** Reject function for timeout */
|
|
87
|
+
reject: (error: Error) => void;
|
|
88
|
+
/** Token cost for this request */
|
|
89
|
+
cost: number;
|
|
90
|
+
/** Timestamp when request was queued */
|
|
91
|
+
queuedAt: number;
|
|
92
|
+
/** Timeout handle */
|
|
93
|
+
timeoutHandle: NodeJS.Timeout;
|
|
94
|
+
}
|
|
95
|
+
/**
|
|
96
|
+
* Storage interface for rate limit data
|
|
97
|
+
*/
|
|
98
|
+
export interface RateLimitStorage {
|
|
99
|
+
get(key: string): Promise<TokenBucket | null>;
|
|
100
|
+
set(key: string, value: TokenBucket, ttlMs: number): Promise<void>;
|
|
101
|
+
delete(key: string): Promise<void>;
|
|
102
|
+
clear?(): Promise<void>;
|
|
103
|
+
}
|
|
104
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../../src/security/rate-limiter/types.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B,iCAAiC;IACjC,OAAO,EAAE,MAAM,CAAA;IACf,iCAAiC;IACjC,OAAO,EAAE,MAAM,CAAA;IACf,gDAAgD;IAChD,MAAM,EAAE,MAAM,CAAA;IACd,mCAAmC;IACnC,SAAS,EAAE,IAAI,CAAA;IACf,qCAAqC;IACrC,WAAW,EAAE,IAAI,CAAA;CAClB;AAED;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B,gDAAgD;IAChD,SAAS,EAAE,MAAM,CAAA;IACjB,iCAAiC;IACjC,UAAU,EAAE,MAAM,CAAA;IAClB,oDAAoD;IACpD,QAAQ,EAAE,MAAM,CAAA;IAChB,6BAA6B;IAC7B,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,2BAA2B;IAC3B,KAAK,CAAC,EAAE,OAAO,CAAA;IACf,2CAA2C;IAC3C,eAAe,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,EAAE,gBAAgB,KAAK,IAAI,CAAA;IAClE,kGAAkG;IAClG,QAAQ,CAAC,EAAE,MAAM,GAAG,QAAQ,CAAA;IAC5B,0EAA0E;IAC1E,WAAW,CAAC,EAAE,OAAO,CAAA;IACrB,+EAA+E;IAC/E,cAAc,CAAC,EAAE,MAAM,CAAA;IACvB,iFAAiF;IACjF,YAAY,CAAC,EAAE,MAAM,CAAA;CACtB;AAED;;GAEG;AACH,MAAM,WAAW,WAAW;IAC1B,+BAA+B;IAC/B,MAAM,EAAE,MAAM,CAAA;IACd,4BAA4B;IAC5B,UAAU,EAAE,MAAM,CAAA;IAClB,oDAAoD;IACpD,YAAY,EAAE,MAAM,CAAA;CACrB;AAED;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B,qCAAqC;IACrC,OAAO,EAAE,OAAO,CAAA;IAChB,uBAAuB;IACvB,SAAS,EAAE,MAAM,CAAA;IACjB,6BAA6B;IAC7B,KAAK,EAAE,MAAM,CAAA;IACb,wCAAwC;IACxC,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB,4CAA4C;IAC5C,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,8CAA8C;IAC9C,OAAO,CAAC,EAAE,gBAAgB,CAAA;IAC1B,qDAAqD;IACrD,MAAM,CAAC,EAAE,OAAO,CAAA;IAChB,6DAA6D;IAC7D,WAAW,CAAC,EAAE,MAAM,CAAA;CACrB;AAED;;GAEG;AACH,MAAM,WAAW,aAAa;IAC5B,yCAAyC;IACzC,EAAE,EAAE,MAAM,CAAA;IACV,yDAAyD;IACzD,OAAO,EAAE,CAAC,MAAM,EAAE,eAAe,KAAK,IAAI,CAAA;IAC1C,kCAAkC;IAClC,MAAM,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,CAAA;IAC9B,kCAAkC;IAClC,IAAI,EAAE,MAAM,CAAA;IACZ,wCAAwC;IACxC,QAAQ,EAAE,MAAM,CAAA;IAChB,qBAAqB;IACrB,aAAa,EAAE,MAAM,CAAC,OAAO,CAAA;CAC9B;AAED;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,GAAG,IAAI,CAAC,CAAA;IAC7C,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,WAAW,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;IAClE,MAAM,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;IAClC,KAAK,CAAC,IAAI,OAAO,CAAC,IAAI,CAAC,CAAA;CACxB"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../../../src/security/rate-limiter/types.ts"],"names":[],"mappings":"AAAA;;;;GAIG"}
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Security Scanner - SMI-587, SMI-685, SMI-882, SMI-1189
|
|
3
|
+
*
|
|
4
|
+
* Security scanning for skill content with advanced pattern detection.
|
|
5
|
+
*/
|
|
6
|
+
import type { SecurityFinding, ScanReport, ScannerOptions, RiskScoreBreakdown } from './types.js';
|
|
7
|
+
export declare class SecurityScanner {
|
|
8
|
+
private allowedDomains;
|
|
9
|
+
private blockedPatterns;
|
|
10
|
+
private maxContentLength;
|
|
11
|
+
private riskThreshold;
|
|
12
|
+
constructor(options?: ScannerOptions);
|
|
13
|
+
/**
|
|
14
|
+
* Extract all URLs from content
|
|
15
|
+
*/
|
|
16
|
+
private extractUrls;
|
|
17
|
+
/**
|
|
18
|
+
* Check if URL domain is allowed
|
|
19
|
+
*/
|
|
20
|
+
private isAllowedDomain;
|
|
21
|
+
/**
|
|
22
|
+
* Scan for non-allowlisted URLs
|
|
23
|
+
*/
|
|
24
|
+
private scanUrls;
|
|
25
|
+
/**
|
|
26
|
+
* Scan for sensitive file path references
|
|
27
|
+
* SMI-882: Uses safeRegexCheck to prevent ReDoS
|
|
28
|
+
*/
|
|
29
|
+
private scanSensitivePaths;
|
|
30
|
+
/**
|
|
31
|
+
* Scan for jailbreak attempts
|
|
32
|
+
* SMI-882: Uses safeRegexTest to prevent ReDoS
|
|
33
|
+
*/
|
|
34
|
+
private scanJailbreakPatterns;
|
|
35
|
+
/**
|
|
36
|
+
* Scan for suspicious code patterns
|
|
37
|
+
* SMI-882: Uses safeRegexTest to prevent ReDoS
|
|
38
|
+
*/
|
|
39
|
+
private scanSuspiciousPatterns;
|
|
40
|
+
/**
|
|
41
|
+
* SMI-685: Scan for social engineering attempts
|
|
42
|
+
* SMI-882: Uses safeRegexTest to prevent ReDoS
|
|
43
|
+
* Detects patterns like "pretend to be", "roleplay as", "you are now"
|
|
44
|
+
*/
|
|
45
|
+
private scanSocialEngineering;
|
|
46
|
+
/**
|
|
47
|
+
* SMI-685: Scan for prompt leaking attempts
|
|
48
|
+
* SMI-882: Uses safeRegexTest to prevent ReDoS
|
|
49
|
+
* Detects patterns like "show me your instructions", "what are your rules"
|
|
50
|
+
*/
|
|
51
|
+
private scanPromptLeaking;
|
|
52
|
+
/**
|
|
53
|
+
* SMI-685: Scan for data exfiltration patterns
|
|
54
|
+
* SMI-882: Uses safeRegexTest to prevent ReDoS
|
|
55
|
+
* Detects encoding to external URLs, file upload patterns
|
|
56
|
+
*/
|
|
57
|
+
private scanDataExfiltration;
|
|
58
|
+
/**
|
|
59
|
+
* SMI-685: Scan for privilege escalation patterns
|
|
60
|
+
* SMI-882: Uses safeRegexTest to prevent ReDoS
|
|
61
|
+
* Detects sudo with passwords, chmod patterns, root access attempts
|
|
62
|
+
*/
|
|
63
|
+
private scanPrivilegeEscalation;
|
|
64
|
+
/**
|
|
65
|
+
* SMI-685: Calculate risk score from findings
|
|
66
|
+
* Aggregates multiple findings into a risk score from 0-100
|
|
67
|
+
* @param findings - Array of security findings
|
|
68
|
+
* @returns Risk score breakdown and total
|
|
69
|
+
*/
|
|
70
|
+
calculateRiskScore(findings: SecurityFinding[]): {
|
|
71
|
+
total: number;
|
|
72
|
+
breakdown: RiskScoreBreakdown;
|
|
73
|
+
};
|
|
74
|
+
/**
|
|
75
|
+
* Perform full security scan
|
|
76
|
+
* SMI-685: Enhanced with new pattern detection and risk scoring
|
|
77
|
+
*/
|
|
78
|
+
scan(skillId: string, content: string): ScanReport;
|
|
79
|
+
/**
|
|
80
|
+
* Quick check without full scan
|
|
81
|
+
* SMI-882: Uses safeRegexCheck to prevent ReDoS
|
|
82
|
+
*/
|
|
83
|
+
quickCheck(content: string): boolean;
|
|
84
|
+
/**
|
|
85
|
+
* Add allowed domain
|
|
86
|
+
*/
|
|
87
|
+
addAllowedDomain(domain: string): void;
|
|
88
|
+
/**
|
|
89
|
+
* Add blocked pattern
|
|
90
|
+
*/
|
|
91
|
+
addBlockedPattern(pattern: RegExp): void;
|
|
92
|
+
}
|
|
93
|
+
export default SecurityScanner;
|
|
94
|
+
//# sourceMappingURL=SecurityScanner.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SecurityScanner.d.ts","sourceRoot":"","sources":["../../../../src/security/scanner/SecurityScanner.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EACV,eAAe,EACf,UAAU,EACV,cAAc,EACd,kBAAkB,EACnB,MAAM,YAAY,CAAA;AAcnB,qBAAa,eAAe;IAC1B,OAAO,CAAC,cAAc,CAAa;IACnC,OAAO,CAAC,eAAe,CAAU;IACjC,OAAO,CAAC,gBAAgB,CAAQ;IAChC,OAAO,CAAC,aAAa,CAAQ;gBAEjB,OAAO,GAAE,cAAmB;IAOxC;;OAEG;IACH,OAAO,CAAC,WAAW;IAenB;;OAEG;IACH,OAAO,CAAC,eAAe;IAcvB;;OAEG;IACH,OAAO,CAAC,QAAQ;IAmBhB;;;OAGG;IACH,OAAO,CAAC,kBAAkB;IAuB1B;;;OAGG;IACH,OAAO,CAAC,qBAAqB;IAwB7B;;;OAGG;IACH,OAAO,CAAC,sBAAsB;IAwC9B;;;;OAIG;IACH,OAAO,CAAC,qBAAqB;IAyB7B;;;;OAIG;IACH,OAAO,CAAC,iBAAiB;IAyBzB;;;;OAIG;IACH,OAAO,CAAC,oBAAoB;IAyB5B;;;;OAIG;IACH,OAAO,CAAC,uBAAuB;IAyB/B;;;;;OAKG;IACH,kBAAkB,CAAC,QAAQ,EAAE,eAAe,EAAE,GAAG;QAC/C,KAAK,EAAE,MAAM,CAAA;QACb,SAAS,EAAE,kBAAkB,CAAA;KAC9B;IA0ED;;;OAGG;IACH,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,UAAU;IA8ClD;;;OAGG;IACH,UAAU,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO;IASpC;;OAEG;IACH,gBAAgB,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI;IAItC;;OAEG;IACH,iBAAiB,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI;CAGzC;AAED,eAAe,eAAe,CAAA"}
|
|
@@ -0,0 +1,403 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Security Scanner - SMI-587, SMI-685, SMI-882, SMI-1189
|
|
3
|
+
*
|
|
4
|
+
* Security scanning for skill content with advanced pattern detection.
|
|
5
|
+
*/
|
|
6
|
+
import { DEFAULT_ALLOWED_DOMAINS, SENSITIVE_PATH_PATTERNS, JAILBREAK_PATTERNS, SUSPICIOUS_PATTERNS, SOCIAL_ENGINEERING_PATTERNS, PROMPT_LEAKING_PATTERNS, DATA_EXFILTRATION_PATTERNS, PRIVILEGE_ESCALATION_PATTERNS, } from './patterns.js';
|
|
7
|
+
import { SEVERITY_WEIGHTS, CATEGORY_WEIGHTS } from './weights.js';
|
|
8
|
+
import { safeRegexTest, safeRegexCheck } from './regex-utils.js';
|
|
9
|
+
export class SecurityScanner {
|
|
10
|
+
allowedDomains;
|
|
11
|
+
blockedPatterns;
|
|
12
|
+
maxContentLength;
|
|
13
|
+
riskThreshold;
|
|
14
|
+
constructor(options = {}) {
|
|
15
|
+
this.allowedDomains = new Set(options.allowedDomains ?? DEFAULT_ALLOWED_DOMAINS);
|
|
16
|
+
this.blockedPatterns = options.blockedPatterns ?? [];
|
|
17
|
+
this.maxContentLength = options.maxContentLength ?? 1_000_000; // 1MB
|
|
18
|
+
this.riskThreshold = options.riskThreshold ?? 40;
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* Extract all URLs from content
|
|
22
|
+
*/
|
|
23
|
+
extractUrls(content) {
|
|
24
|
+
const urlPattern = /https?:\/\/[^\s<>"')\]]+/gi;
|
|
25
|
+
const lines = content.split('\n');
|
|
26
|
+
const results = [];
|
|
27
|
+
lines.forEach((line, index) => {
|
|
28
|
+
let match;
|
|
29
|
+
while ((match = urlPattern.exec(line)) !== null) {
|
|
30
|
+
results.push({ url: match[0], line: index + 1 });
|
|
31
|
+
}
|
|
32
|
+
});
|
|
33
|
+
return results;
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* Check if URL domain is allowed
|
|
37
|
+
*/
|
|
38
|
+
isAllowedDomain(url) {
|
|
39
|
+
try {
|
|
40
|
+
const parsed = new URL(url);
|
|
41
|
+
const hostname = parsed.hostname.toLowerCase();
|
|
42
|
+
// Check exact match or subdomain match
|
|
43
|
+
return Array.from(this.allowedDomains).some((domain) => hostname === domain || hostname.endsWith('.' + domain));
|
|
44
|
+
}
|
|
45
|
+
catch {
|
|
46
|
+
return false;
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* Scan for non-allowlisted URLs
|
|
51
|
+
*/
|
|
52
|
+
scanUrls(content) {
|
|
53
|
+
const findings = [];
|
|
54
|
+
const urls = this.extractUrls(content);
|
|
55
|
+
for (const { url, line } of urls) {
|
|
56
|
+
if (!this.isAllowedDomain(url)) {
|
|
57
|
+
findings.push({
|
|
58
|
+
type: 'url',
|
|
59
|
+
severity: 'medium',
|
|
60
|
+
message: `External URL not in allowlist: ${url}`,
|
|
61
|
+
location: url,
|
|
62
|
+
lineNumber: line,
|
|
63
|
+
});
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
return findings;
|
|
67
|
+
}
|
|
68
|
+
/**
|
|
69
|
+
* Scan for sensitive file path references
|
|
70
|
+
* SMI-882: Uses safeRegexCheck to prevent ReDoS
|
|
71
|
+
*/
|
|
72
|
+
scanSensitivePaths(content) {
|
|
73
|
+
const findings = [];
|
|
74
|
+
const lines = content.split('\n');
|
|
75
|
+
lines.forEach((line, index) => {
|
|
76
|
+
for (const pattern of SENSITIVE_PATH_PATTERNS) {
|
|
77
|
+
// SMI-882: Use safe regex check with length limit
|
|
78
|
+
if (safeRegexCheck(pattern, line)) {
|
|
79
|
+
findings.push({
|
|
80
|
+
type: 'sensitive_path',
|
|
81
|
+
severity: 'high',
|
|
82
|
+
message: `Reference to potentially sensitive path: ${pattern.source}`,
|
|
83
|
+
location: line.trim().slice(0, 100),
|
|
84
|
+
lineNumber: index + 1,
|
|
85
|
+
});
|
|
86
|
+
break; // One finding per line
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
});
|
|
90
|
+
return findings;
|
|
91
|
+
}
|
|
92
|
+
/**
|
|
93
|
+
* Scan for jailbreak attempts
|
|
94
|
+
* SMI-882: Uses safeRegexTest to prevent ReDoS
|
|
95
|
+
*/
|
|
96
|
+
scanJailbreakPatterns(content) {
|
|
97
|
+
const findings = [];
|
|
98
|
+
const lines = content.split('\n');
|
|
99
|
+
lines.forEach((line, index) => {
|
|
100
|
+
for (const pattern of JAILBREAK_PATTERNS) {
|
|
101
|
+
// SMI-882: Use safe regex test with length limit
|
|
102
|
+
const match = safeRegexTest(pattern, line);
|
|
103
|
+
if (match) {
|
|
104
|
+
findings.push({
|
|
105
|
+
type: 'jailbreak',
|
|
106
|
+
severity: 'critical',
|
|
107
|
+
message: `Potential jailbreak pattern detected: "${match[0]}"`,
|
|
108
|
+
location: line.trim().slice(0, 100),
|
|
109
|
+
lineNumber: index + 1,
|
|
110
|
+
});
|
|
111
|
+
break; // One finding per line
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
});
|
|
115
|
+
return findings;
|
|
116
|
+
}
|
|
117
|
+
/**
|
|
118
|
+
* Scan for suspicious code patterns
|
|
119
|
+
* SMI-882: Uses safeRegexTest to prevent ReDoS
|
|
120
|
+
*/
|
|
121
|
+
scanSuspiciousPatterns(content) {
|
|
122
|
+
const findings = [];
|
|
123
|
+
const lines = content.split('\n');
|
|
124
|
+
lines.forEach((line, index) => {
|
|
125
|
+
for (const pattern of SUSPICIOUS_PATTERNS) {
|
|
126
|
+
// SMI-882: Use safe regex test with length limit
|
|
127
|
+
const match = safeRegexTest(pattern, line);
|
|
128
|
+
if (match) {
|
|
129
|
+
findings.push({
|
|
130
|
+
type: 'suspicious_pattern',
|
|
131
|
+
severity: 'medium',
|
|
132
|
+
message: `Suspicious pattern detected: "${match[0]}"`,
|
|
133
|
+
location: line.trim().slice(0, 100),
|
|
134
|
+
lineNumber: index + 1,
|
|
135
|
+
});
|
|
136
|
+
break; // One finding per line
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
// Check custom blocked patterns
|
|
140
|
+
for (const pattern of this.blockedPatterns) {
|
|
141
|
+
// SMI-882: Use safe regex test with length limit
|
|
142
|
+
const match = safeRegexTest(pattern, line);
|
|
143
|
+
if (match) {
|
|
144
|
+
findings.push({
|
|
145
|
+
type: 'suspicious_pattern',
|
|
146
|
+
severity: 'high',
|
|
147
|
+
message: `Blocked pattern detected: "${match[0]}"`,
|
|
148
|
+
location: line.trim().slice(0, 100),
|
|
149
|
+
lineNumber: index + 1,
|
|
150
|
+
});
|
|
151
|
+
break;
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
});
|
|
155
|
+
return findings;
|
|
156
|
+
}
|
|
157
|
+
/**
|
|
158
|
+
* SMI-685: Scan for social engineering attempts
|
|
159
|
+
* SMI-882: Uses safeRegexTest to prevent ReDoS
|
|
160
|
+
* Detects patterns like "pretend to be", "roleplay as", "you are now"
|
|
161
|
+
*/
|
|
162
|
+
scanSocialEngineering(content) {
|
|
163
|
+
const findings = [];
|
|
164
|
+
const lines = content.split('\n');
|
|
165
|
+
lines.forEach((line, index) => {
|
|
166
|
+
for (const pattern of SOCIAL_ENGINEERING_PATTERNS) {
|
|
167
|
+
// SMI-882: Use safe regex test with length limit
|
|
168
|
+
const match = safeRegexTest(pattern, line);
|
|
169
|
+
if (match) {
|
|
170
|
+
findings.push({
|
|
171
|
+
type: 'social_engineering',
|
|
172
|
+
severity: 'high',
|
|
173
|
+
message: `Social engineering attempt detected: "${match[0]}"`,
|
|
174
|
+
location: line.trim().slice(0, 100),
|
|
175
|
+
lineNumber: index + 1,
|
|
176
|
+
category: 'social_engineering',
|
|
177
|
+
});
|
|
178
|
+
break; // One finding per line
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
});
|
|
182
|
+
return findings;
|
|
183
|
+
}
|
|
184
|
+
/**
|
|
185
|
+
* SMI-685: Scan for prompt leaking attempts
|
|
186
|
+
* SMI-882: Uses safeRegexTest to prevent ReDoS
|
|
187
|
+
* Detects patterns like "show me your instructions", "what are your rules"
|
|
188
|
+
*/
|
|
189
|
+
scanPromptLeaking(content) {
|
|
190
|
+
const findings = [];
|
|
191
|
+
const lines = content.split('\n');
|
|
192
|
+
lines.forEach((line, index) => {
|
|
193
|
+
for (const pattern of PROMPT_LEAKING_PATTERNS) {
|
|
194
|
+
// SMI-882: Use safe regex test with length limit
|
|
195
|
+
const match = safeRegexTest(pattern, line);
|
|
196
|
+
if (match) {
|
|
197
|
+
findings.push({
|
|
198
|
+
type: 'prompt_leaking',
|
|
199
|
+
severity: 'critical',
|
|
200
|
+
message: `Prompt leaking attempt detected: "${match[0]}"`,
|
|
201
|
+
location: line.trim().slice(0, 100),
|
|
202
|
+
lineNumber: index + 1,
|
|
203
|
+
category: 'prompt_leaking',
|
|
204
|
+
});
|
|
205
|
+
break; // One finding per line
|
|
206
|
+
}
|
|
207
|
+
}
|
|
208
|
+
});
|
|
209
|
+
return findings;
|
|
210
|
+
}
|
|
211
|
+
/**
|
|
212
|
+
* SMI-685: Scan for data exfiltration patterns
|
|
213
|
+
* SMI-882: Uses safeRegexTest to prevent ReDoS
|
|
214
|
+
* Detects encoding to external URLs, file upload patterns
|
|
215
|
+
*/
|
|
216
|
+
scanDataExfiltration(content) {
|
|
217
|
+
const findings = [];
|
|
218
|
+
const lines = content.split('\n');
|
|
219
|
+
lines.forEach((line, index) => {
|
|
220
|
+
for (const pattern of DATA_EXFILTRATION_PATTERNS) {
|
|
221
|
+
// SMI-882: Use safe regex test with length limit
|
|
222
|
+
const match = safeRegexTest(pattern, line);
|
|
223
|
+
if (match) {
|
|
224
|
+
findings.push({
|
|
225
|
+
type: 'data_exfiltration',
|
|
226
|
+
severity: 'high',
|
|
227
|
+
message: `Potential data exfiltration pattern: "${match[0]}"`,
|
|
228
|
+
location: line.trim().slice(0, 100),
|
|
229
|
+
lineNumber: index + 1,
|
|
230
|
+
category: 'data_exfiltration',
|
|
231
|
+
});
|
|
232
|
+
break; // One finding per line
|
|
233
|
+
}
|
|
234
|
+
}
|
|
235
|
+
});
|
|
236
|
+
return findings;
|
|
237
|
+
}
|
|
238
|
+
/**
|
|
239
|
+
* SMI-685: Scan for privilege escalation patterns
|
|
240
|
+
* SMI-882: Uses safeRegexTest to prevent ReDoS
|
|
241
|
+
* Detects sudo with passwords, chmod patterns, root access attempts
|
|
242
|
+
*/
|
|
243
|
+
scanPrivilegeEscalation(content) {
|
|
244
|
+
const findings = [];
|
|
245
|
+
const lines = content.split('\n');
|
|
246
|
+
lines.forEach((line, index) => {
|
|
247
|
+
for (const pattern of PRIVILEGE_ESCALATION_PATTERNS) {
|
|
248
|
+
// SMI-882: Use safe regex test with length limit
|
|
249
|
+
const match = safeRegexTest(pattern, line);
|
|
250
|
+
if (match) {
|
|
251
|
+
findings.push({
|
|
252
|
+
type: 'privilege_escalation',
|
|
253
|
+
severity: 'critical',
|
|
254
|
+
message: `Privilege escalation pattern detected: "${match[0]}"`,
|
|
255
|
+
location: line.trim().slice(0, 100),
|
|
256
|
+
lineNumber: index + 1,
|
|
257
|
+
category: 'privilege_escalation',
|
|
258
|
+
});
|
|
259
|
+
break; // One finding per line
|
|
260
|
+
}
|
|
261
|
+
}
|
|
262
|
+
});
|
|
263
|
+
return findings;
|
|
264
|
+
}
|
|
265
|
+
/**
|
|
266
|
+
* SMI-685: Calculate risk score from findings
|
|
267
|
+
* Aggregates multiple findings into a risk score from 0-100
|
|
268
|
+
* @param findings - Array of security findings
|
|
269
|
+
* @returns Risk score breakdown and total
|
|
270
|
+
*/
|
|
271
|
+
calculateRiskScore(findings) {
|
|
272
|
+
const breakdown = {
|
|
273
|
+
jailbreak: 0,
|
|
274
|
+
socialEngineering: 0,
|
|
275
|
+
promptLeaking: 0,
|
|
276
|
+
dataExfiltration: 0,
|
|
277
|
+
privilegeEscalation: 0,
|
|
278
|
+
suspiciousCode: 0,
|
|
279
|
+
sensitivePaths: 0,
|
|
280
|
+
externalUrls: 0,
|
|
281
|
+
};
|
|
282
|
+
// Calculate raw scores by category
|
|
283
|
+
for (const finding of findings) {
|
|
284
|
+
const severityWeight = SEVERITY_WEIGHTS[finding.severity];
|
|
285
|
+
const categoryWeight = CATEGORY_WEIGHTS[finding.type] ?? 1.0;
|
|
286
|
+
const score = severityWeight * categoryWeight;
|
|
287
|
+
switch (finding.type) {
|
|
288
|
+
case 'jailbreak':
|
|
289
|
+
breakdown.jailbreak += score;
|
|
290
|
+
break;
|
|
291
|
+
case 'social_engineering':
|
|
292
|
+
breakdown.socialEngineering += score;
|
|
293
|
+
break;
|
|
294
|
+
case 'prompt_leaking':
|
|
295
|
+
breakdown.promptLeaking += score;
|
|
296
|
+
break;
|
|
297
|
+
case 'data_exfiltration':
|
|
298
|
+
breakdown.dataExfiltration += score;
|
|
299
|
+
break;
|
|
300
|
+
case 'privilege_escalation':
|
|
301
|
+
breakdown.privilegeEscalation += score;
|
|
302
|
+
break;
|
|
303
|
+
case 'suspicious_pattern':
|
|
304
|
+
breakdown.suspiciousCode += score;
|
|
305
|
+
break;
|
|
306
|
+
case 'sensitive_path':
|
|
307
|
+
breakdown.sensitivePaths += score;
|
|
308
|
+
break;
|
|
309
|
+
case 'url':
|
|
310
|
+
breakdown.externalUrls += score;
|
|
311
|
+
break;
|
|
312
|
+
}
|
|
313
|
+
}
|
|
314
|
+
// Cap each category at 100
|
|
315
|
+
breakdown.jailbreak = Math.min(100, breakdown.jailbreak);
|
|
316
|
+
breakdown.socialEngineering = Math.min(100, breakdown.socialEngineering);
|
|
317
|
+
breakdown.promptLeaking = Math.min(100, breakdown.promptLeaking);
|
|
318
|
+
breakdown.dataExfiltration = Math.min(100, breakdown.dataExfiltration);
|
|
319
|
+
breakdown.privilegeEscalation = Math.min(100, breakdown.privilegeEscalation);
|
|
320
|
+
breakdown.suspiciousCode = Math.min(100, breakdown.suspiciousCode);
|
|
321
|
+
breakdown.sensitivePaths = Math.min(100, breakdown.sensitivePaths);
|
|
322
|
+
breakdown.externalUrls = Math.min(100, breakdown.externalUrls);
|
|
323
|
+
// Calculate total as weighted average, capped at 100
|
|
324
|
+
const total = Math.min(100, Math.round(breakdown.jailbreak * 0.25 +
|
|
325
|
+
breakdown.socialEngineering * 0.15 +
|
|
326
|
+
breakdown.promptLeaking * 0.15 +
|
|
327
|
+
breakdown.dataExfiltration * 0.12 +
|
|
328
|
+
breakdown.privilegeEscalation * 0.13 +
|
|
329
|
+
breakdown.suspiciousCode * 0.1 +
|
|
330
|
+
breakdown.sensitivePaths * 0.05 +
|
|
331
|
+
breakdown.externalUrls * 0.05));
|
|
332
|
+
return { total, breakdown };
|
|
333
|
+
}
|
|
334
|
+
/**
|
|
335
|
+
* Perform full security scan
|
|
336
|
+
* SMI-685: Enhanced with new pattern detection and risk scoring
|
|
337
|
+
*/
|
|
338
|
+
scan(skillId, content) {
|
|
339
|
+
const startTime = performance.now();
|
|
340
|
+
const findings = [];
|
|
341
|
+
// Check content length
|
|
342
|
+
if (content.length > this.maxContentLength) {
|
|
343
|
+
findings.push({
|
|
344
|
+
type: 'suspicious_pattern',
|
|
345
|
+
severity: 'low',
|
|
346
|
+
message: `Content exceeds maximum length (${this.maxContentLength} bytes)`,
|
|
347
|
+
});
|
|
348
|
+
}
|
|
349
|
+
// Run all scans (original)
|
|
350
|
+
findings.push(...this.scanUrls(content));
|
|
351
|
+
findings.push(...this.scanSensitivePaths(content));
|
|
352
|
+
findings.push(...this.scanJailbreakPatterns(content));
|
|
353
|
+
findings.push(...this.scanSuspiciousPatterns(content));
|
|
354
|
+
// SMI-685: Run new scans
|
|
355
|
+
findings.push(...this.scanSocialEngineering(content));
|
|
356
|
+
findings.push(...this.scanPromptLeaking(content));
|
|
357
|
+
findings.push(...this.scanDataExfiltration(content));
|
|
358
|
+
findings.push(...this.scanPrivilegeEscalation(content));
|
|
359
|
+
const endTime = performance.now();
|
|
360
|
+
// SMI-685: Calculate risk score
|
|
361
|
+
const { total: riskScore, breakdown: riskBreakdown } = this.calculateRiskScore(findings);
|
|
362
|
+
// Determine if scan passed based on risk threshold and severity
|
|
363
|
+
const hasCritical = findings.some((f) => f.severity === 'critical');
|
|
364
|
+
const hasHigh = findings.some((f) => f.severity === 'high');
|
|
365
|
+
const exceedsThreshold = riskScore >= this.riskThreshold;
|
|
366
|
+
return {
|
|
367
|
+
skillId,
|
|
368
|
+
passed: !hasCritical && !hasHigh && !exceedsThreshold,
|
|
369
|
+
findings,
|
|
370
|
+
scannedAt: new Date(),
|
|
371
|
+
scanDurationMs: endTime - startTime,
|
|
372
|
+
riskScore,
|
|
373
|
+
riskBreakdown,
|
|
374
|
+
};
|
|
375
|
+
}
|
|
376
|
+
/**
|
|
377
|
+
* Quick check without full scan
|
|
378
|
+
* SMI-882: Uses safeRegexCheck to prevent ReDoS
|
|
379
|
+
*/
|
|
380
|
+
quickCheck(content) {
|
|
381
|
+
// Check for critical patterns only
|
|
382
|
+
for (const pattern of JAILBREAK_PATTERNS) {
|
|
383
|
+
// SMI-882: Use safe regex check with length limit
|
|
384
|
+
if (safeRegexCheck(pattern, content))
|
|
385
|
+
return false;
|
|
386
|
+
}
|
|
387
|
+
return true;
|
|
388
|
+
}
|
|
389
|
+
/**
|
|
390
|
+
* Add allowed domain
|
|
391
|
+
*/
|
|
392
|
+
addAllowedDomain(domain) {
|
|
393
|
+
this.allowedDomains.add(domain.toLowerCase());
|
|
394
|
+
}
|
|
395
|
+
/**
|
|
396
|
+
* Add blocked pattern
|
|
397
|
+
*/
|
|
398
|
+
addBlockedPattern(pattern) {
|
|
399
|
+
this.blockedPatterns.push(pattern);
|
|
400
|
+
}
|
|
401
|
+
}
|
|
402
|
+
export default SecurityScanner;
|
|
403
|
+
//# sourceMappingURL=SecurityScanner.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SecurityScanner.js","sourceRoot":"","sources":["../../../../src/security/scanner/SecurityScanner.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Security Scanner Module - SMI-587, SMI-685, SMI-882, SMI-1189
|
|
3
|
+
*
|
|
4
|
+
* Re-exports for security scanning functionality.
|
|
5
|
+
*/
|
|
6
|
+
export type { SecurityFindingType, SecuritySeverity, SecurityFinding, RiskScoreBreakdown, ScanReport, ScannerOptions, } from './types.js';
|
|
7
|
+
export { DEFAULT_ALLOWED_DOMAINS, SENSITIVE_PATH_PATTERNS, JAILBREAK_PATTERNS, SUSPICIOUS_PATTERNS, SOCIAL_ENGINEERING_PATTERNS, PROMPT_LEAKING_PATTERNS, DATA_EXFILTRATION_PATTERNS, PRIVILEGE_ESCALATION_PATTERNS, } from './patterns.js';
|
|
8
|
+
export { SEVERITY_WEIGHTS, CATEGORY_WEIGHTS } from './weights.js';
|
|
9
|
+
export { MAX_LINE_LENGTH_FOR_REGEX, safeRegexTest, safeRegexCheck } from './regex-utils.js';
|
|
10
|
+
export { SecurityScanner, default } from './SecurityScanner.js';
|
|
11
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/security/scanner/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,YAAY,EACV,mBAAmB,EACnB,gBAAgB,EAChB,eAAe,EACf,kBAAkB,EAClB,UAAU,EACV,cAAc,GACf,MAAM,YAAY,CAAA;AAGnB,OAAO,EACL,uBAAuB,EACvB,uBAAuB,EACvB,kBAAkB,EAClB,mBAAmB,EACnB,2BAA2B,EAC3B,uBAAuB,EACvB,0BAA0B,EAC1B,6BAA6B,GAC9B,MAAM,eAAe,CAAA;AAGtB,OAAO,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAA;AAGjE,OAAO,EAAE,yBAAyB,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAA;AAG3F,OAAO,EAAE,eAAe,EAAE,OAAO,EAAE,MAAM,sBAAsB,CAAA"}
|