@dcyfr/ai 1.0.3 → 1.0.4
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/LICENSE +27 -1
- package/README.md +343 -4
- package/dist/ai/index.d.ts +2 -0
- package/dist/ai/index.d.ts.map +1 -1
- package/dist/ai/index.js +2 -0
- package/dist/ai/index.js.map +1 -1
- package/dist/ai/mcp/index.d.ts +14 -2
- package/dist/ai/mcp/index.d.ts.map +1 -1
- package/dist/ai/mcp/index.js +11 -1
- package/dist/ai/mcp/index.js.map +1 -1
- package/dist/ai/mcp/servers/analytics/index.d.ts +19 -0
- package/dist/ai/mcp/servers/analytics/index.d.ts.map +1 -0
- package/dist/ai/mcp/servers/analytics/index.js +556 -0
- package/dist/ai/mcp/servers/analytics/index.js.map +1 -0
- package/dist/ai/mcp/servers/content-manager/content-provider.d.ts +61 -0
- package/dist/ai/mcp/servers/content-manager/content-provider.d.ts.map +1 -0
- package/dist/ai/mcp/servers/content-manager/content-provider.js +8 -0
- package/dist/ai/mcp/servers/content-manager/content-provider.js.map +1 -0
- package/dist/ai/mcp/servers/content-manager/index.d.ts +19 -0
- package/dist/ai/mcp/servers/content-manager/index.d.ts.map +1 -0
- package/dist/ai/mcp/servers/content-manager/index.js +236 -0
- package/dist/ai/mcp/servers/content-manager/index.js.map +1 -0
- package/dist/ai/mcp/servers/design-tokens/index.d.ts +19 -0
- package/dist/ai/mcp/servers/design-tokens/index.d.ts.map +1 -0
- package/dist/ai/mcp/servers/design-tokens/index.js +422 -0
- package/dist/ai/mcp/servers/design-tokens/index.js.map +1 -0
- package/dist/ai/mcp/servers/design-tokens/token-provider.d.ts +59 -0
- package/dist/ai/mcp/servers/design-tokens/token-provider.d.ts.map +1 -0
- package/dist/ai/mcp/servers/design-tokens/token-provider.js +8 -0
- package/dist/ai/mcp/servers/design-tokens/token-provider.js.map +1 -0
- package/dist/ai/mcp/servers/promptintel/index.d.ts +19 -0
- package/dist/ai/mcp/servers/promptintel/index.d.ts.map +1 -0
- package/dist/ai/mcp/servers/promptintel/index.js +323 -0
- package/dist/ai/mcp/servers/promptintel/index.js.map +1 -0
- package/dist/ai/mcp/servers/shared/cache.d.ts +62 -0
- package/dist/ai/mcp/servers/shared/cache.d.ts.map +1 -0
- package/dist/ai/mcp/servers/shared/cache.js +117 -0
- package/dist/ai/mcp/servers/shared/cache.js.map +1 -0
- package/dist/ai/mcp/servers/shared/promptintel-client.d.ts +53 -0
- package/dist/ai/mcp/servers/shared/promptintel-client.d.ts.map +1 -0
- package/dist/ai/mcp/servers/shared/promptintel-client.js +185 -0
- package/dist/ai/mcp/servers/shared/promptintel-client.js.map +1 -0
- package/dist/ai/mcp/servers/shared/promptintel-types.d.ts +85 -0
- package/dist/ai/mcp/servers/shared/promptintel-types.d.ts.map +1 -0
- package/dist/ai/mcp/servers/shared/promptintel-types.js +7 -0
- package/dist/ai/mcp/servers/shared/promptintel-types.js.map +1 -0
- package/dist/ai/mcp/servers/shared/rate-limiter.d.ts +54 -0
- package/dist/ai/mcp/servers/shared/rate-limiter.d.ts.map +1 -0
- package/dist/ai/mcp/servers/shared/rate-limiter.js +122 -0
- package/dist/ai/mcp/servers/shared/rate-limiter.js.map +1 -0
- package/dist/ai/mcp/servers/shared/redis-client.d.ts +54 -0
- package/dist/ai/mcp/servers/shared/redis-client.d.ts.map +1 -0
- package/dist/ai/mcp/servers/shared/redis-client.js +225 -0
- package/dist/ai/mcp/servers/shared/redis-client.js.map +1 -0
- package/dist/ai/mcp/servers/shared/types.d.ts +292 -0
- package/dist/ai/mcp/servers/shared/types.d.ts.map +1 -0
- package/dist/ai/mcp/servers/shared/types.js +6 -0
- package/dist/ai/mcp/servers/shared/types.js.map +1 -0
- package/dist/ai/mcp/servers/shared/utils.d.ts +41 -0
- package/dist/ai/mcp/servers/shared/utils.d.ts.map +1 -0
- package/dist/ai/mcp/servers/shared/utils.js +183 -0
- package/dist/ai/mcp/servers/shared/utils.js.map +1 -0
- package/dist/ai/memory/config.d.ts +87 -0
- package/dist/ai/memory/config.d.ts.map +1 -0
- package/dist/ai/memory/config.js +154 -0
- package/dist/ai/memory/config.js.map +1 -0
- package/dist/ai/memory/dcyfr-memory.d.ts +63 -0
- package/dist/ai/memory/dcyfr-memory.d.ts.map +1 -0
- package/dist/ai/memory/dcyfr-memory.js +270 -0
- package/dist/ai/memory/dcyfr-memory.js.map +1 -0
- package/dist/ai/memory/index.d.ts +15 -0
- package/dist/ai/memory/index.d.ts.map +1 -0
- package/dist/ai/memory/index.js +15 -0
- package/dist/ai/memory/index.js.map +1 -0
- package/dist/ai/memory/mem0-client.d.ts +108 -0
- package/dist/ai/memory/mem0-client.d.ts.map +1 -0
- package/dist/ai/memory/mem0-client.js +166 -0
- package/dist/ai/memory/mem0-client.js.map +1 -0
- package/dist/ai/memory/types.d.ts +175 -0
- package/dist/ai/memory/types.d.ts.map +1 -0
- package/dist/ai/memory/types.js +10 -0
- package/dist/ai/memory/types.js.map +1 -0
- package/package.json +24 -2
|
@@ -0,0 +1,185 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* PromptIntel API Client
|
|
3
|
+
* Handles authentication, rate limiting, and error handling for PostgREST API
|
|
4
|
+
* Supports filtering, ordering, and pagination via PostgREST query parameters
|
|
5
|
+
*/
|
|
6
|
+
export class PromptIntelClient {
|
|
7
|
+
baseUrl;
|
|
8
|
+
apiKey;
|
|
9
|
+
timeout;
|
|
10
|
+
constructor(config) {
|
|
11
|
+
if (!config.apiKey) {
|
|
12
|
+
throw new Error('PromptIntel API key is required');
|
|
13
|
+
}
|
|
14
|
+
this.baseUrl = config.baseUrl || 'https://api.promptintel.novahunting.ai/api/v1';
|
|
15
|
+
this.apiKey = config.apiKey;
|
|
16
|
+
this.timeout = config.timeout || 10000;
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* Build request headers with authentication
|
|
20
|
+
*/
|
|
21
|
+
buildHeaders() {
|
|
22
|
+
return {
|
|
23
|
+
'Authorization': `Bearer ${this.apiKey}`,
|
|
24
|
+
'Content-Type': 'application/json',
|
|
25
|
+
'Accept': 'application/json',
|
|
26
|
+
};
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* Build URL with PostgREST query parameters
|
|
30
|
+
* Supports filtering, ordering, pagination, and column selection
|
|
31
|
+
*/
|
|
32
|
+
buildUrl(endpoint, params) {
|
|
33
|
+
const url = new URL(`${this.baseUrl}${endpoint}`);
|
|
34
|
+
if (params) {
|
|
35
|
+
// Column selection
|
|
36
|
+
if (params.select) {
|
|
37
|
+
url.searchParams.set('select', params.select);
|
|
38
|
+
}
|
|
39
|
+
// Filtering by severity
|
|
40
|
+
if (params.severity) {
|
|
41
|
+
url.searchParams.set('severity', `eq.${params.severity}`);
|
|
42
|
+
}
|
|
43
|
+
// Filtering by category
|
|
44
|
+
if (params.category) {
|
|
45
|
+
url.searchParams.set('category', `eq.${params.category}`);
|
|
46
|
+
}
|
|
47
|
+
// Pagination
|
|
48
|
+
if (params.limit) {
|
|
49
|
+
url.searchParams.set('limit', String(params.limit));
|
|
50
|
+
}
|
|
51
|
+
if (params.offset) {
|
|
52
|
+
url.searchParams.set('offset', String(params.offset));
|
|
53
|
+
}
|
|
54
|
+
// Ordering
|
|
55
|
+
if (params.order) {
|
|
56
|
+
url.searchParams.set('order', params.order);
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
return url.toString();
|
|
60
|
+
}
|
|
61
|
+
/**
|
|
62
|
+
* Fetch with timeout support
|
|
63
|
+
*/
|
|
64
|
+
async fetchWithTimeout(url, options) {
|
|
65
|
+
const controller = new AbortController();
|
|
66
|
+
const timeoutId = setTimeout(() => controller.abort(), this.timeout);
|
|
67
|
+
try {
|
|
68
|
+
const response = await fetch(url, {
|
|
69
|
+
...options,
|
|
70
|
+
signal: controller.signal,
|
|
71
|
+
});
|
|
72
|
+
clearTimeout(timeoutId);
|
|
73
|
+
return response;
|
|
74
|
+
}
|
|
75
|
+
catch (error) {
|
|
76
|
+
clearTimeout(timeoutId);
|
|
77
|
+
throw error;
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
/**
|
|
81
|
+
* Handle error responses
|
|
82
|
+
*/
|
|
83
|
+
async handleErrorResponse(response) {
|
|
84
|
+
const contentType = response.headers.get('content-type');
|
|
85
|
+
let errorData = {
|
|
86
|
+
error: `HTTP ${response.status}`,
|
|
87
|
+
};
|
|
88
|
+
try {
|
|
89
|
+
if (contentType?.includes('application/json')) {
|
|
90
|
+
errorData = (await response.json());
|
|
91
|
+
}
|
|
92
|
+
else {
|
|
93
|
+
const text = await response.text();
|
|
94
|
+
errorData.message = text;
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
catch {
|
|
98
|
+
// If parsing fails, just use status text
|
|
99
|
+
errorData.message = response.statusText;
|
|
100
|
+
}
|
|
101
|
+
throw new Error(`PromptIntel API error: ${errorData.error} - ${errorData.message || 'Unknown error'}`);
|
|
102
|
+
}
|
|
103
|
+
/**
|
|
104
|
+
* Fetch IoPC (Indicators of Prompt Compromise)
|
|
105
|
+
* Returns adversarial prompt patterns and attack indicators
|
|
106
|
+
*/
|
|
107
|
+
async getPrompts(params) {
|
|
108
|
+
const url = this.buildUrl('/prompts', params);
|
|
109
|
+
const response = await this.fetchWithTimeout(url, {
|
|
110
|
+
method: 'GET',
|
|
111
|
+
headers: this.buildHeaders(),
|
|
112
|
+
});
|
|
113
|
+
if (!response.ok) {
|
|
114
|
+
await this.handleErrorResponse(response);
|
|
115
|
+
}
|
|
116
|
+
const data = (await response.json());
|
|
117
|
+
return Array.isArray(data) ? data : [data];
|
|
118
|
+
}
|
|
119
|
+
/**
|
|
120
|
+
* Fetch threat taxonomy
|
|
121
|
+
* Returns hierarchical classification of attack techniques
|
|
122
|
+
*/
|
|
123
|
+
async getTaxonomy(params) {
|
|
124
|
+
const url = this.buildUrl('/taxonomy', params);
|
|
125
|
+
const response = await this.fetchWithTimeout(url, {
|
|
126
|
+
method: 'GET',
|
|
127
|
+
headers: this.buildHeaders(),
|
|
128
|
+
});
|
|
129
|
+
if (!response.ok) {
|
|
130
|
+
await this.handleErrorResponse(response);
|
|
131
|
+
}
|
|
132
|
+
const data = (await response.json());
|
|
133
|
+
return Array.isArray(data) ? data : [data];
|
|
134
|
+
}
|
|
135
|
+
/**
|
|
136
|
+
* Fetch agent reports (all or user's own)
|
|
137
|
+
*/
|
|
138
|
+
async getAgentReports(mine = false, params) {
|
|
139
|
+
const endpoint = mine ? '/agents/reports/mine' : '/agents/reports';
|
|
140
|
+
const url = this.buildUrl(endpoint, params);
|
|
141
|
+
const response = await this.fetchWithTimeout(url, {
|
|
142
|
+
method: 'GET',
|
|
143
|
+
headers: this.buildHeaders(),
|
|
144
|
+
});
|
|
145
|
+
if (!response.ok) {
|
|
146
|
+
await this.handleErrorResponse(response);
|
|
147
|
+
}
|
|
148
|
+
const data = (await response.json());
|
|
149
|
+
return Array.isArray(data) ? data : [data];
|
|
150
|
+
}
|
|
151
|
+
/**
|
|
152
|
+
* Submit a new security finding or vulnerability report
|
|
153
|
+
*/
|
|
154
|
+
async submitReport(report) {
|
|
155
|
+
const url = this.buildUrl('/agents/reports');
|
|
156
|
+
const response = await this.fetchWithTimeout(url, {
|
|
157
|
+
method: 'POST',
|
|
158
|
+
headers: {
|
|
159
|
+
...this.buildHeaders(),
|
|
160
|
+
'Prefer': 'return=representation',
|
|
161
|
+
},
|
|
162
|
+
body: JSON.stringify(report),
|
|
163
|
+
});
|
|
164
|
+
if (!response.ok) {
|
|
165
|
+
await this.handleErrorResponse(response);
|
|
166
|
+
}
|
|
167
|
+
const data = (await response.json());
|
|
168
|
+
return Array.isArray(data) ? data[0] : data;
|
|
169
|
+
}
|
|
170
|
+
/**
|
|
171
|
+
* Check API health and connectivity
|
|
172
|
+
* Does not require authentication
|
|
173
|
+
*/
|
|
174
|
+
async healthCheck() {
|
|
175
|
+
const url = `${this.baseUrl}/health`;
|
|
176
|
+
const response = await this.fetchWithTimeout(url, {
|
|
177
|
+
method: 'GET',
|
|
178
|
+
});
|
|
179
|
+
if (!response.ok) {
|
|
180
|
+
await this.handleErrorResponse(response);
|
|
181
|
+
}
|
|
182
|
+
return (await response.json());
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
//# sourceMappingURL=promptintel-client.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"promptintel-client.js","sourceRoot":"","sources":["../../../../../packages/ai/mcp/servers/shared/promptintel-client.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* PromptIntel API Types
|
|
3
|
+
* Type definitions for PromptIntel threat intelligence platform
|
|
4
|
+
* Shared across MCP server and API client
|
|
5
|
+
*/
|
|
6
|
+
/**
|
|
7
|
+
* Indicator of Prompt Compromise (IoPC)
|
|
8
|
+
* Represents an adversarial prompt pattern or attack technique
|
|
9
|
+
*/
|
|
10
|
+
export interface PromptIntelIoPC {
|
|
11
|
+
id: string;
|
|
12
|
+
title: string;
|
|
13
|
+
description: string;
|
|
14
|
+
severity: 'critical' | 'high' | 'medium' | 'low' | 'info';
|
|
15
|
+
category: string;
|
|
16
|
+
prompt_pattern: string;
|
|
17
|
+
detection_pattern?: string;
|
|
18
|
+
mitigation?: string;
|
|
19
|
+
cwe_ids?: string[];
|
|
20
|
+
created_at: string;
|
|
21
|
+
updated_at: string;
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* Threat Taxonomy
|
|
25
|
+
* Hierarchical classification of attack techniques and defense strategies
|
|
26
|
+
*/
|
|
27
|
+
export interface PromptIntelTaxonomy {
|
|
28
|
+
id: string;
|
|
29
|
+
name: string;
|
|
30
|
+
description: string;
|
|
31
|
+
category_type: 'attack' | 'defense' | 'technique';
|
|
32
|
+
parent_id?: string;
|
|
33
|
+
created_at: string;
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* Agent Report
|
|
37
|
+
* User-submitted security finding or vulnerability report
|
|
38
|
+
*/
|
|
39
|
+
export interface PromptIntelAgentReport {
|
|
40
|
+
id: string;
|
|
41
|
+
agent_name: string;
|
|
42
|
+
title: string;
|
|
43
|
+
description: string;
|
|
44
|
+
severity: 'critical' | 'high' | 'medium' | 'low';
|
|
45
|
+
findings: Record<string, unknown>;
|
|
46
|
+
metadata: Record<string, unknown>;
|
|
47
|
+
created_at: string;
|
|
48
|
+
user_id?: string;
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* Search Parameters for PostgREST queries
|
|
52
|
+
* Supports filtering, ordering, and pagination
|
|
53
|
+
*/
|
|
54
|
+
export interface PromptIntelSearchParams {
|
|
55
|
+
select?: string;
|
|
56
|
+
severity?: string;
|
|
57
|
+
category?: string;
|
|
58
|
+
limit?: number;
|
|
59
|
+
offset?: number;
|
|
60
|
+
order?: string;
|
|
61
|
+
}
|
|
62
|
+
/**
|
|
63
|
+
* API Client Configuration
|
|
64
|
+
*/
|
|
65
|
+
export interface PromptIntelClientConfig {
|
|
66
|
+
apiKey: string;
|
|
67
|
+
baseUrl?: string;
|
|
68
|
+
timeout?: number;
|
|
69
|
+
}
|
|
70
|
+
/**
|
|
71
|
+
* Health Check Response
|
|
72
|
+
*/
|
|
73
|
+
export interface PromptIntelHealthResponse {
|
|
74
|
+
status: 'healthy' | 'degraded' | 'down';
|
|
75
|
+
timestamp: string;
|
|
76
|
+
}
|
|
77
|
+
/**
|
|
78
|
+
* API Error Response
|
|
79
|
+
*/
|
|
80
|
+
export interface PromptIntelErrorResponse {
|
|
81
|
+
error: string;
|
|
82
|
+
message: string;
|
|
83
|
+
details?: Record<string, unknown>;
|
|
84
|
+
}
|
|
85
|
+
//# sourceMappingURL=promptintel-types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"promptintel-types.d.ts","sourceRoot":"","sources":["../../../../../packages/ai/mcp/servers/shared/promptintel-types.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH;;;GAGG;AACH,MAAM,WAAW,eAAe;IAC9B,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,UAAU,GAAG,MAAM,GAAG,QAAQ,GAAG,KAAK,GAAG,MAAM,CAAC;IAC1D,QAAQ,EAAE,MAAM,CAAC;IACjB,cAAc,EAAE,MAAM,CAAC;IACvB,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED;;;GAGG;AACH,MAAM,WAAW,mBAAmB;IAClC,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,aAAa,EAAE,QAAQ,GAAG,SAAS,GAAG,WAAW,CAAC;IAClD,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED;;;GAGG;AACH,MAAM,WAAW,sBAAsB;IACrC,EAAE,EAAE,MAAM,CAAC;IACX,UAAU,EAAE,MAAM,CAAC;IACnB,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,UAAU,GAAG,MAAM,GAAG,QAAQ,GAAG,KAAK,CAAC;IACjD,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAClC,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAClC,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED;;;GAGG;AACH,MAAM,WAAW,uBAAuB;IACtC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED;;GAEG;AACH,MAAM,WAAW,uBAAuB;IACtC,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED;;GAEG;AACH,MAAM,WAAW,yBAAyB;IACxC,MAAM,EAAE,SAAS,GAAG,UAAU,GAAG,MAAM,CAAC;IACxC,SAAS,EAAE,MAAM,CAAC;CACnB;AAED;;GAEG;AACH,MAAM,WAAW,wBAAwB;IACvC,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACnC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"promptintel-types.js","sourceRoot":"","sources":["../../../../../packages/ai/mcp/servers/shared/promptintel-types.ts"],"names":[],"mappings":"AAAA;;;;GAIG"}
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Rate Limiter for API requests
|
|
3
|
+
* Enforces request rate limits with queueing
|
|
4
|
+
*
|
|
5
|
+
* Used by Semantic Scholar MCP to respect 1 req/sec limit
|
|
6
|
+
*/
|
|
7
|
+
export interface RateLimiterStats {
|
|
8
|
+
queueLength: number;
|
|
9
|
+
totalRequests: number;
|
|
10
|
+
rejectedRequests: number;
|
|
11
|
+
averageWaitTime: number;
|
|
12
|
+
lastRequestTime: number;
|
|
13
|
+
}
|
|
14
|
+
export declare class RateLimiter {
|
|
15
|
+
private queue;
|
|
16
|
+
private processing;
|
|
17
|
+
private lastRequestTime;
|
|
18
|
+
private readonly minInterval;
|
|
19
|
+
private totalRequests;
|
|
20
|
+
private rejectedRequests;
|
|
21
|
+
private waitTimes;
|
|
22
|
+
/**
|
|
23
|
+
* Create a rate limiter
|
|
24
|
+
* @param requestsPerSecond - Maximum requests per second (e.g., 1 for Semantic Scholar)
|
|
25
|
+
*/
|
|
26
|
+
constructor(requestsPerSecond: number);
|
|
27
|
+
/**
|
|
28
|
+
* Enqueue a request to be executed with rate limiting
|
|
29
|
+
* @param fn - Async function to execute
|
|
30
|
+
* @returns Promise that resolves with the function's result
|
|
31
|
+
*/
|
|
32
|
+
enqueue<T>(fn: () => Promise<T>): Promise<T>;
|
|
33
|
+
/**
|
|
34
|
+
* Process the request queue with rate limiting
|
|
35
|
+
*/
|
|
36
|
+
private processQueue;
|
|
37
|
+
/**
|
|
38
|
+
* Get current queue length
|
|
39
|
+
*/
|
|
40
|
+
getQueueLength(): number;
|
|
41
|
+
/**
|
|
42
|
+
* Get rate limiter statistics
|
|
43
|
+
*/
|
|
44
|
+
getStats(): RateLimiterStats;
|
|
45
|
+
/**
|
|
46
|
+
* Clear the queue (use with caution)
|
|
47
|
+
*/
|
|
48
|
+
clearQueue(): void;
|
|
49
|
+
/**
|
|
50
|
+
* Reset statistics
|
|
51
|
+
*/
|
|
52
|
+
resetStats(): void;
|
|
53
|
+
}
|
|
54
|
+
//# sourceMappingURL=rate-limiter.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rate-limiter.d.ts","sourceRoot":"","sources":["../../../../../packages/ai/mcp/servers/shared/rate-limiter.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,MAAM,WAAW,gBAAgB;IAC/B,WAAW,EAAE,MAAM,CAAC;IACpB,aAAa,EAAE,MAAM,CAAC;IACtB,gBAAgB,EAAE,MAAM,CAAC;IACzB,eAAe,EAAE,MAAM,CAAC;IACxB,eAAe,EAAE,MAAM,CAAC;CACzB;AAED,qBAAa,WAAW;IACtB,OAAO,CAAC,KAAK,CAKL;IAER,OAAO,CAAC,UAAU,CAAS;IAC3B,OAAO,CAAC,eAAe,CAAK;IAC5B,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAS;IACrC,OAAO,CAAC,aAAa,CAAK;IAC1B,OAAO,CAAC,gBAAgB,CAAK;IAC7B,OAAO,CAAC,SAAS,CAAgB;IAEjC;;;OAGG;gBACS,iBAAiB,EAAE,MAAM;IAOrC;;;;OAIG;IACG,OAAO,CAAC,CAAC,EAAE,EAAE,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC;IAclD;;OAEG;YACW,YAAY;IA0C1B;;OAEG;IACH,cAAc,IAAI,MAAM;IAIxB;;OAEG;IACH,QAAQ,IAAI,gBAAgB;IAgB5B;;OAEG;IACH,UAAU,IAAI,IAAI;IASlB;;OAEG;IACH,UAAU,IAAI,IAAI;CAKnB"}
|
|
@@ -0,0 +1,122 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Rate Limiter for API requests
|
|
3
|
+
* Enforces request rate limits with queueing
|
|
4
|
+
*
|
|
5
|
+
* Used by Semantic Scholar MCP to respect 1 req/sec limit
|
|
6
|
+
*/
|
|
7
|
+
export class RateLimiter {
|
|
8
|
+
queue = [];
|
|
9
|
+
processing = false;
|
|
10
|
+
lastRequestTime = 0;
|
|
11
|
+
minInterval; // milliseconds between requests
|
|
12
|
+
totalRequests = 0;
|
|
13
|
+
rejectedRequests = 0;
|
|
14
|
+
waitTimes = [];
|
|
15
|
+
/**
|
|
16
|
+
* Create a rate limiter
|
|
17
|
+
* @param requestsPerSecond - Maximum requests per second (e.g., 1 for Semantic Scholar)
|
|
18
|
+
*/
|
|
19
|
+
constructor(requestsPerSecond) {
|
|
20
|
+
if (requestsPerSecond <= 0) {
|
|
21
|
+
throw new Error("requestsPerSecond must be positive");
|
|
22
|
+
}
|
|
23
|
+
this.minInterval = 1000 / requestsPerSecond;
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* Enqueue a request to be executed with rate limiting
|
|
27
|
+
* @param fn - Async function to execute
|
|
28
|
+
* @returns Promise that resolves with the function's result
|
|
29
|
+
*/
|
|
30
|
+
async enqueue(fn) {
|
|
31
|
+
return new Promise((resolve, reject) => {
|
|
32
|
+
this.queue.push({
|
|
33
|
+
fn,
|
|
34
|
+
resolve,
|
|
35
|
+
reject,
|
|
36
|
+
enqueuedAt: Date.now(),
|
|
37
|
+
});
|
|
38
|
+
// Start processing if not already running
|
|
39
|
+
void this.processQueue();
|
|
40
|
+
});
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* Process the request queue with rate limiting
|
|
44
|
+
*/
|
|
45
|
+
async processQueue() {
|
|
46
|
+
if (this.processing || this.queue.length === 0) {
|
|
47
|
+
return;
|
|
48
|
+
}
|
|
49
|
+
this.processing = true;
|
|
50
|
+
while (this.queue.length > 0) {
|
|
51
|
+
const now = Date.now();
|
|
52
|
+
const timeSinceLastRequest = now - this.lastRequestTime;
|
|
53
|
+
// Wait if we need to respect the rate limit
|
|
54
|
+
if (timeSinceLastRequest < this.minInterval) {
|
|
55
|
+
const waitTime = this.minInterval - timeSinceLastRequest;
|
|
56
|
+
await new Promise((resolve) => setTimeout(resolve, waitTime));
|
|
57
|
+
}
|
|
58
|
+
const task = this.queue.shift();
|
|
59
|
+
if (!task)
|
|
60
|
+
continue;
|
|
61
|
+
// Track wait time
|
|
62
|
+
const waitTime = Date.now() - task.enqueuedAt;
|
|
63
|
+
this.waitTimes.push(waitTime);
|
|
64
|
+
if (this.waitTimes.length > 100) {
|
|
65
|
+
this.waitTimes.shift(); // Keep last 100 wait times
|
|
66
|
+
}
|
|
67
|
+
this.lastRequestTime = Date.now();
|
|
68
|
+
this.totalRequests++;
|
|
69
|
+
try {
|
|
70
|
+
const result = await task.fn();
|
|
71
|
+
task.resolve(result);
|
|
72
|
+
}
|
|
73
|
+
catch (error) {
|
|
74
|
+
this.rejectedRequests++;
|
|
75
|
+
task.reject(error);
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
this.processing = false;
|
|
79
|
+
}
|
|
80
|
+
/**
|
|
81
|
+
* Get current queue length
|
|
82
|
+
*/
|
|
83
|
+
getQueueLength() {
|
|
84
|
+
return this.queue.length;
|
|
85
|
+
}
|
|
86
|
+
/**
|
|
87
|
+
* Get rate limiter statistics
|
|
88
|
+
*/
|
|
89
|
+
getStats() {
|
|
90
|
+
const averageWaitTime = this.waitTimes.length > 0
|
|
91
|
+
? this.waitTimes.reduce((sum, time) => sum + time, 0) /
|
|
92
|
+
this.waitTimes.length
|
|
93
|
+
: 0;
|
|
94
|
+
return {
|
|
95
|
+
queueLength: this.queue.length,
|
|
96
|
+
totalRequests: this.totalRequests,
|
|
97
|
+
rejectedRequests: this.rejectedRequests,
|
|
98
|
+
averageWaitTime: Math.round(averageWaitTime),
|
|
99
|
+
lastRequestTime: this.lastRequestTime,
|
|
100
|
+
};
|
|
101
|
+
}
|
|
102
|
+
/**
|
|
103
|
+
* Clear the queue (use with caution)
|
|
104
|
+
*/
|
|
105
|
+
clearQueue() {
|
|
106
|
+
const queueLength = this.queue.length;
|
|
107
|
+
this.queue.forEach((task) => {
|
|
108
|
+
task.reject(new Error("Queue cleared"));
|
|
109
|
+
});
|
|
110
|
+
this.queue = [];
|
|
111
|
+
console.warn(`Rate limiter queue cleared (${queueLength} tasks rejected)`);
|
|
112
|
+
}
|
|
113
|
+
/**
|
|
114
|
+
* Reset statistics
|
|
115
|
+
*/
|
|
116
|
+
resetStats() {
|
|
117
|
+
this.totalRequests = 0;
|
|
118
|
+
this.rejectedRequests = 0;
|
|
119
|
+
this.waitTimes = [];
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
//# sourceMappingURL=rate-limiter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rate-limiter.js","sourceRoot":"","sources":["../../../../../packages/ai/mcp/servers/shared/rate-limiter.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Upstash Redis client for MCP servers and main app
|
|
3
|
+
* Supports multi-environment setup with automatic key namespacing
|
|
4
|
+
*
|
|
5
|
+
* Environments:
|
|
6
|
+
* - Production: Dedicated database (no key prefix)
|
|
7
|
+
* - Preview: Shared database with preview:{PR}:* prefix
|
|
8
|
+
* - Development: Shared database with dev:{username}:* prefix
|
|
9
|
+
* - Test: In-memory fallback (no Redis)
|
|
10
|
+
*
|
|
11
|
+
* Upstash provides serverless Redis with HTTP-based REST API, perfect for
|
|
12
|
+
* Vercel Edge Functions and serverless deployments (no persistent connections needed)
|
|
13
|
+
*/
|
|
14
|
+
import { Redis } from '@upstash/redis';
|
|
15
|
+
/**
|
|
16
|
+
* Get environment-specific key prefix for Redis isolation
|
|
17
|
+
*
|
|
18
|
+
* SIMPLIFIED ARCHITECTURE (2026-01-30):
|
|
19
|
+
* - Production: No prefix (dedicated database)
|
|
20
|
+
* - Everything else (Dev + Preview): 'preview:' prefix (SHARED)
|
|
21
|
+
*
|
|
22
|
+
* This allows dev and preview to share the same cached data,
|
|
23
|
+
* reducing complexity and ensuring consistency across environments.
|
|
24
|
+
*
|
|
25
|
+
* FIX (2026-02-01): More defensive production check to prevent prefix in production
|
|
26
|
+
*/
|
|
27
|
+
export declare function getRedisKeyPrefix(): string;
|
|
28
|
+
/**
|
|
29
|
+
* Upstash Redis client with environment-aware key prefixing
|
|
30
|
+
* Auto-initializes on first use with environment credentials
|
|
31
|
+
*
|
|
32
|
+
* Compatible with standard Redis API:
|
|
33
|
+
* - get, set, setex, del
|
|
34
|
+
* - incr, zadd, zrange, lpush, lrange
|
|
35
|
+
* - All operations work via HTTP REST API
|
|
36
|
+
*
|
|
37
|
+
* Automatic key namespacing:
|
|
38
|
+
* - Production: no prefix (dedicated database)
|
|
39
|
+
* - Preview: preview:{PR}:key
|
|
40
|
+
* - Development: dev:{username}:key
|
|
41
|
+
*/
|
|
42
|
+
export declare const redis: Redis;
|
|
43
|
+
/**
|
|
44
|
+
* Get current Redis environment for debugging
|
|
45
|
+
* Returns: 'production' | 'preview' | 'development' | 'test' | 'unknown'
|
|
46
|
+
*/
|
|
47
|
+
export declare function getRedisEnvironment(): string;
|
|
48
|
+
/**
|
|
49
|
+
* Close Redis connection (for cleanup)
|
|
50
|
+
* Note: Upstash uses HTTP, so no persistent connection to close
|
|
51
|
+
* This is kept for API compatibility with previous implementation
|
|
52
|
+
*/
|
|
53
|
+
export declare function closeRedisClient(): Promise<void>;
|
|
54
|
+
//# sourceMappingURL=redis-client.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"redis-client.d.ts","sourceRoot":"","sources":["../../../../../packages/ai/mcp/servers/shared/redis-client.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,EAAE,KAAK,EAAE,MAAM,gBAAgB,CAAC;AA4EvC;;;;;;;;;;;GAWG;AACH,wBAAgB,iBAAiB,IAAI,MAAM,CAe1C;AAoCD;;;;;;;;;;;;;GAaG;AACH,eAAO,MAAM,KAAK,OAyDhB,CAAC;AAEH;;;GAGG;AACH,wBAAgB,mBAAmB,IAAI,MAAM,CAQ5C;AAED;;;;GAIG;AACH,wBAAsB,gBAAgB,kBAIrC"}
|