@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.
Files changed (138) hide show
  1. package/README.md +702 -0
  2. package/dist/application/ShieldApplicationService.d.ts +94 -0
  3. package/dist/application/ShieldApplicationService.d.ts.map +1 -0
  4. package/dist/application/ShieldApplicationService.js +223 -0
  5. package/dist/application/ShieldApplicationService.js.map +1 -0
  6. package/dist/application/ShieldBlockError.d.ts +10 -0
  7. package/dist/application/ShieldBlockError.d.ts.map +1 -0
  8. package/dist/application/ShieldBlockError.js +13 -0
  9. package/dist/application/ShieldBlockError.js.map +1 -0
  10. package/dist/application/index.d.ts +9 -0
  11. package/dist/application/index.d.ts.map +1 -0
  12. package/dist/application/index.js +8 -0
  13. package/dist/application/index.js.map +1 -0
  14. package/dist/application/ports/ILLMProvider.d.ts +71 -0
  15. package/dist/application/ports/ILLMProvider.d.ts.map +1 -0
  16. package/dist/application/ports/ILLMProvider.js +15 -0
  17. package/dist/application/ports/ILLMProvider.js.map +1 -0
  18. package/dist/application/ports/IPatternRepository.d.ts +20 -0
  19. package/dist/application/ports/IPatternRepository.d.ts.map +1 -0
  20. package/dist/application/ports/IPatternRepository.js +7 -0
  21. package/dist/application/ports/IPatternRepository.js.map +1 -0
  22. package/dist/application/ports/ISentinel.d.ts +22 -0
  23. package/dist/application/ports/ISentinel.d.ts.map +1 -0
  24. package/dist/application/ports/ISentinel.js +8 -0
  25. package/dist/application/ports/ISentinel.js.map +1 -0
  26. package/dist/application/ports/ITelemetrySink.d.ts +35 -0
  27. package/dist/application/ports/ITelemetrySink.d.ts.map +1 -0
  28. package/dist/application/ports/ITelemetrySink.js +7 -0
  29. package/dist/application/ports/ITelemetrySink.js.map +1 -0
  30. package/dist/application/ports/index.d.ts +10 -0
  31. package/dist/application/ports/index.d.ts.map +1 -0
  32. package/dist/application/ports/index.js +7 -0
  33. package/dist/application/ports/index.js.map +1 -0
  34. package/dist/application/utils/index.d.ts +6 -0
  35. package/dist/application/utils/index.d.ts.map +1 -0
  36. package/dist/application/utils/index.js +6 -0
  37. package/dist/application/utils/index.js.map +1 -0
  38. package/dist/application/utils/jitter.d.ts +10 -0
  39. package/dist/application/utils/jitter.d.ts.map +1 -0
  40. package/dist/application/utils/jitter.js +13 -0
  41. package/dist/application/utils/jitter.js.map +1 -0
  42. package/dist/application/utils/normalizePrompt.d.ts +18 -0
  43. package/dist/application/utils/normalizePrompt.d.ts.map +1 -0
  44. package/dist/application/utils/normalizePrompt.js +36 -0
  45. package/dist/application/utils/normalizePrompt.js.map +1 -0
  46. package/dist/domain/detection/InjectionThreat.d.ts +19 -0
  47. package/dist/domain/detection/InjectionThreat.d.ts.map +1 -0
  48. package/dist/domain/detection/InjectionThreat.js +18 -0
  49. package/dist/domain/detection/InjectionThreat.js.map +1 -0
  50. package/dist/domain/detection/PatternMatcher.d.ts +36 -0
  51. package/dist/domain/detection/PatternMatcher.d.ts.map +1 -0
  52. package/dist/domain/detection/PatternMatcher.js +65 -0
  53. package/dist/domain/detection/PatternMatcher.js.map +1 -0
  54. package/dist/domain/detection/VanguardPattern.d.ts +19 -0
  55. package/dist/domain/detection/VanguardPattern.d.ts.map +1 -0
  56. package/dist/domain/detection/VanguardPattern.js +21 -0
  57. package/dist/domain/detection/VanguardPattern.js.map +1 -0
  58. package/dist/domain/detection/index.d.ts +11 -0
  59. package/dist/domain/detection/index.d.ts.map +1 -0
  60. package/dist/domain/detection/index.js +8 -0
  61. package/dist/domain/detection/index.js.map +1 -0
  62. package/dist/domain/events/SecurityEvent.d.ts +30 -0
  63. package/dist/domain/events/SecurityEvent.d.ts.map +1 -0
  64. package/dist/domain/events/SecurityEvent.js +21 -0
  65. package/dist/domain/events/SecurityEvent.js.map +1 -0
  66. package/dist/domain/events/SecurityEventType.d.ts +13 -0
  67. package/dist/domain/events/SecurityEventType.d.ts.map +1 -0
  68. package/dist/domain/events/SecurityEventType.js +15 -0
  69. package/dist/domain/events/SecurityEventType.js.map +1 -0
  70. package/dist/domain/events/ThreatSeverity.d.ts +13 -0
  71. package/dist/domain/events/ThreatSeverity.d.ts.map +1 -0
  72. package/dist/domain/events/ThreatSeverity.js +15 -0
  73. package/dist/domain/events/ThreatSeverity.js.map +1 -0
  74. package/dist/domain/events/index.d.ts +11 -0
  75. package/dist/domain/events/index.d.ts.map +1 -0
  76. package/dist/domain/events/index.js +8 -0
  77. package/dist/domain/events/index.js.map +1 -0
  78. package/dist/domain/guard/ToolGuard.d.ts +35 -0
  79. package/dist/domain/guard/ToolGuard.d.ts.map +1 -0
  80. package/dist/domain/guard/ToolGuard.js +49 -0
  81. package/dist/domain/guard/ToolGuard.js.map +1 -0
  82. package/dist/domain/guard/ToolPolicy.d.ts +16 -0
  83. package/dist/domain/guard/ToolPolicy.d.ts.map +1 -0
  84. package/dist/domain/guard/ToolPolicy.js +19 -0
  85. package/dist/domain/guard/ToolPolicy.js.map +1 -0
  86. package/dist/domain/guard/ToolViolation.d.ts +14 -0
  87. package/dist/domain/guard/ToolViolation.d.ts.map +1 -0
  88. package/dist/domain/guard/ToolViolation.js +15 -0
  89. package/dist/domain/guard/ToolViolation.js.map +1 -0
  90. package/dist/domain/guard/index.d.ts +11 -0
  91. package/dist/domain/guard/index.d.ts.map +1 -0
  92. package/dist/domain/guard/index.js +8 -0
  93. package/dist/domain/guard/index.js.map +1 -0
  94. package/dist/index.d.ts +168 -0
  95. package/dist/index.d.ts.map +1 -0
  96. package/dist/index.js +173 -0
  97. package/dist/index.js.map +1 -0
  98. package/dist/infrastructure/llm/OpenRouterProvider.d.ts +32 -0
  99. package/dist/infrastructure/llm/OpenRouterProvider.d.ts.map +1 -0
  100. package/dist/infrastructure/llm/OpenRouterProvider.js +119 -0
  101. package/dist/infrastructure/llm/OpenRouterProvider.js.map +1 -0
  102. package/dist/infrastructure/llm/index.d.ts +7 -0
  103. package/dist/infrastructure/llm/index.d.ts.map +1 -0
  104. package/dist/infrastructure/llm/index.js +6 -0
  105. package/dist/infrastructure/llm/index.js.map +1 -0
  106. package/dist/infrastructure/patterns/BundledPatternRepository.d.ts +16 -0
  107. package/dist/infrastructure/patterns/BundledPatternRepository.d.ts.map +1 -0
  108. package/dist/infrastructure/patterns/BundledPatternRepository.js +19 -0
  109. package/dist/infrastructure/patterns/BundledPatternRepository.js.map +1 -0
  110. package/dist/infrastructure/patterns/RemotePatternRepository.d.ts +77 -0
  111. package/dist/infrastructure/patterns/RemotePatternRepository.d.ts.map +1 -0
  112. package/dist/infrastructure/patterns/RemotePatternRepository.js +176 -0
  113. package/dist/infrastructure/patterns/RemotePatternRepository.js.map +1 -0
  114. package/dist/infrastructure/patterns/bundled-patterns.d.ts +9 -0
  115. package/dist/infrastructure/patterns/bundled-patterns.d.ts.map +1 -0
  116. package/dist/infrastructure/patterns/bundled-patterns.js +2082 -0
  117. package/dist/infrastructure/patterns/bundled-patterns.js.map +1 -0
  118. package/dist/infrastructure/patterns/index.d.ts +9 -0
  119. package/dist/infrastructure/patterns/index.d.ts.map +1 -0
  120. package/dist/infrastructure/patterns/index.js +8 -0
  121. package/dist/infrastructure/patterns/index.js.map +1 -0
  122. package/dist/infrastructure/sentinel/LLMSentinel.d.ts +48 -0
  123. package/dist/infrastructure/sentinel/LLMSentinel.d.ts.map +1 -0
  124. package/dist/infrastructure/sentinel/LLMSentinel.js +142 -0
  125. package/dist/infrastructure/sentinel/LLMSentinel.js.map +1 -0
  126. package/dist/infrastructure/telemetry/HttpShadowLogSink.d.ts +30 -0
  127. package/dist/infrastructure/telemetry/HttpShadowLogSink.d.ts.map +1 -0
  128. package/dist/infrastructure/telemetry/HttpShadowLogSink.js +40 -0
  129. package/dist/infrastructure/telemetry/HttpShadowLogSink.js.map +1 -0
  130. package/dist/infrastructure/telemetry/HttpSignalSink.d.ts +51 -0
  131. package/dist/infrastructure/telemetry/HttpSignalSink.d.ts.map +1 -0
  132. package/dist/infrastructure/telemetry/HttpSignalSink.js +134 -0
  133. package/dist/infrastructure/telemetry/HttpSignalSink.js.map +1 -0
  134. package/dist/infrastructure/telemetry/index.d.ts +9 -0
  135. package/dist/infrastructure/telemetry/index.d.ts.map +1 -0
  136. package/dist/infrastructure/telemetry/index.js +7 -0
  137. package/dist/infrastructure/telemetry/index.js.map +1 -0
  138. 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"}