@sandrobuilds/tracerney 0.9.6
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 +702 -0
- package/dist/application/ShieldApplicationService.d.ts +94 -0
- package/dist/application/ShieldApplicationService.d.ts.map +1 -0
- package/dist/application/ShieldApplicationService.js +223 -0
- package/dist/application/ShieldApplicationService.js.map +1 -0
- package/dist/application/ShieldBlockError.d.ts +10 -0
- package/dist/application/ShieldBlockError.d.ts.map +1 -0
- package/dist/application/ShieldBlockError.js +13 -0
- package/dist/application/ShieldBlockError.js.map +1 -0
- package/dist/application/index.d.ts +9 -0
- package/dist/application/index.d.ts.map +1 -0
- package/dist/application/index.js +8 -0
- package/dist/application/index.js.map +1 -0
- package/dist/application/ports/ILLMProvider.d.ts +71 -0
- package/dist/application/ports/ILLMProvider.d.ts.map +1 -0
- package/dist/application/ports/ILLMProvider.js +15 -0
- package/dist/application/ports/ILLMProvider.js.map +1 -0
- package/dist/application/ports/IPatternRepository.d.ts +20 -0
- package/dist/application/ports/IPatternRepository.d.ts.map +1 -0
- package/dist/application/ports/IPatternRepository.js +7 -0
- package/dist/application/ports/IPatternRepository.js.map +1 -0
- package/dist/application/ports/ISentinel.d.ts +22 -0
- package/dist/application/ports/ISentinel.d.ts.map +1 -0
- package/dist/application/ports/ISentinel.js +8 -0
- package/dist/application/ports/ISentinel.js.map +1 -0
- package/dist/application/ports/ITelemetrySink.d.ts +35 -0
- package/dist/application/ports/ITelemetrySink.d.ts.map +1 -0
- package/dist/application/ports/ITelemetrySink.js +7 -0
- package/dist/application/ports/ITelemetrySink.js.map +1 -0
- package/dist/application/ports/index.d.ts +10 -0
- package/dist/application/ports/index.d.ts.map +1 -0
- package/dist/application/ports/index.js +7 -0
- package/dist/application/ports/index.js.map +1 -0
- package/dist/application/utils/index.d.ts +6 -0
- package/dist/application/utils/index.d.ts.map +1 -0
- package/dist/application/utils/index.js +6 -0
- package/dist/application/utils/index.js.map +1 -0
- package/dist/application/utils/jitter.d.ts +10 -0
- package/dist/application/utils/jitter.d.ts.map +1 -0
- package/dist/application/utils/jitter.js +13 -0
- package/dist/application/utils/jitter.js.map +1 -0
- package/dist/application/utils/normalizePrompt.d.ts +18 -0
- package/dist/application/utils/normalizePrompt.d.ts.map +1 -0
- package/dist/application/utils/normalizePrompt.js +36 -0
- package/dist/application/utils/normalizePrompt.js.map +1 -0
- package/dist/domain/detection/InjectionThreat.d.ts +19 -0
- package/dist/domain/detection/InjectionThreat.d.ts.map +1 -0
- package/dist/domain/detection/InjectionThreat.js +18 -0
- package/dist/domain/detection/InjectionThreat.js.map +1 -0
- package/dist/domain/detection/PatternMatcher.d.ts +36 -0
- package/dist/domain/detection/PatternMatcher.d.ts.map +1 -0
- package/dist/domain/detection/PatternMatcher.js +65 -0
- package/dist/domain/detection/PatternMatcher.js.map +1 -0
- package/dist/domain/detection/VanguardPattern.d.ts +19 -0
- package/dist/domain/detection/VanguardPattern.d.ts.map +1 -0
- package/dist/domain/detection/VanguardPattern.js +21 -0
- package/dist/domain/detection/VanguardPattern.js.map +1 -0
- package/dist/domain/detection/index.d.ts +11 -0
- package/dist/domain/detection/index.d.ts.map +1 -0
- package/dist/domain/detection/index.js +8 -0
- package/dist/domain/detection/index.js.map +1 -0
- package/dist/domain/events/SecurityEvent.d.ts +30 -0
- package/dist/domain/events/SecurityEvent.d.ts.map +1 -0
- package/dist/domain/events/SecurityEvent.js +21 -0
- package/dist/domain/events/SecurityEvent.js.map +1 -0
- package/dist/domain/events/SecurityEventType.d.ts +13 -0
- package/dist/domain/events/SecurityEventType.d.ts.map +1 -0
- package/dist/domain/events/SecurityEventType.js +15 -0
- package/dist/domain/events/SecurityEventType.js.map +1 -0
- package/dist/domain/events/ThreatSeverity.d.ts +13 -0
- package/dist/domain/events/ThreatSeverity.d.ts.map +1 -0
- package/dist/domain/events/ThreatSeverity.js +15 -0
- package/dist/domain/events/ThreatSeverity.js.map +1 -0
- package/dist/domain/events/index.d.ts +11 -0
- package/dist/domain/events/index.d.ts.map +1 -0
- package/dist/domain/events/index.js +8 -0
- package/dist/domain/events/index.js.map +1 -0
- package/dist/domain/guard/ToolGuard.d.ts +35 -0
- package/dist/domain/guard/ToolGuard.d.ts.map +1 -0
- package/dist/domain/guard/ToolGuard.js +49 -0
- package/dist/domain/guard/ToolGuard.js.map +1 -0
- package/dist/domain/guard/ToolPolicy.d.ts +16 -0
- package/dist/domain/guard/ToolPolicy.d.ts.map +1 -0
- package/dist/domain/guard/ToolPolicy.js +19 -0
- package/dist/domain/guard/ToolPolicy.js.map +1 -0
- package/dist/domain/guard/ToolViolation.d.ts +14 -0
- package/dist/domain/guard/ToolViolation.d.ts.map +1 -0
- package/dist/domain/guard/ToolViolation.js +15 -0
- package/dist/domain/guard/ToolViolation.js.map +1 -0
- package/dist/domain/guard/index.d.ts +11 -0
- package/dist/domain/guard/index.d.ts.map +1 -0
- package/dist/domain/guard/index.js +8 -0
- package/dist/domain/guard/index.js.map +1 -0
- package/dist/index.d.ts +168 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +173 -0
- package/dist/index.js.map +1 -0
- package/dist/infrastructure/llm/OpenRouterProvider.d.ts +32 -0
- package/dist/infrastructure/llm/OpenRouterProvider.d.ts.map +1 -0
- package/dist/infrastructure/llm/OpenRouterProvider.js +119 -0
- package/dist/infrastructure/llm/OpenRouterProvider.js.map +1 -0
- package/dist/infrastructure/llm/index.d.ts +7 -0
- package/dist/infrastructure/llm/index.d.ts.map +1 -0
- package/dist/infrastructure/llm/index.js +6 -0
- package/dist/infrastructure/llm/index.js.map +1 -0
- package/dist/infrastructure/patterns/BundledPatternRepository.d.ts +16 -0
- package/dist/infrastructure/patterns/BundledPatternRepository.d.ts.map +1 -0
- package/dist/infrastructure/patterns/BundledPatternRepository.js +19 -0
- package/dist/infrastructure/patterns/BundledPatternRepository.js.map +1 -0
- package/dist/infrastructure/patterns/RemotePatternRepository.d.ts +77 -0
- package/dist/infrastructure/patterns/RemotePatternRepository.d.ts.map +1 -0
- package/dist/infrastructure/patterns/RemotePatternRepository.js +176 -0
- package/dist/infrastructure/patterns/RemotePatternRepository.js.map +1 -0
- package/dist/infrastructure/patterns/bundled-patterns.d.ts +9 -0
- package/dist/infrastructure/patterns/bundled-patterns.d.ts.map +1 -0
- package/dist/infrastructure/patterns/bundled-patterns.js +2082 -0
- package/dist/infrastructure/patterns/bundled-patterns.js.map +1 -0
- package/dist/infrastructure/patterns/index.d.ts +9 -0
- package/dist/infrastructure/patterns/index.d.ts.map +1 -0
- package/dist/infrastructure/patterns/index.js +8 -0
- package/dist/infrastructure/patterns/index.js.map +1 -0
- package/dist/infrastructure/sentinel/LLMSentinel.d.ts +48 -0
- package/dist/infrastructure/sentinel/LLMSentinel.d.ts.map +1 -0
- package/dist/infrastructure/sentinel/LLMSentinel.js +142 -0
- package/dist/infrastructure/sentinel/LLMSentinel.js.map +1 -0
- package/dist/infrastructure/telemetry/HttpShadowLogSink.d.ts +30 -0
- package/dist/infrastructure/telemetry/HttpShadowLogSink.d.ts.map +1 -0
- package/dist/infrastructure/telemetry/HttpShadowLogSink.js +40 -0
- package/dist/infrastructure/telemetry/HttpShadowLogSink.js.map +1 -0
- package/dist/infrastructure/telemetry/HttpSignalSink.d.ts +51 -0
- package/dist/infrastructure/telemetry/HttpSignalSink.d.ts.map +1 -0
- package/dist/infrastructure/telemetry/HttpSignalSink.js +134 -0
- package/dist/infrastructure/telemetry/HttpSignalSink.js.map +1 -0
- package/dist/infrastructure/telemetry/index.d.ts +9 -0
- package/dist/infrastructure/telemetry/index.d.ts.map +1 -0
- package/dist/infrastructure/telemetry/index.js +7 -0
- package/dist/infrastructure/telemetry/index.js.map +1 -0
- package/package.json +44 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/infrastructure/llm/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Bundled Pattern Repository
|
|
3
|
+
* Adapter: implements IPatternRepository for local bundled patterns
|
|
4
|
+
* Synchronous internally, async interface for compatibility
|
|
5
|
+
*/
|
|
6
|
+
import { IPatternRepository } from "../../application/ports/IPatternRepository";
|
|
7
|
+
import { VanguardPattern } from "../../domain/detection/VanguardPattern";
|
|
8
|
+
export declare class BundledPatternRepository implements IPatternRepository {
|
|
9
|
+
readonly sourceIdentifier = "bundled@0.3.0";
|
|
10
|
+
/**
|
|
11
|
+
* Load bundled patterns.
|
|
12
|
+
* Synchronous internally, but wrapped in Promise for interface compatibility.
|
|
13
|
+
*/
|
|
14
|
+
getPatterns(): Promise<readonly VanguardPattern[]>;
|
|
15
|
+
}
|
|
16
|
+
//# sourceMappingURL=BundledPatternRepository.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"BundledPatternRepository.d.ts","sourceRoot":"","sources":["../../../src/infrastructure/patterns/BundledPatternRepository.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,kBAAkB,EAAE,MAAM,4CAA4C,CAAC;AAChF,OAAO,EAAE,eAAe,EAAE,MAAM,wCAAwC,CAAC;AAGzE,qBAAa,wBAAyB,YAAW,kBAAkB;IACjE,QAAQ,CAAC,gBAAgB,mBAAyC;IAElE;;;OAGG;IACG,WAAW,IAAI,OAAO,CAAC,SAAS,eAAe,EAAE,CAAC;CAGzD"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Bundled Pattern Repository
|
|
3
|
+
* Adapter: implements IPatternRepository for local bundled patterns
|
|
4
|
+
* Synchronous internally, async interface for compatibility
|
|
5
|
+
*/
|
|
6
|
+
import { BUNDLED_PATTERNS, BUNDLED_MANIFEST_VERSION } from './bundled-patterns.js';
|
|
7
|
+
export class BundledPatternRepository {
|
|
8
|
+
constructor() {
|
|
9
|
+
this.sourceIdentifier = `bundled@${BUNDLED_MANIFEST_VERSION}`;
|
|
10
|
+
}
|
|
11
|
+
/**
|
|
12
|
+
* Load bundled patterns.
|
|
13
|
+
* Synchronous internally, but wrapped in Promise for interface compatibility.
|
|
14
|
+
*/
|
|
15
|
+
async getPatterns() {
|
|
16
|
+
return BUNDLED_PATTERNS;
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
//# sourceMappingURL=BundledPatternRepository.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"BundledPatternRepository.js","sourceRoot":"","sources":["../../../src/infrastructure/patterns/BundledPatternRepository.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAIH,OAAO,EAAE,gBAAgB,EAAE,wBAAwB,EAAE,MAAM,oBAAoB,CAAC;AAEhF,MAAM,OAAO,wBAAwB;IAArC;QACW,qBAAgB,GAAG,WAAW,wBAAwB,EAAE,CAAC;IASpE,CAAC;IAPC;;;OAGG;IACH,KAAK,CAAC,WAAW;QACf,OAAO,gBAAgB,CAAC;IAC1B,CAAC;CACF"}
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Remote Pattern Repository
|
|
3
|
+
* Adapter: implements IPatternRepository for remote manifest fetching
|
|
4
|
+
* Fixes Gap 1: takes fallback repository in constructor, uses explicit fallback on failure
|
|
5
|
+
*/
|
|
6
|
+
import { IPatternRepository } from "../../application/ports/IPatternRepository";
|
|
7
|
+
import { VanguardPattern, PatternCategory } from "../../domain/detection/VanguardPattern";
|
|
8
|
+
/**
|
|
9
|
+
* Serialized pattern format from manifest JSON
|
|
10
|
+
* Regex patterns are stored as strings with separate flags field
|
|
11
|
+
*/
|
|
12
|
+
interface SerializedPattern {
|
|
13
|
+
readonly id: string;
|
|
14
|
+
readonly name: string;
|
|
15
|
+
readonly pattern: string;
|
|
16
|
+
readonly flags?: string;
|
|
17
|
+
readonly severity: string;
|
|
18
|
+
readonly description: string;
|
|
19
|
+
readonly category: PatternCategory;
|
|
20
|
+
}
|
|
21
|
+
export interface RemoteManifestDefinition {
|
|
22
|
+
readonly version: string;
|
|
23
|
+
readonly releaseDate: number;
|
|
24
|
+
readonly patterns: readonly (VanguardPattern | SerializedPattern)[];
|
|
25
|
+
readonly checksum?: string;
|
|
26
|
+
}
|
|
27
|
+
export interface RemotePatternRepositoryConfig {
|
|
28
|
+
manifestUrl: string;
|
|
29
|
+
fallbackRepository: IPatternRepository;
|
|
30
|
+
cacheTTLMs?: number;
|
|
31
|
+
staleWhileRevalidateMs?: number;
|
|
32
|
+
}
|
|
33
|
+
export declare class RemotePatternRepository implements IPatternRepository {
|
|
34
|
+
private readonly config;
|
|
35
|
+
readonly sourceIdentifier: string;
|
|
36
|
+
private localManifest;
|
|
37
|
+
private cachedPatterns;
|
|
38
|
+
private metadata;
|
|
39
|
+
private isFetching;
|
|
40
|
+
private readonly cacheTTL;
|
|
41
|
+
private readonly staleWhileRevalidate;
|
|
42
|
+
constructor(config: RemotePatternRepositoryConfig);
|
|
43
|
+
/**
|
|
44
|
+
* Deserialize patterns from JSON manifest
|
|
45
|
+
* Converts string patterns to RegExp objects
|
|
46
|
+
*/
|
|
47
|
+
private deserializePatterns;
|
|
48
|
+
/**
|
|
49
|
+
* Convert string severity to ThreatSeverity enum
|
|
50
|
+
*/
|
|
51
|
+
private parseSeverity;
|
|
52
|
+
/**
|
|
53
|
+
* Get patterns: three-tier strategy
|
|
54
|
+
* 1. Fresh cache: return immediately
|
|
55
|
+
* 2. Stale cache: return stale version, fetch new in background
|
|
56
|
+
* 3. No cache: fetch new, fall back to bundled repository on failure
|
|
57
|
+
*/
|
|
58
|
+
getPatterns(): Promise<readonly VanguardPattern[]>;
|
|
59
|
+
/**
|
|
60
|
+
* Fetch manifest from remote URL
|
|
61
|
+
*/
|
|
62
|
+
private fetchManifest;
|
|
63
|
+
private isFresh;
|
|
64
|
+
private isStale;
|
|
65
|
+
private updateMetadata;
|
|
66
|
+
private computeHash;
|
|
67
|
+
getStatus(): {
|
|
68
|
+
currentVersion: string | null;
|
|
69
|
+
cachedAt: number | null;
|
|
70
|
+
expiresAt: number | null;
|
|
71
|
+
isFresh: boolean;
|
|
72
|
+
isStale: boolean;
|
|
73
|
+
isFetching: boolean;
|
|
74
|
+
};
|
|
75
|
+
}
|
|
76
|
+
export {};
|
|
77
|
+
//# sourceMappingURL=RemotePatternRepository.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"RemotePatternRepository.d.ts","sourceRoot":"","sources":["../../../src/infrastructure/patterns/RemotePatternRepository.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,kBAAkB,EAAE,MAAM,4CAA4C,CAAC;AAChF,OAAO,EAAE,eAAe,EAAE,eAAe,EAAE,MAAM,wCAAwC,CAAC;AAM1F;;;GAGG;AACH,UAAU,iBAAiB;IACzB,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,QAAQ,EAAE,eAAe,CAAC;CACpC;AAED,MAAM,WAAW,wBAAwB;IACvC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,QAAQ,EAAE,SAAS,CAAC,eAAe,GAAG,iBAAiB,CAAC,EAAE,CAAC;IACpE,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;CAC5B;AAED,MAAM,WAAW,6BAA6B;IAC5C,WAAW,EAAE,MAAM,CAAC;IACpB,kBAAkB,EAAE,kBAAkB,CAAC;IACvC,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,sBAAsB,CAAC,EAAE,MAAM,CAAC;CACjC;AAED,qBAAa,uBAAwB,YAAW,kBAAkB;IAcpD,OAAO,CAAC,QAAQ,CAAC,MAAM;IAbnC,QAAQ,CAAC,gBAAgB,EAAE,MAAM,CAAC;IAElC,OAAO,CAAC,aAAa,CAAyC;IAC9D,OAAO,CAAC,cAAc,CAA2C;IACjE,OAAO,CAAC,QAAQ,CAIA;IAChB,OAAO,CAAC,UAAU,CAAS;IAC3B,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAS;IAClC,OAAO,CAAC,QAAQ,CAAC,oBAAoB,CAAS;gBAEjB,MAAM,EAAE,6BAA6B;IAMlE;;;OAGG;IACH,OAAO,CAAC,mBAAmB;IAuB3B;;OAEG;IACH,OAAO,CAAC,aAAa;IAcrB;;;;;OAKG;IACG,WAAW,IAAI,OAAO,CAAC,SAAS,eAAe,EAAE,CAAC;IAkCxD;;OAEG;YACW,aAAa;IAgD3B,OAAO,CAAC,OAAO;IAKf,OAAO,CAAC,OAAO;IASf,OAAO,CAAC,cAAc;YASR,WAAW;IAWzB,SAAS;;;;;;;;CAUV"}
|
|
@@ -0,0 +1,176 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Remote Pattern Repository
|
|
3
|
+
* Adapter: implements IPatternRepository for remote manifest fetching
|
|
4
|
+
* Fixes Gap 1: takes fallback repository in constructor, uses explicit fallback on failure
|
|
5
|
+
*/
|
|
6
|
+
import { ThreatSeverity } from '../../domain/events/ThreatSeverity.js';
|
|
7
|
+
const DEFAULT_CACHE_TTL = 24 * 60 * 60 * 1000; // 24 hours
|
|
8
|
+
const DEFAULT_STALE_WHILE_REVALIDATE = 7 * 24 * 60 * 60 * 1000; // 7 days
|
|
9
|
+
export class RemotePatternRepository {
|
|
10
|
+
constructor(config) {
|
|
11
|
+
this.config = config;
|
|
12
|
+
this.localManifest = null;
|
|
13
|
+
this.cachedPatterns = null;
|
|
14
|
+
this.metadata = null;
|
|
15
|
+
this.isFetching = false;
|
|
16
|
+
this.sourceIdentifier = `remote:${config.manifestUrl}`;
|
|
17
|
+
this.cacheTTL = config.cacheTTLMs ?? DEFAULT_CACHE_TTL;
|
|
18
|
+
this.staleWhileRevalidate = config.staleWhileRevalidateMs ?? DEFAULT_STALE_WHILE_REVALIDATE;
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* Deserialize patterns from JSON manifest
|
|
22
|
+
* Converts string patterns to RegExp objects
|
|
23
|
+
*/
|
|
24
|
+
deserializePatterns(patterns) {
|
|
25
|
+
return patterns.map((p) => {
|
|
26
|
+
// If already a VanguardPattern (has RegExp), return as-is
|
|
27
|
+
if (p.pattern instanceof RegExp) {
|
|
28
|
+
return p;
|
|
29
|
+
}
|
|
30
|
+
// Convert serialized pattern to VanguardPattern
|
|
31
|
+
const serialized = p;
|
|
32
|
+
const regex = new RegExp(serialized.pattern, serialized.flags ?? "");
|
|
33
|
+
const severity = this.parseSeverity(serialized.severity);
|
|
34
|
+
return {
|
|
35
|
+
id: serialized.id,
|
|
36
|
+
name: serialized.name,
|
|
37
|
+
pattern: regex,
|
|
38
|
+
severity,
|
|
39
|
+
description: serialized.description,
|
|
40
|
+
category: serialized.category,
|
|
41
|
+
};
|
|
42
|
+
});
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* Convert string severity to ThreatSeverity enum
|
|
46
|
+
*/
|
|
47
|
+
parseSeverity(severity) {
|
|
48
|
+
switch (severity.toLowerCase()) {
|
|
49
|
+
case "critical":
|
|
50
|
+
return ThreatSeverity.CRITICAL;
|
|
51
|
+
case "high":
|
|
52
|
+
return ThreatSeverity.HIGH;
|
|
53
|
+
case "medium":
|
|
54
|
+
return ThreatSeverity.MEDIUM;
|
|
55
|
+
case "low":
|
|
56
|
+
default:
|
|
57
|
+
return ThreatSeverity.LOW;
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
/**
|
|
61
|
+
* Get patterns: three-tier strategy
|
|
62
|
+
* 1. Fresh cache: return immediately
|
|
63
|
+
* 2. Stale cache: return stale version, fetch new in background
|
|
64
|
+
* 3. No cache: fetch new, fall back to bundled repository on failure
|
|
65
|
+
*/
|
|
66
|
+
async getPatterns() {
|
|
67
|
+
// Tier 1: Fresh cached version
|
|
68
|
+
if (this.cachedPatterns && this.isFresh()) {
|
|
69
|
+
return this.cachedPatterns;
|
|
70
|
+
}
|
|
71
|
+
// Tier 2: Stale cache but usable
|
|
72
|
+
if (this.cachedPatterns && this.isStale()) {
|
|
73
|
+
// Background refresh (non-blocking)
|
|
74
|
+
this.fetchManifest().catch((err) => {
|
|
75
|
+
console.debug("[Tracerny] Background manifest update failed:", err);
|
|
76
|
+
});
|
|
77
|
+
return this.cachedPatterns;
|
|
78
|
+
}
|
|
79
|
+
// Tier 3: No cache or expired — must fetch
|
|
80
|
+
if (!this.isFetching) {
|
|
81
|
+
try {
|
|
82
|
+
await this.fetchManifest();
|
|
83
|
+
return this.cachedPatterns;
|
|
84
|
+
}
|
|
85
|
+
catch (err) {
|
|
86
|
+
// FIX GAP 1: explicit fallback to bundled repository on fetch failure
|
|
87
|
+
console.warn("[Tracerny] Remote manifest fetch failed, falling back to bundled patterns:", err);
|
|
88
|
+
return this.config.fallbackRepository.getPatterns();
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
// Fetch already in progress, use bundled fallback
|
|
92
|
+
return this.config.fallbackRepository.getPatterns();
|
|
93
|
+
}
|
|
94
|
+
/**
|
|
95
|
+
* Fetch manifest from remote URL
|
|
96
|
+
*/
|
|
97
|
+
async fetchManifest() {
|
|
98
|
+
if (this.isFetching) {
|
|
99
|
+
throw new Error("[RemotePatternRepository] Manifest fetch already in progress");
|
|
100
|
+
}
|
|
101
|
+
this.isFetching = true;
|
|
102
|
+
try {
|
|
103
|
+
const response = await fetch(this.config.manifestUrl, {
|
|
104
|
+
method: "GET",
|
|
105
|
+
headers: {
|
|
106
|
+
Accept: "application/json",
|
|
107
|
+
"Cache-Control": "max-age=3600",
|
|
108
|
+
},
|
|
109
|
+
});
|
|
110
|
+
if (!response.ok) {
|
|
111
|
+
throw new Error(`[RemotePatternRepository] Fetch returned ${response.status}: ${response.statusText}`);
|
|
112
|
+
}
|
|
113
|
+
const manifest = (await response.json());
|
|
114
|
+
// Validate
|
|
115
|
+
if (!manifest.version || !Array.isArray(manifest.patterns)) {
|
|
116
|
+
throw new Error("[RemotePatternRepository] Invalid manifest structure");
|
|
117
|
+
}
|
|
118
|
+
// Optional checksum verification (placeholder)
|
|
119
|
+
if (manifest.checksum && manifest.checksum !== "auto-calculated-by-server") {
|
|
120
|
+
const hash = await this.computeHash(JSON.stringify(manifest.patterns));
|
|
121
|
+
if (hash !== manifest.checksum) {
|
|
122
|
+
throw new Error("[RemotePatternRepository] Checksum verification failed");
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
// Deserialize patterns from JSON format
|
|
126
|
+
this.cachedPatterns = this.deserializePatterns(manifest.patterns);
|
|
127
|
+
this.localManifest = manifest;
|
|
128
|
+
this.updateMetadata(manifest.version);
|
|
129
|
+
return manifest;
|
|
130
|
+
}
|
|
131
|
+
finally {
|
|
132
|
+
this.isFetching = false;
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
isFresh() {
|
|
136
|
+
if (!this.metadata)
|
|
137
|
+
return false;
|
|
138
|
+
return Date.now() < this.metadata.expiresAt;
|
|
139
|
+
}
|
|
140
|
+
isStale() {
|
|
141
|
+
if (!this.metadata)
|
|
142
|
+
return true;
|
|
143
|
+
const now = Date.now();
|
|
144
|
+
return (now >= this.metadata.expiresAt &&
|
|
145
|
+
now < this.metadata.fetchedAt + this.staleWhileRevalidate);
|
|
146
|
+
}
|
|
147
|
+
updateMetadata(version) {
|
|
148
|
+
const now = Date.now();
|
|
149
|
+
this.metadata = {
|
|
150
|
+
version,
|
|
151
|
+
fetchedAt: now,
|
|
152
|
+
expiresAt: now + this.cacheTTL,
|
|
153
|
+
};
|
|
154
|
+
}
|
|
155
|
+
async computeHash(data) {
|
|
156
|
+
// Placeholder — in real implementation, use Node.js crypto or SubtleCrypto
|
|
157
|
+
let hash = 0;
|
|
158
|
+
for (let i = 0; i < data.length; i++) {
|
|
159
|
+
const char = data.charCodeAt(i);
|
|
160
|
+
hash = (hash << 5) - hash + char;
|
|
161
|
+
hash = hash & hash;
|
|
162
|
+
}
|
|
163
|
+
return Math.abs(hash).toString(16);
|
|
164
|
+
}
|
|
165
|
+
getStatus() {
|
|
166
|
+
return {
|
|
167
|
+
currentVersion: this.metadata?.version || null,
|
|
168
|
+
cachedAt: this.metadata?.fetchedAt || null,
|
|
169
|
+
expiresAt: this.metadata?.expiresAt || null,
|
|
170
|
+
isFresh: this.isFresh(),
|
|
171
|
+
isStale: this.isStale(),
|
|
172
|
+
isFetching: this.isFetching,
|
|
173
|
+
};
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
//# sourceMappingURL=RemotePatternRepository.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"RemotePatternRepository.js","sourceRoot":"","sources":["../../../src/infrastructure/patterns/RemotePatternRepository.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Bundled Patterns
|
|
3
|
+
* Single source of truth for the 20 default injection detection patterns
|
|
4
|
+
* Fixes Gap 4: prevents pattern duplication between vanguard.ts and manifest.bundled.ts
|
|
5
|
+
*/
|
|
6
|
+
import { VanguardPattern } from "../../domain/detection/VanguardPattern";
|
|
7
|
+
export declare const BUNDLED_MANIFEST_VERSION = "0.3.0";
|
|
8
|
+
export declare const BUNDLED_PATTERNS: readonly VanguardPattern[];
|
|
9
|
+
//# sourceMappingURL=bundled-patterns.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bundled-patterns.d.ts","sourceRoot":"","sources":["../../../src/infrastructure/patterns/bundled-patterns.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,eAAe,EAAE,MAAM,wCAAwC,CAAC;AAGzE,eAAO,MAAM,wBAAwB,UAAU,CAAC;AAEhD,eAAO,MAAM,gBAAgB,EAAE,SAAS,eAAe,EAgiEtD,CAAC"}
|