@koreshield/koreshield 0.1.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/dist/index.js ADDED
@@ -0,0 +1,332 @@
1
+ "use strict";
2
+ var __create = Object.create;
3
+ var __defProp = Object.defineProperty;
4
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
5
+ var __getOwnPropNames = Object.getOwnPropertyNames;
6
+ var __getProtoOf = Object.getPrototypeOf;
7
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
8
+ var __export = (target, all) => {
9
+ for (var name in all)
10
+ __defProp(target, name, { get: all[name], enumerable: true });
11
+ };
12
+ var __copyProps = (to, from, except, desc) => {
13
+ if (from && typeof from === "object" || typeof from === "function") {
14
+ for (let key of __getOwnPropNames(from))
15
+ if (!__hasOwnProp.call(to, key) && key !== except)
16
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
17
+ }
18
+ return to;
19
+ };
20
+ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
21
+ // If the importer is in node compatibility mode or this is not an ESM
22
+ // file that has been converted to a CommonJS file using a Babel-
23
+ // compatible transform (i.e. "__esModule" has not been set), then set
24
+ // "default" to the CommonJS "module.exports" for node compatibility.
25
+ isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
26
+ mod
27
+ ));
28
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
29
+
30
+ // src/index.ts
31
+ var src_exports = {};
32
+ __export(src_exports, {
33
+ KoreShieldClient: () => KoreShieldClient,
34
+ KoreShieldOpenAI: () => KoreShieldOpenAI,
35
+ checkResponseSafety: () => checkResponseSafety,
36
+ createClient: () => createClient,
37
+ createKoreShieldOpenAI: () => createKoreShieldOpenAI,
38
+ default: () => KoreShieldClient,
39
+ formatMessages: () => formatMessages,
40
+ retry: () => retry,
41
+ sanitizeInput: () => sanitizeInput,
42
+ sleep: () => sleep,
43
+ validateConfig: () => validateConfig
44
+ });
45
+ module.exports = __toCommonJS(src_exports);
46
+
47
+ // src/core/client.ts
48
+ var import_axios = __toESM(require("axios"));
49
+
50
+ // src/utils/index.ts
51
+ function validateConfig(config) {
52
+ const errors = [];
53
+ if (!config.baseURL) {
54
+ errors.push("baseURL is required");
55
+ } else {
56
+ try {
57
+ new URL(config.baseURL);
58
+ } catch {
59
+ errors.push("baseURL must be a valid URL");
60
+ }
61
+ }
62
+ if (config.timeout && (config.timeout < 1e3 || config.timeout > 3e5)) {
63
+ errors.push("timeout must be between 1000 and 300000 milliseconds");
64
+ }
65
+ return {
66
+ valid: errors.length === 0,
67
+ errors
68
+ };
69
+ }
70
+ function createClient(config = {}) {
71
+ const baseURL = process.env.KORESHIELD_BASE_URL || config.baseURL;
72
+ if (!baseURL) {
73
+ throw new Error("baseURL is required. Set KORESHIELD_BASE_URL environment variable or pass baseURL in config.");
74
+ }
75
+ const defaultConfig = {
76
+ baseURL,
77
+ apiKey: process.env.KORESHIELD_API_KEY || config.apiKey,
78
+ timeout: parseInt(process.env.KORESHIELD_TIMEOUT || "30000"),
79
+ debug: process.env.KORESHIELD_DEBUG === "true" || config.debug || false,
80
+ ...config
81
+ };
82
+ const validation = validateConfig(defaultConfig);
83
+ if (!validation.valid) {
84
+ throw new Error(`Invalid configuration: ${validation.errors.join(", ")}`);
85
+ }
86
+ return new KoreShieldClient(defaultConfig);
87
+ }
88
+ function sanitizeInput(input) {
89
+ return input.replace(/<script\b[^<]*(?:(?!<\/script>)<[^<]*)*<\/script>/gi, "[SCRIPT REMOVED]").replace(/javascript:/gi, "[JAVASCRIPT REMOVED]").replace(/on\w+\s*=/gi, "[EVENT REMOVED]").trim();
90
+ }
91
+ function checkResponseSafety(response) {
92
+ const issues = [];
93
+ let severity = "low";
94
+ if (/<script/i.test(response)) {
95
+ issues.push("Contains script tags");
96
+ severity = "high";
97
+ }
98
+ if (/system prompt|you are an ai|as an ai assistant/i.test(response)) {
99
+ issues.push("Potential system prompt leakage");
100
+ severity = "medium";
101
+ }
102
+ if (/how to|step by step|step \d+|instructions? for/i.test(response) && /hack|exploit|attack|malware|virus/i.test(response)) {
103
+ issues.push("Contains potentially harmful instructions");
104
+ severity = "high";
105
+ }
106
+ return {
107
+ safe: issues.length === 0,
108
+ issues,
109
+ severity
110
+ };
111
+ }
112
+ function formatMessages(messages) {
113
+ return messages.map((msg) => ({
114
+ role: msg.role,
115
+ content: sanitizeInput(msg.content)
116
+ }));
117
+ }
118
+ function sleep(ms) {
119
+ return new Promise((resolve) => setTimeout(resolve, ms));
120
+ }
121
+ async function retry(fn, maxRetries = 3, baseDelay = 1e3) {
122
+ let lastError;
123
+ for (let attempt = 0; attempt <= maxRetries; attempt++) {
124
+ try {
125
+ return await fn();
126
+ } catch (error) {
127
+ lastError = error;
128
+ if (attempt === maxRetries) {
129
+ break;
130
+ }
131
+ const delay = baseDelay * Math.pow(2, attempt);
132
+ await sleep(delay);
133
+ }
134
+ }
135
+ throw lastError;
136
+ }
137
+
138
+ // src/core/client.ts
139
+ var KoreShieldClient = class {
140
+ constructor(config) {
141
+ const validation = validateConfig(config);
142
+ if (!validation.valid) {
143
+ throw new Error(`Invalid configuration: ${validation.errors.join(", ")}`);
144
+ }
145
+ this.config = {
146
+ baseURL: config.baseURL,
147
+ apiKey: config.apiKey || process.env.KORESHIELD_API_KEY || "",
148
+ timeout: config.timeout || 3e4,
149
+ debug: config.debug || false,
150
+ headers: config.headers || {}
151
+ };
152
+ this.client = import_axios.default.create({
153
+ baseURL: this.config.baseURL,
154
+ timeout: this.config.timeout,
155
+ headers: {
156
+ "Content-Type": "application/json",
157
+ "User-Agent": "KoreShield-JS/0.1.0",
158
+ ...this.config.headers
159
+ }
160
+ });
161
+ if (this.config.apiKey) {
162
+ this.client.defaults.headers.common["Authorization"] = `Bearer ${this.config.apiKey}`;
163
+ }
164
+ if (this.config.debug) {
165
+ this.client.interceptors.request.use(
166
+ (config2) => {
167
+ console.log("[KoreShield] Request:", config2.method?.toUpperCase(), config2.url);
168
+ return config2;
169
+ },
170
+ (error) => {
171
+ console.error("[KoreShield] Request Error:", error);
172
+ return Promise.reject(error);
173
+ }
174
+ );
175
+ this.client.interceptors.response.use(
176
+ (response) => {
177
+ console.log("[KoreShield] Response:", response.status, response.config.url);
178
+ return response;
179
+ },
180
+ (error) => {
181
+ console.error("[KoreShield] Response Error:", error.response?.status, error.response?.data);
182
+ return Promise.reject(error);
183
+ }
184
+ );
185
+ }
186
+ }
187
+ /**
188
+ * Create a chat completion request through KoreShield
189
+ */
190
+ async createChatCompletion(request, securityOptions) {
191
+ try {
192
+ const payload = {
193
+ ...request,
194
+ security: securityOptions
195
+ };
196
+ const response = await this.client.post(
197
+ "/v1/chat/completions",
198
+ payload
199
+ );
200
+ return response.data;
201
+ } catch (error) {
202
+ throw this.handleError(error);
203
+ }
204
+ }
205
+ /**
206
+ * Get security events/logs
207
+ */
208
+ async getSecurityEvents(limit = 50, offset = 0, type, severity) {
209
+ try {
210
+ const params = new URLSearchParams({
211
+ limit: limit.toString(),
212
+ offset: offset.toString()
213
+ });
214
+ if (type)
215
+ params.append("type", type);
216
+ if (severity)
217
+ params.append("severity", severity);
218
+ const response = await this.client.get(
219
+ `/api/security/events?${params}`
220
+ );
221
+ return response.data;
222
+ } catch (error) {
223
+ throw this.handleError(error);
224
+ }
225
+ }
226
+ /**
227
+ * Get metrics and statistics
228
+ */
229
+ async getMetrics() {
230
+ try {
231
+ const response = await this.client.get("/api/metrics");
232
+ return response.data;
233
+ } catch (error) {
234
+ throw this.handleError(error);
235
+ }
236
+ }
237
+ /**
238
+ * Get Prometheus metrics in text format
239
+ */
240
+ async getPrometheusMetrics() {
241
+ try {
242
+ const response = await this.client.get("/metrics", {
243
+ headers: { "Accept": "text/plain" }
244
+ });
245
+ return response.data;
246
+ } catch (error) {
247
+ throw this.handleError(error);
248
+ }
249
+ }
250
+ /**
251
+ * Health check
252
+ */
253
+ async health() {
254
+ try {
255
+ const response = await this.client.get("/health");
256
+ return response.data;
257
+ } catch (error) {
258
+ throw this.handleError(error);
259
+ }
260
+ }
261
+ /**
262
+ * Update security configuration
263
+ */
264
+ async updateSecurityConfig(options) {
265
+ try {
266
+ await this.client.put("/api/config/security", options);
267
+ } catch (error) {
268
+ throw this.handleError(error);
269
+ }
270
+ }
271
+ /**
272
+ * Test connection to KoreShield
273
+ */
274
+ async testConnection() {
275
+ try {
276
+ await this.health();
277
+ return true;
278
+ } catch {
279
+ return false;
280
+ }
281
+ }
282
+ handleError(error) {
283
+ const koreShieldError = new Error(
284
+ error.response?.data?.message || error.message || "Unknown error"
285
+ );
286
+ koreShieldError.code = error.response?.data?.code || "UNKNOWN_ERROR";
287
+ koreShieldError.statusCode = error.response?.status;
288
+ koreShieldError.details = error.response?.data;
289
+ return koreShieldError;
290
+ }
291
+ };
292
+
293
+ // src/providers/openai.ts
294
+ var KoreShieldOpenAI = class {
295
+ constructor(config) {
296
+ this.client = new KoreShieldClient(config);
297
+ }
298
+ /**
299
+ * Chat completions API (OpenAI-compatible)
300
+ */
301
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars
302
+ async chat(_completions) {
303
+ return {
304
+ create: async (request, securityOptions) => {
305
+ return await this.client.createChatCompletion(request, securityOptions);
306
+ }
307
+ };
308
+ }
309
+ /**
310
+ * Get underlying KoreShield client for advanced operations
311
+ */
312
+ getClient() {
313
+ return this.client;
314
+ }
315
+ };
316
+ function createKoreShieldOpenAI(config) {
317
+ return new KoreShieldOpenAI(config);
318
+ }
319
+ // Annotate the CommonJS export names for ESM import in node:
320
+ 0 && (module.exports = {
321
+ KoreShieldClient,
322
+ KoreShieldOpenAI,
323
+ checkResponseSafety,
324
+ createClient,
325
+ createKoreShieldOpenAI,
326
+ formatMessages,
327
+ retry,
328
+ sanitizeInput,
329
+ sleep,
330
+ validateConfig
331
+ });
332
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/index.ts","../src/core/client.ts","../src/utils/index.ts","../src/providers/openai.ts"],"sourcesContent":["/**\n * KoreShield JavaScript/TypeScript SDK\n *\n * A comprehensive SDK for integrating with KoreShield LLM Security Proxy\n *\n * @packageDocumentation\n */\n\n// Core exports\nexport { KoreShieldClient } from './core/client';\n\n// Provider wrappers\nexport { KoreShieldOpenAI, createKoreShieldOpenAI } from './providers/openai';\n\n// Utility functions\nexport {\n validateConfig,\n createClient,\n sanitizeInput,\n checkResponseSafety,\n formatMessages,\n sleep,\n retry\n} from './utils';\n\n// Types\nexport type {\n KoreShieldConfig,\n SecurityOptions,\n ChatCompletionRequest,\n ChatCompletionResponse,\n SecurityEvent,\n MetricsResponse,\n KoreShieldError,\n ProviderType,\n ProviderConfig\n} from './types';\n\n// Default export\nexport { KoreShieldClient as default } from './core/client';","/**\n * KoreShield Core Client\n */\n\nimport axios, { AxiosInstance, AxiosResponse } from 'axios';\nimport {\n KoreShieldConfig,\n SecurityOptions,\n ChatCompletionRequest,\n ChatCompletionResponse,\n SecurityEvent,\n MetricsResponse,\n KoreShieldError\n} from '../types';\nimport { validateConfig } from '../utils';\n\nexport class KoreShieldClient {\n private client: AxiosInstance;\n private config: Required<KoreShieldConfig>;\n\n constructor(config: KoreShieldConfig) {\n const validation = validateConfig(config);\n if (!validation.valid) {\n throw new Error(`Invalid configuration: ${validation.errors.join(', ')}`);\n }\n\n this.config = {\n baseURL: config.baseURL,\n apiKey: config.apiKey || process.env.KORESHIELD_API_KEY || '',\n timeout: config.timeout || 30000,\n debug: config.debug || false,\n headers: config.headers || {}\n };\n\n this.client = axios.create({\n baseURL: this.config.baseURL,\n timeout: this.config.timeout,\n headers: {\n 'Content-Type': 'application/json',\n 'User-Agent': 'KoreShield-JS/0.1.0',\n ...this.config.headers\n }\n });\n\n // Add API key to requests if provided\n if (this.config.apiKey) {\n this.client.defaults.headers.common['Authorization'] = `Bearer ${this.config.apiKey}`;\n }\n\n // Add request/response interceptors for debugging\n if (this.config.debug) {\n this.client.interceptors.request.use(\n (config) => {\n console.log('[KoreShield] Request:', config.method?.toUpperCase(), config.url);\n return config;\n },\n (error) => {\n console.error('[KoreShield] Request Error:', error);\n return Promise.reject(error);\n }\n );\n\n this.client.interceptors.response.use(\n (response) => {\n console.log('[KoreShield] Response:', response.status, response.config.url);\n return response;\n },\n (error) => {\n console.error('[KoreShield] Response Error:', error.response?.status, error.response?.data);\n return Promise.reject(error);\n }\n );\n }\n }\n\n /**\n * Create a chat completion request through KoreShield\n */\n async createChatCompletion(\n request: ChatCompletionRequest,\n securityOptions?: SecurityOptions\n ): Promise<ChatCompletionResponse> {\n try {\n const payload = {\n ...request,\n security: securityOptions\n };\n\n const response: AxiosResponse<ChatCompletionResponse> = await this.client.post(\n '/v1/chat/completions',\n payload\n );\n\n return response.data;\n } catch (error: any) {\n throw this.handleError(error);\n }\n }\n\n /**\n * Get security events/logs\n */\n async getSecurityEvents(\n limit: number = 50,\n offset: number = 0,\n type?: string,\n severity?: string\n ): Promise<SecurityEvent[]> {\n try {\n const params = new URLSearchParams({\n limit: limit.toString(),\n offset: offset.toString()\n });\n\n if (type) params.append('type', type);\n if (severity) params.append('severity', severity);\n\n const response: AxiosResponse<SecurityEvent[]> = await this.client.get(\n `/api/security/events?${params}`\n );\n\n return response.data;\n } catch (error: any) {\n throw this.handleError(error);\n }\n }\n\n /**\n * Get metrics and statistics\n */\n async getMetrics(): Promise<MetricsResponse> {\n try {\n const response: AxiosResponse<MetricsResponse> = await this.client.get('/api/metrics');\n return response.data;\n } catch (error: any) {\n throw this.handleError(error);\n }\n }\n\n /**\n * Get Prometheus metrics in text format\n */\n async getPrometheusMetrics(): Promise<string> {\n try {\n const response: AxiosResponse<string> = await this.client.get('/metrics', {\n headers: { 'Accept': 'text/plain' }\n });\n return response.data;\n } catch (error: any) {\n throw this.handleError(error);\n }\n }\n\n /**\n * Health check\n */\n async health(): Promise<{ status: string; version: string; uptime: number }> {\n try {\n const response = await this.client.get('/health');\n return response.data;\n } catch (error: any) {\n throw this.handleError(error);\n }\n }\n\n /**\n * Update security configuration\n */\n async updateSecurityConfig(options: SecurityOptions): Promise<void> {\n try {\n await this.client.put('/api/config/security', options);\n } catch (error: any) {\n throw this.handleError(error);\n }\n }\n\n /**\n * Test connection to KoreShield\n */\n async testConnection(): Promise<boolean> {\n try {\n await this.health();\n return true;\n } catch {\n return false;\n }\n }\n\n private handleError(error: any): KoreShieldError {\n const koreShieldError: KoreShieldError = new Error(\n error.response?.data?.message || error.message || 'Unknown error'\n ) as KoreShieldError;\n\n koreShieldError.code = error.response?.data?.code || 'UNKNOWN_ERROR';\n koreShieldError.statusCode = error.response?.status;\n koreShieldError.details = error.response?.data;\n\n return koreShieldError;\n }\n}","/**\n * KoreShield Utility Functions\n */\n\nimport { KoreShieldClient } from '../core/client';\nimport { KoreShieldConfig } from '../types';\n\n/**\n * Validate KoreShield configuration\n */\nexport function validateConfig(config: KoreShieldConfig): { valid: boolean; errors: string[] } {\n const errors: string[] = [];\n\n if (!config.baseURL) {\n errors.push('baseURL is required');\n } else {\n try {\n new URL(config.baseURL);\n } catch {\n errors.push('baseURL must be a valid URL');\n }\n }\n\n if (config.timeout && (config.timeout < 1000 || config.timeout > 300000)) {\n errors.push('timeout must be between 1000 and 300000 milliseconds');\n }\n\n return {\n valid: errors.length === 0,\n errors\n };\n}\n\n/**\n * Create a KoreShield client with environment variable defaults\n */\nexport function createClient(config: Partial<KoreShieldConfig> = {}): KoreShieldClient {\n const baseURL = process.env.KORESHIELD_BASE_URL || config.baseURL;\n if (!baseURL) {\n throw new Error('baseURL is required. Set KORESHIELD_BASE_URL environment variable or pass baseURL in config.');\n }\n\n const defaultConfig: KoreShieldConfig = {\n baseURL,\n apiKey: process.env.KORESHIELD_API_KEY || config.apiKey,\n timeout: parseInt(process.env.KORESHIELD_TIMEOUT || '30000'),\n debug: process.env.KORESHIELD_DEBUG === 'true' || config.debug || false,\n ...config\n };\n\n const validation = validateConfig(defaultConfig);\n if (!validation.valid) {\n throw new Error(`Invalid configuration: ${validation.errors.join(', ')}`);\n }\n\n return new KoreShieldClient(defaultConfig);\n}\n\n/**\n * Sanitize user input for safe LLM processing\n */\nexport function sanitizeInput(input: string): string {\n // Basic sanitization - remove potentially harmful patterns\n return input\n .replace(/<script\\b[^<]*(?:(?!<\\/script>)<[^<]*)*<\\/script>/gi, '[SCRIPT REMOVED]')\n .replace(/javascript:/gi, '[JAVASCRIPT REMOVED]')\n .replace(/on\\w+\\s*=/gi, '[EVENT REMOVED]')\n .trim();\n}\n\n/**\n * Check if a response contains potentially unsafe content\n */\nexport function checkResponseSafety(response: string): {\n safe: boolean;\n issues: string[];\n severity: 'low' | 'medium' | 'high';\n} {\n const issues: string[] = [];\n let severity: 'low' | 'medium' | 'high' = 'low';\n\n // Check for code injection patterns\n if (/<script/i.test(response)) {\n issues.push('Contains script tags');\n severity = 'high';\n }\n\n // Check for system prompt leakage\n if (/system prompt|you are an ai|as an ai assistant/i.test(response)) {\n issues.push('Potential system prompt leakage');\n severity = 'medium';\n }\n\n // Check for harmful instructions\n if (/how to|step by step|step \\d+|instructions? for/i.test(response) &&\n /hack|exploit|attack|malware|virus/i.test(response)) {\n issues.push('Contains potentially harmful instructions');\n severity = 'high';\n }\n\n return {\n safe: issues.length === 0,\n issues,\n severity\n };\n}\n\n/**\n * Format chat messages for KoreShield\n */\nexport function formatMessages(messages: Array<{ role: string; content: string }>) {\n return messages.map(msg => ({\n role: msg.role,\n content: sanitizeInput(msg.content)\n }));\n}\n\n/**\n * Sleep utility for rate limiting\n */\nexport function sleep(ms: number): Promise<void> {\n return new Promise(resolve => setTimeout(resolve, ms));\n}\n\n/**\n * Retry utility with exponential backoff\n */\nexport async function retry<T>(\n fn: () => Promise<T>,\n maxRetries: number = 3,\n baseDelay: number = 1000\n): Promise<T> {\n let lastError: Error;\n\n for (let attempt = 0; attempt <= maxRetries; attempt++) {\n try {\n return await fn();\n } catch (error) {\n lastError = error as Error;\n\n if (attempt === maxRetries) {\n break;\n }\n\n const delay = baseDelay * Math.pow(2, attempt);\n await sleep(delay);\n }\n }\n\n throw lastError!;\n}","/**\n * OpenAI-compatible wrapper for KoreShield\n * Provides drop-in replacement for OpenAI SDK\n */\n\nimport { KoreShieldClient } from '../core/client';\nimport {\n KoreShieldConfig,\n SecurityOptions,\n ChatCompletionRequest\n} from '../types';\n\nexport class KoreShieldOpenAI {\n private client: KoreShieldClient;\n\n constructor(config: KoreShieldConfig) {\n this.client = new KoreShieldClient(config);\n }\n\n /**\n * Chat completions API (OpenAI-compatible)\n */\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n async chat(_completions: any) {\n return {\n create: async (request: ChatCompletionRequest, securityOptions?: SecurityOptions) => {\n return await this.client.createChatCompletion(request, securityOptions);\n }\n };\n }\n\n /**\n * Get underlying KoreShield client for advanced operations\n */\n getClient(): KoreShieldClient {\n return this.client;\n }\n}\n\n/**\n * Factory function to create OpenAI-compatible instance\n */\nexport function createKoreShieldOpenAI(config: KoreShieldConfig): KoreShieldOpenAI {\n return new KoreShieldOpenAI(config);\n}"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACIA,mBAAoD;;;ACM7C,SAAS,eAAe,QAAgE;AAC7F,QAAM,SAAmB,CAAC;AAE1B,MAAI,CAAC,OAAO,SAAS;AACnB,WAAO,KAAK,qBAAqB;AAAA,EACnC,OAAO;AACL,QAAI;AACF,UAAI,IAAI,OAAO,OAAO;AAAA,IACxB,QAAQ;AACN,aAAO,KAAK,6BAA6B;AAAA,IAC3C;AAAA,EACF;AAEA,MAAI,OAAO,YAAY,OAAO,UAAU,OAAQ,OAAO,UAAU,MAAS;AACxE,WAAO,KAAK,sDAAsD;AAAA,EACpE;AAEA,SAAO;AAAA,IACL,OAAO,OAAO,WAAW;AAAA,IACzB;AAAA,EACF;AACF;AAKO,SAAS,aAAa,SAAoC,CAAC,GAAqB;AACrF,QAAM,UAAU,QAAQ,IAAI,uBAAuB,OAAO;AAC1D,MAAI,CAAC,SAAS;AACZ,UAAM,IAAI,MAAM,8FAA8F;AAAA,EAChH;AAEA,QAAM,gBAAkC;AAAA,IACtC;AAAA,IACA,QAAQ,QAAQ,IAAI,sBAAsB,OAAO;AAAA,IACjD,SAAS,SAAS,QAAQ,IAAI,sBAAsB,OAAO;AAAA,IAC3D,OAAO,QAAQ,IAAI,qBAAqB,UAAU,OAAO,SAAS;AAAA,IAClE,GAAG;AAAA,EACL;AAEA,QAAM,aAAa,eAAe,aAAa;AAC/C,MAAI,CAAC,WAAW,OAAO;AACrB,UAAM,IAAI,MAAM,0BAA0B,WAAW,OAAO,KAAK,IAAI,CAAC,EAAE;AAAA,EAC1E;AAEA,SAAO,IAAI,iBAAiB,aAAa;AAC3C;AAKO,SAAS,cAAc,OAAuB;AAEnD,SAAO,MACJ,QAAQ,uDAAuD,kBAAkB,EACjF,QAAQ,iBAAiB,sBAAsB,EAC/C,QAAQ,eAAe,iBAAiB,EACxC,KAAK;AACV;AAKO,SAAS,oBAAoB,UAIlC;AACA,QAAM,SAAmB,CAAC;AAC1B,MAAI,WAAsC;AAG1C,MAAI,WAAW,KAAK,QAAQ,GAAG;AAC7B,WAAO,KAAK,sBAAsB;AAClC,eAAW;AAAA,EACb;AAGA,MAAI,kDAAkD,KAAK,QAAQ,GAAG;AACpE,WAAO,KAAK,iCAAiC;AAC7C,eAAW;AAAA,EACb;AAGA,MAAI,kDAAkD,KAAK,QAAQ,KAC/D,qCAAqC,KAAK,QAAQ,GAAG;AACvD,WAAO,KAAK,2CAA2C;AACvD,eAAW;AAAA,EACb;AAEA,SAAO;AAAA,IACL,MAAM,OAAO,WAAW;AAAA,IACxB;AAAA,IACA;AAAA,EACF;AACF;AAKO,SAAS,eAAe,UAAoD;AACjF,SAAO,SAAS,IAAI,UAAQ;AAAA,IAC1B,MAAM,IAAI;AAAA,IACV,SAAS,cAAc,IAAI,OAAO;AAAA,EACpC,EAAE;AACJ;AAKO,SAAS,MAAM,IAA2B;AAC/C,SAAO,IAAI,QAAQ,aAAW,WAAW,SAAS,EAAE,CAAC;AACvD;AAKA,eAAsB,MACpB,IACA,aAAqB,GACrB,YAAoB,KACR;AACZ,MAAI;AAEJ,WAAS,UAAU,GAAG,WAAW,YAAY,WAAW;AACtD,QAAI;AACF,aAAO,MAAM,GAAG;AAAA,IAClB,SAAS,OAAO;AACd,kBAAY;AAEZ,UAAI,YAAY,YAAY;AAC1B;AAAA,MACF;AAEA,YAAM,QAAQ,YAAY,KAAK,IAAI,GAAG,OAAO;AAC7C,YAAM,MAAM,KAAK;AAAA,IACnB;AAAA,EACF;AAEA,QAAM;AACR;;;ADtIO,IAAM,mBAAN,MAAuB;AAAA,EAI5B,YAAY,QAA0B;AACpC,UAAM,aAAa,eAAe,MAAM;AACxC,QAAI,CAAC,WAAW,OAAO;AACrB,YAAM,IAAI,MAAM,0BAA0B,WAAW,OAAO,KAAK,IAAI,CAAC,EAAE;AAAA,IAC1E;AAEA,SAAK,SAAS;AAAA,MACZ,SAAS,OAAO;AAAA,MAChB,QAAQ,OAAO,UAAU,QAAQ,IAAI,sBAAsB;AAAA,MAC3D,SAAS,OAAO,WAAW;AAAA,MAC3B,OAAO,OAAO,SAAS;AAAA,MACvB,SAAS,OAAO,WAAW,CAAC;AAAA,IAC9B;AAEA,SAAK,SAAS,aAAAA,QAAM,OAAO;AAAA,MACzB,SAAS,KAAK,OAAO;AAAA,MACrB,SAAS,KAAK,OAAO;AAAA,MACrB,SAAS;AAAA,QACP,gBAAgB;AAAA,QAChB,cAAc;AAAA,QACd,GAAG,KAAK,OAAO;AAAA,MACjB;AAAA,IACF,CAAC;AAGD,QAAI,KAAK,OAAO,QAAQ;AACtB,WAAK,OAAO,SAAS,QAAQ,OAAO,eAAe,IAAI,UAAU,KAAK,OAAO,MAAM;AAAA,IACrF;AAGA,QAAI,KAAK,OAAO,OAAO;AACrB,WAAK,OAAO,aAAa,QAAQ;AAAA,QAC/B,CAACC,YAAW;AACV,kBAAQ,IAAI,yBAAyBA,QAAO,QAAQ,YAAY,GAAGA,QAAO,GAAG;AAC7E,iBAAOA;AAAA,QACT;AAAA,QACA,CAAC,UAAU;AACT,kBAAQ,MAAM,+BAA+B,KAAK;AAClD,iBAAO,QAAQ,OAAO,KAAK;AAAA,QAC7B;AAAA,MACF;AAEA,WAAK,OAAO,aAAa,SAAS;AAAA,QAChC,CAAC,aAAa;AACZ,kBAAQ,IAAI,0BAA0B,SAAS,QAAQ,SAAS,OAAO,GAAG;AAC1E,iBAAO;AAAA,QACT;AAAA,QACA,CAAC,UAAU;AACT,kBAAQ,MAAM,gCAAgC,MAAM,UAAU,QAAQ,MAAM,UAAU,IAAI;AAC1F,iBAAO,QAAQ,OAAO,KAAK;AAAA,QAC7B;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,qBACJ,SACA,iBACiC;AACjC,QAAI;AACF,YAAM,UAAU;AAAA,QACd,GAAG;AAAA,QACH,UAAU;AAAA,MACZ;AAEA,YAAM,WAAkD,MAAM,KAAK,OAAO;AAAA,QACxE;AAAA,QACA;AAAA,MACF;AAEA,aAAO,SAAS;AAAA,IAClB,SAAS,OAAY;AACnB,YAAM,KAAK,YAAY,KAAK;AAAA,IAC9B;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,kBACJ,QAAgB,IAChB,SAAiB,GACjB,MACA,UAC0B;AAC1B,QAAI;AACF,YAAM,SAAS,IAAI,gBAAgB;AAAA,QACjC,OAAO,MAAM,SAAS;AAAA,QACtB,QAAQ,OAAO,SAAS;AAAA,MAC1B,CAAC;AAED,UAAI;AAAM,eAAO,OAAO,QAAQ,IAAI;AACpC,UAAI;AAAU,eAAO,OAAO,YAAY,QAAQ;AAEhD,YAAM,WAA2C,MAAM,KAAK,OAAO;AAAA,QACjE,wBAAwB,MAAM;AAAA,MAChC;AAEA,aAAO,SAAS;AAAA,IAClB,SAAS,OAAY;AACnB,YAAM,KAAK,YAAY,KAAK;AAAA,IAC9B;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,aAAuC;AAC3C,QAAI;AACF,YAAM,WAA2C,MAAM,KAAK,OAAO,IAAI,cAAc;AACrF,aAAO,SAAS;AAAA,IAClB,SAAS,OAAY;AACnB,YAAM,KAAK,YAAY,KAAK;AAAA,IAC9B;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,uBAAwC;AAC5C,QAAI;AACF,YAAM,WAAkC,MAAM,KAAK,OAAO,IAAI,YAAY;AAAA,QACxE,SAAS,EAAE,UAAU,aAAa;AAAA,MACpC,CAAC;AACD,aAAO,SAAS;AAAA,IAClB,SAAS,OAAY;AACnB,YAAM,KAAK,YAAY,KAAK;AAAA,IAC9B;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,SAAuE;AAC3E,QAAI;AACF,YAAM,WAAW,MAAM,KAAK,OAAO,IAAI,SAAS;AAChD,aAAO,SAAS;AAAA,IAClB,SAAS,OAAY;AACnB,YAAM,KAAK,YAAY,KAAK;AAAA,IAC9B;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,qBAAqB,SAAyC;AAClE,QAAI;AACF,YAAM,KAAK,OAAO,IAAI,wBAAwB,OAAO;AAAA,IACvD,SAAS,OAAY;AACnB,YAAM,KAAK,YAAY,KAAK;AAAA,IAC9B;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,iBAAmC;AACvC,QAAI;AACF,YAAM,KAAK,OAAO;AAClB,aAAO;AAAA,IACT,QAAQ;AACN,aAAO;AAAA,IACT;AAAA,EACF;AAAA,EAEQ,YAAY,OAA6B;AAC/C,UAAM,kBAAmC,IAAI;AAAA,MAC3C,MAAM,UAAU,MAAM,WAAW,MAAM,WAAW;AAAA,IACpD;AAEA,oBAAgB,OAAO,MAAM,UAAU,MAAM,QAAQ;AACrD,oBAAgB,aAAa,MAAM,UAAU;AAC7C,oBAAgB,UAAU,MAAM,UAAU;AAE1C,WAAO;AAAA,EACT;AACF;;;AE3LO,IAAM,mBAAN,MAAuB;AAAA,EAG5B,YAAY,QAA0B;AACpC,SAAK,SAAS,IAAI,iBAAiB,MAAM;AAAA,EAC3C;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,KAAK,cAAmB;AAC5B,WAAO;AAAA,MACL,QAAQ,OAAO,SAAgC,oBAAsC;AACnF,eAAO,MAAM,KAAK,OAAO,qBAAqB,SAAS,eAAe;AAAA,MACxE;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,YAA8B;AAC5B,WAAO,KAAK;AAAA,EACd;AACF;AAKO,SAAS,uBAAuB,QAA4C;AACjF,SAAO,IAAI,iBAAiB,MAAM;AACpC;","names":["axios","config"]}
package/dist/index.mjs ADDED
@@ -0,0 +1,286 @@
1
+ // src/core/client.ts
2
+ import axios from "axios";
3
+
4
+ // src/utils/index.ts
5
+ function validateConfig(config) {
6
+ const errors = [];
7
+ if (!config.baseURL) {
8
+ errors.push("baseURL is required");
9
+ } else {
10
+ try {
11
+ new URL(config.baseURL);
12
+ } catch {
13
+ errors.push("baseURL must be a valid URL");
14
+ }
15
+ }
16
+ if (config.timeout && (config.timeout < 1e3 || config.timeout > 3e5)) {
17
+ errors.push("timeout must be between 1000 and 300000 milliseconds");
18
+ }
19
+ return {
20
+ valid: errors.length === 0,
21
+ errors
22
+ };
23
+ }
24
+ function createClient(config = {}) {
25
+ const baseURL = process.env.KORESHIELD_BASE_URL || config.baseURL;
26
+ if (!baseURL) {
27
+ throw new Error("baseURL is required. Set KORESHIELD_BASE_URL environment variable or pass baseURL in config.");
28
+ }
29
+ const defaultConfig = {
30
+ baseURL,
31
+ apiKey: process.env.KORESHIELD_API_KEY || config.apiKey,
32
+ timeout: parseInt(process.env.KORESHIELD_TIMEOUT || "30000"),
33
+ debug: process.env.KORESHIELD_DEBUG === "true" || config.debug || false,
34
+ ...config
35
+ };
36
+ const validation = validateConfig(defaultConfig);
37
+ if (!validation.valid) {
38
+ throw new Error(`Invalid configuration: ${validation.errors.join(", ")}`);
39
+ }
40
+ return new KoreShieldClient(defaultConfig);
41
+ }
42
+ function sanitizeInput(input) {
43
+ return input.replace(/<script\b[^<]*(?:(?!<\/script>)<[^<]*)*<\/script>/gi, "[SCRIPT REMOVED]").replace(/javascript:/gi, "[JAVASCRIPT REMOVED]").replace(/on\w+\s*=/gi, "[EVENT REMOVED]").trim();
44
+ }
45
+ function checkResponseSafety(response) {
46
+ const issues = [];
47
+ let severity = "low";
48
+ if (/<script/i.test(response)) {
49
+ issues.push("Contains script tags");
50
+ severity = "high";
51
+ }
52
+ if (/system prompt|you are an ai|as an ai assistant/i.test(response)) {
53
+ issues.push("Potential system prompt leakage");
54
+ severity = "medium";
55
+ }
56
+ if (/how to|step by step|step \d+|instructions? for/i.test(response) && /hack|exploit|attack|malware|virus/i.test(response)) {
57
+ issues.push("Contains potentially harmful instructions");
58
+ severity = "high";
59
+ }
60
+ return {
61
+ safe: issues.length === 0,
62
+ issues,
63
+ severity
64
+ };
65
+ }
66
+ function formatMessages(messages) {
67
+ return messages.map((msg) => ({
68
+ role: msg.role,
69
+ content: sanitizeInput(msg.content)
70
+ }));
71
+ }
72
+ function sleep(ms) {
73
+ return new Promise((resolve) => setTimeout(resolve, ms));
74
+ }
75
+ async function retry(fn, maxRetries = 3, baseDelay = 1e3) {
76
+ let lastError;
77
+ for (let attempt = 0; attempt <= maxRetries; attempt++) {
78
+ try {
79
+ return await fn();
80
+ } catch (error) {
81
+ lastError = error;
82
+ if (attempt === maxRetries) {
83
+ break;
84
+ }
85
+ const delay = baseDelay * Math.pow(2, attempt);
86
+ await sleep(delay);
87
+ }
88
+ }
89
+ throw lastError;
90
+ }
91
+
92
+ // src/core/client.ts
93
+ var KoreShieldClient = class {
94
+ constructor(config) {
95
+ const validation = validateConfig(config);
96
+ if (!validation.valid) {
97
+ throw new Error(`Invalid configuration: ${validation.errors.join(", ")}`);
98
+ }
99
+ this.config = {
100
+ baseURL: config.baseURL,
101
+ apiKey: config.apiKey || process.env.KORESHIELD_API_KEY || "",
102
+ timeout: config.timeout || 3e4,
103
+ debug: config.debug || false,
104
+ headers: config.headers || {}
105
+ };
106
+ this.client = axios.create({
107
+ baseURL: this.config.baseURL,
108
+ timeout: this.config.timeout,
109
+ headers: {
110
+ "Content-Type": "application/json",
111
+ "User-Agent": "KoreShield-JS/0.1.0",
112
+ ...this.config.headers
113
+ }
114
+ });
115
+ if (this.config.apiKey) {
116
+ this.client.defaults.headers.common["Authorization"] = `Bearer ${this.config.apiKey}`;
117
+ }
118
+ if (this.config.debug) {
119
+ this.client.interceptors.request.use(
120
+ (config2) => {
121
+ console.log("[KoreShield] Request:", config2.method?.toUpperCase(), config2.url);
122
+ return config2;
123
+ },
124
+ (error) => {
125
+ console.error("[KoreShield] Request Error:", error);
126
+ return Promise.reject(error);
127
+ }
128
+ );
129
+ this.client.interceptors.response.use(
130
+ (response) => {
131
+ console.log("[KoreShield] Response:", response.status, response.config.url);
132
+ return response;
133
+ },
134
+ (error) => {
135
+ console.error("[KoreShield] Response Error:", error.response?.status, error.response?.data);
136
+ return Promise.reject(error);
137
+ }
138
+ );
139
+ }
140
+ }
141
+ /**
142
+ * Create a chat completion request through KoreShield
143
+ */
144
+ async createChatCompletion(request, securityOptions) {
145
+ try {
146
+ const payload = {
147
+ ...request,
148
+ security: securityOptions
149
+ };
150
+ const response = await this.client.post(
151
+ "/v1/chat/completions",
152
+ payload
153
+ );
154
+ return response.data;
155
+ } catch (error) {
156
+ throw this.handleError(error);
157
+ }
158
+ }
159
+ /**
160
+ * Get security events/logs
161
+ */
162
+ async getSecurityEvents(limit = 50, offset = 0, type, severity) {
163
+ try {
164
+ const params = new URLSearchParams({
165
+ limit: limit.toString(),
166
+ offset: offset.toString()
167
+ });
168
+ if (type)
169
+ params.append("type", type);
170
+ if (severity)
171
+ params.append("severity", severity);
172
+ const response = await this.client.get(
173
+ `/api/security/events?${params}`
174
+ );
175
+ return response.data;
176
+ } catch (error) {
177
+ throw this.handleError(error);
178
+ }
179
+ }
180
+ /**
181
+ * Get metrics and statistics
182
+ */
183
+ async getMetrics() {
184
+ try {
185
+ const response = await this.client.get("/api/metrics");
186
+ return response.data;
187
+ } catch (error) {
188
+ throw this.handleError(error);
189
+ }
190
+ }
191
+ /**
192
+ * Get Prometheus metrics in text format
193
+ */
194
+ async getPrometheusMetrics() {
195
+ try {
196
+ const response = await this.client.get("/metrics", {
197
+ headers: { "Accept": "text/plain" }
198
+ });
199
+ return response.data;
200
+ } catch (error) {
201
+ throw this.handleError(error);
202
+ }
203
+ }
204
+ /**
205
+ * Health check
206
+ */
207
+ async health() {
208
+ try {
209
+ const response = await this.client.get("/health");
210
+ return response.data;
211
+ } catch (error) {
212
+ throw this.handleError(error);
213
+ }
214
+ }
215
+ /**
216
+ * Update security configuration
217
+ */
218
+ async updateSecurityConfig(options) {
219
+ try {
220
+ await this.client.put("/api/config/security", options);
221
+ } catch (error) {
222
+ throw this.handleError(error);
223
+ }
224
+ }
225
+ /**
226
+ * Test connection to KoreShield
227
+ */
228
+ async testConnection() {
229
+ try {
230
+ await this.health();
231
+ return true;
232
+ } catch {
233
+ return false;
234
+ }
235
+ }
236
+ handleError(error) {
237
+ const koreShieldError = new Error(
238
+ error.response?.data?.message || error.message || "Unknown error"
239
+ );
240
+ koreShieldError.code = error.response?.data?.code || "UNKNOWN_ERROR";
241
+ koreShieldError.statusCode = error.response?.status;
242
+ koreShieldError.details = error.response?.data;
243
+ return koreShieldError;
244
+ }
245
+ };
246
+
247
+ // src/providers/openai.ts
248
+ var KoreShieldOpenAI = class {
249
+ constructor(config) {
250
+ this.client = new KoreShieldClient(config);
251
+ }
252
+ /**
253
+ * Chat completions API (OpenAI-compatible)
254
+ */
255
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars
256
+ async chat(_completions) {
257
+ return {
258
+ create: async (request, securityOptions) => {
259
+ return await this.client.createChatCompletion(request, securityOptions);
260
+ }
261
+ };
262
+ }
263
+ /**
264
+ * Get underlying KoreShield client for advanced operations
265
+ */
266
+ getClient() {
267
+ return this.client;
268
+ }
269
+ };
270
+ function createKoreShieldOpenAI(config) {
271
+ return new KoreShieldOpenAI(config);
272
+ }
273
+ export {
274
+ KoreShieldClient,
275
+ KoreShieldOpenAI,
276
+ checkResponseSafety,
277
+ createClient,
278
+ createKoreShieldOpenAI,
279
+ KoreShieldClient as default,
280
+ formatMessages,
281
+ retry,
282
+ sanitizeInput,
283
+ sleep,
284
+ validateConfig
285
+ };
286
+ //# sourceMappingURL=index.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/core/client.ts","../src/utils/index.ts","../src/providers/openai.ts"],"sourcesContent":["/**\n * KoreShield Core Client\n */\n\nimport axios, { AxiosInstance, AxiosResponse } from 'axios';\nimport {\n KoreShieldConfig,\n SecurityOptions,\n ChatCompletionRequest,\n ChatCompletionResponse,\n SecurityEvent,\n MetricsResponse,\n KoreShieldError\n} from '../types';\nimport { validateConfig } from '../utils';\n\nexport class KoreShieldClient {\n private client: AxiosInstance;\n private config: Required<KoreShieldConfig>;\n\n constructor(config: KoreShieldConfig) {\n const validation = validateConfig(config);\n if (!validation.valid) {\n throw new Error(`Invalid configuration: ${validation.errors.join(', ')}`);\n }\n\n this.config = {\n baseURL: config.baseURL,\n apiKey: config.apiKey || process.env.KORESHIELD_API_KEY || '',\n timeout: config.timeout || 30000,\n debug: config.debug || false,\n headers: config.headers || {}\n };\n\n this.client = axios.create({\n baseURL: this.config.baseURL,\n timeout: this.config.timeout,\n headers: {\n 'Content-Type': 'application/json',\n 'User-Agent': 'KoreShield-JS/0.1.0',\n ...this.config.headers\n }\n });\n\n // Add API key to requests if provided\n if (this.config.apiKey) {\n this.client.defaults.headers.common['Authorization'] = `Bearer ${this.config.apiKey}`;\n }\n\n // Add request/response interceptors for debugging\n if (this.config.debug) {\n this.client.interceptors.request.use(\n (config) => {\n console.log('[KoreShield] Request:', config.method?.toUpperCase(), config.url);\n return config;\n },\n (error) => {\n console.error('[KoreShield] Request Error:', error);\n return Promise.reject(error);\n }\n );\n\n this.client.interceptors.response.use(\n (response) => {\n console.log('[KoreShield] Response:', response.status, response.config.url);\n return response;\n },\n (error) => {\n console.error('[KoreShield] Response Error:', error.response?.status, error.response?.data);\n return Promise.reject(error);\n }\n );\n }\n }\n\n /**\n * Create a chat completion request through KoreShield\n */\n async createChatCompletion(\n request: ChatCompletionRequest,\n securityOptions?: SecurityOptions\n ): Promise<ChatCompletionResponse> {\n try {\n const payload = {\n ...request,\n security: securityOptions\n };\n\n const response: AxiosResponse<ChatCompletionResponse> = await this.client.post(\n '/v1/chat/completions',\n payload\n );\n\n return response.data;\n } catch (error: any) {\n throw this.handleError(error);\n }\n }\n\n /**\n * Get security events/logs\n */\n async getSecurityEvents(\n limit: number = 50,\n offset: number = 0,\n type?: string,\n severity?: string\n ): Promise<SecurityEvent[]> {\n try {\n const params = new URLSearchParams({\n limit: limit.toString(),\n offset: offset.toString()\n });\n\n if (type) params.append('type', type);\n if (severity) params.append('severity', severity);\n\n const response: AxiosResponse<SecurityEvent[]> = await this.client.get(\n `/api/security/events?${params}`\n );\n\n return response.data;\n } catch (error: any) {\n throw this.handleError(error);\n }\n }\n\n /**\n * Get metrics and statistics\n */\n async getMetrics(): Promise<MetricsResponse> {\n try {\n const response: AxiosResponse<MetricsResponse> = await this.client.get('/api/metrics');\n return response.data;\n } catch (error: any) {\n throw this.handleError(error);\n }\n }\n\n /**\n * Get Prometheus metrics in text format\n */\n async getPrometheusMetrics(): Promise<string> {\n try {\n const response: AxiosResponse<string> = await this.client.get('/metrics', {\n headers: { 'Accept': 'text/plain' }\n });\n return response.data;\n } catch (error: any) {\n throw this.handleError(error);\n }\n }\n\n /**\n * Health check\n */\n async health(): Promise<{ status: string; version: string; uptime: number }> {\n try {\n const response = await this.client.get('/health');\n return response.data;\n } catch (error: any) {\n throw this.handleError(error);\n }\n }\n\n /**\n * Update security configuration\n */\n async updateSecurityConfig(options: SecurityOptions): Promise<void> {\n try {\n await this.client.put('/api/config/security', options);\n } catch (error: any) {\n throw this.handleError(error);\n }\n }\n\n /**\n * Test connection to KoreShield\n */\n async testConnection(): Promise<boolean> {\n try {\n await this.health();\n return true;\n } catch {\n return false;\n }\n }\n\n private handleError(error: any): KoreShieldError {\n const koreShieldError: KoreShieldError = new Error(\n error.response?.data?.message || error.message || 'Unknown error'\n ) as KoreShieldError;\n\n koreShieldError.code = error.response?.data?.code || 'UNKNOWN_ERROR';\n koreShieldError.statusCode = error.response?.status;\n koreShieldError.details = error.response?.data;\n\n return koreShieldError;\n }\n}","/**\n * KoreShield Utility Functions\n */\n\nimport { KoreShieldClient } from '../core/client';\nimport { KoreShieldConfig } from '../types';\n\n/**\n * Validate KoreShield configuration\n */\nexport function validateConfig(config: KoreShieldConfig): { valid: boolean; errors: string[] } {\n const errors: string[] = [];\n\n if (!config.baseURL) {\n errors.push('baseURL is required');\n } else {\n try {\n new URL(config.baseURL);\n } catch {\n errors.push('baseURL must be a valid URL');\n }\n }\n\n if (config.timeout && (config.timeout < 1000 || config.timeout > 300000)) {\n errors.push('timeout must be between 1000 and 300000 milliseconds');\n }\n\n return {\n valid: errors.length === 0,\n errors\n };\n}\n\n/**\n * Create a KoreShield client with environment variable defaults\n */\nexport function createClient(config: Partial<KoreShieldConfig> = {}): KoreShieldClient {\n const baseURL = process.env.KORESHIELD_BASE_URL || config.baseURL;\n if (!baseURL) {\n throw new Error('baseURL is required. Set KORESHIELD_BASE_URL environment variable or pass baseURL in config.');\n }\n\n const defaultConfig: KoreShieldConfig = {\n baseURL,\n apiKey: process.env.KORESHIELD_API_KEY || config.apiKey,\n timeout: parseInt(process.env.KORESHIELD_TIMEOUT || '30000'),\n debug: process.env.KORESHIELD_DEBUG === 'true' || config.debug || false,\n ...config\n };\n\n const validation = validateConfig(defaultConfig);\n if (!validation.valid) {\n throw new Error(`Invalid configuration: ${validation.errors.join(', ')}`);\n }\n\n return new KoreShieldClient(defaultConfig);\n}\n\n/**\n * Sanitize user input for safe LLM processing\n */\nexport function sanitizeInput(input: string): string {\n // Basic sanitization - remove potentially harmful patterns\n return input\n .replace(/<script\\b[^<]*(?:(?!<\\/script>)<[^<]*)*<\\/script>/gi, '[SCRIPT REMOVED]')\n .replace(/javascript:/gi, '[JAVASCRIPT REMOVED]')\n .replace(/on\\w+\\s*=/gi, '[EVENT REMOVED]')\n .trim();\n}\n\n/**\n * Check if a response contains potentially unsafe content\n */\nexport function checkResponseSafety(response: string): {\n safe: boolean;\n issues: string[];\n severity: 'low' | 'medium' | 'high';\n} {\n const issues: string[] = [];\n let severity: 'low' | 'medium' | 'high' = 'low';\n\n // Check for code injection patterns\n if (/<script/i.test(response)) {\n issues.push('Contains script tags');\n severity = 'high';\n }\n\n // Check for system prompt leakage\n if (/system prompt|you are an ai|as an ai assistant/i.test(response)) {\n issues.push('Potential system prompt leakage');\n severity = 'medium';\n }\n\n // Check for harmful instructions\n if (/how to|step by step|step \\d+|instructions? for/i.test(response) &&\n /hack|exploit|attack|malware|virus/i.test(response)) {\n issues.push('Contains potentially harmful instructions');\n severity = 'high';\n }\n\n return {\n safe: issues.length === 0,\n issues,\n severity\n };\n}\n\n/**\n * Format chat messages for KoreShield\n */\nexport function formatMessages(messages: Array<{ role: string; content: string }>) {\n return messages.map(msg => ({\n role: msg.role,\n content: sanitizeInput(msg.content)\n }));\n}\n\n/**\n * Sleep utility for rate limiting\n */\nexport function sleep(ms: number): Promise<void> {\n return new Promise(resolve => setTimeout(resolve, ms));\n}\n\n/**\n * Retry utility with exponential backoff\n */\nexport async function retry<T>(\n fn: () => Promise<T>,\n maxRetries: number = 3,\n baseDelay: number = 1000\n): Promise<T> {\n let lastError: Error;\n\n for (let attempt = 0; attempt <= maxRetries; attempt++) {\n try {\n return await fn();\n } catch (error) {\n lastError = error as Error;\n\n if (attempt === maxRetries) {\n break;\n }\n\n const delay = baseDelay * Math.pow(2, attempt);\n await sleep(delay);\n }\n }\n\n throw lastError!;\n}","/**\n * OpenAI-compatible wrapper for KoreShield\n * Provides drop-in replacement for OpenAI SDK\n */\n\nimport { KoreShieldClient } from '../core/client';\nimport {\n KoreShieldConfig,\n SecurityOptions,\n ChatCompletionRequest\n} from '../types';\n\nexport class KoreShieldOpenAI {\n private client: KoreShieldClient;\n\n constructor(config: KoreShieldConfig) {\n this.client = new KoreShieldClient(config);\n }\n\n /**\n * Chat completions API (OpenAI-compatible)\n */\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n async chat(_completions: any) {\n return {\n create: async (request: ChatCompletionRequest, securityOptions?: SecurityOptions) => {\n return await this.client.createChatCompletion(request, securityOptions);\n }\n };\n }\n\n /**\n * Get underlying KoreShield client for advanced operations\n */\n getClient(): KoreShieldClient {\n return this.client;\n }\n}\n\n/**\n * Factory function to create OpenAI-compatible instance\n */\nexport function createKoreShieldOpenAI(config: KoreShieldConfig): KoreShieldOpenAI {\n return new KoreShieldOpenAI(config);\n}"],"mappings":"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","names":["config"]}