foon-sdk 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +574 -0
- package/dist/cache/LRUCache.d.ts +36 -0
- package/dist/cache/LRUCache.d.ts.map +1 -0
- package/dist/cache/LRUCache.js +54 -0
- package/dist/cache/LRUCache.js.map +1 -0
- package/dist/cache/cache-key-generator.d.ts +9 -0
- package/dist/cache/cache-key-generator.d.ts.map +1 -0
- package/dist/cache/cache-key-generator.js +50 -0
- package/dist/cache/cache-key-generator.js.map +1 -0
- package/dist/cache/index.d.ts +3 -0
- package/dist/cache/index.d.ts.map +1 -0
- package/dist/cache/index.js +21 -0
- package/dist/cache/index.js.map +1 -0
- package/dist/engine/MappingEngine.d.ts +29 -0
- package/dist/engine/MappingEngine.d.ts.map +1 -0
- package/dist/engine/MappingEngine.js +196 -0
- package/dist/engine/MappingEngine.js.map +1 -0
- package/dist/engine/executor.d.ts +15 -0
- package/dist/engine/executor.d.ts.map +1 -0
- package/dist/engine/executor.js +137 -0
- package/dist/engine/executor.js.map +1 -0
- package/dist/engine/index.d.ts +5 -0
- package/dist/engine/index.d.ts.map +1 -0
- package/dist/engine/index.js +23 -0
- package/dist/engine/index.js.map +1 -0
- package/dist/engine/jsonpath.d.ts +17 -0
- package/dist/engine/jsonpath.d.ts.map +1 -0
- package/dist/engine/jsonpath.js +73 -0
- package/dist/engine/jsonpath.js.map +1 -0
- package/dist/engine/type-converter.d.ts +12 -0
- package/dist/engine/type-converter.d.ts.map +1 -0
- package/dist/engine/type-converter.js +106 -0
- package/dist/engine/type-converter.js.map +1 -0
- package/dist/errors/error-factory.d.ts +30 -0
- package/dist/errors/error-factory.d.ts.map +1 -0
- package/dist/errors/error-factory.js +53 -0
- package/dist/errors/error-factory.js.map +1 -0
- package/dist/errors/index.d.ts +3 -0
- package/dist/errors/index.d.ts.map +1 -0
- package/dist/errors/index.js +22 -0
- package/dist/errors/index.js.map +1 -0
- package/dist/express/FonRouter.d.ts +56 -0
- package/dist/express/FonRouter.d.ts.map +1 -0
- package/dist/express/FonRouter.js +151 -0
- package/dist/express/FonRouter.js.map +1 -0
- package/dist/express/error-handler.d.ts +10 -0
- package/dist/express/error-handler.d.ts.map +1 -0
- package/dist/express/error-handler.js +55 -0
- package/dist/express/error-handler.js.map +1 -0
- package/dist/express/index.d.ts +33 -0
- package/dist/express/index.d.ts.map +1 -0
- package/dist/express/index.js +41 -0
- package/dist/express/index.js.map +1 -0
- package/dist/express/route-registry.d.ts +33 -0
- package/dist/express/route-registry.d.ts.map +1 -0
- package/dist/express/route-registry.js +52 -0
- package/dist/express/route-registry.js.map +1 -0
- package/dist/express/transform-middleware.d.ts +21 -0
- package/dist/express/transform-middleware.d.ts.map +1 -0
- package/dist/express/transform-middleware.js +62 -0
- package/dist/express/transform-middleware.js.map +1 -0
- package/dist/express/types.d.ts +73 -0
- package/dist/express/types.d.ts.map +1 -0
- package/dist/express/types.js +3 -0
- package/dist/express/types.js.map +1 -0
- package/dist/index.d.ts +11 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +29 -0
- package/dist/index.js.map +1 -0
- package/dist/providers/base/Provider.d.ts +17 -0
- package/dist/providers/base/Provider.d.ts.map +1 -0
- package/dist/providers/base/Provider.js +43 -0
- package/dist/providers/base/Provider.js.map +1 -0
- package/dist/providers/base/index.d.ts +3 -0
- package/dist/providers/base/index.d.ts.map +1 -0
- package/dist/providers/base/index.js +21 -0
- package/dist/providers/base/index.js.map +1 -0
- package/dist/providers/base/prompt-builder.d.ts +22 -0
- package/dist/providers/base/prompt-builder.d.ts.map +1 -0
- package/dist/providers/base/prompt-builder.js +105 -0
- package/dist/providers/base/prompt-builder.js.map +1 -0
- package/dist/providers/gemini/GeminiProvider.d.ts +16 -0
- package/dist/providers/gemini/GeminiProvider.d.ts.map +1 -0
- package/dist/providers/gemini/GeminiProvider.js +48 -0
- package/dist/providers/gemini/GeminiProvider.js.map +1 -0
- package/dist/providers/gemini/gemini-client.d.ts +16 -0
- package/dist/providers/gemini/gemini-client.d.ts.map +1 -0
- package/dist/providers/gemini/gemini-client.js +83 -0
- package/dist/providers/gemini/gemini-client.js.map +1 -0
- package/dist/providers/gemini/index.d.ts +3 -0
- package/dist/providers/gemini/index.d.ts.map +1 -0
- package/dist/providers/gemini/index.js +8 -0
- package/dist/providers/gemini/index.js.map +1 -0
- package/dist/providers/index.d.ts +6 -0
- package/dist/providers/index.d.ts.map +1 -0
- package/dist/providers/index.js +27 -0
- package/dist/providers/index.js.map +1 -0
- package/dist/providers/ollama/OllamaProvider.d.ts +17 -0
- package/dist/providers/ollama/OllamaProvider.d.ts.map +1 -0
- package/dist/providers/ollama/OllamaProvider.js +47 -0
- package/dist/providers/ollama/OllamaProvider.js.map +1 -0
- package/dist/providers/ollama/index.d.ts +3 -0
- package/dist/providers/ollama/index.d.ts.map +1 -0
- package/dist/providers/ollama/index.js +8 -0
- package/dist/providers/ollama/index.js.map +1 -0
- package/dist/providers/ollama/ollama-client.d.ts +17 -0
- package/dist/providers/ollama/ollama-client.d.ts.map +1 -0
- package/dist/providers/ollama/ollama-client.js +83 -0
- package/dist/providers/ollama/ollama-client.js.map +1 -0
- package/dist/providers/openai/OpenAIProvider.d.ts +16 -0
- package/dist/providers/openai/OpenAIProvider.d.ts.map +1 -0
- package/dist/providers/openai/OpenAIProvider.js +48 -0
- package/dist/providers/openai/OpenAIProvider.js.map +1 -0
- package/dist/providers/openai/index.d.ts +3 -0
- package/dist/providers/openai/index.d.ts.map +1 -0
- package/dist/providers/openai/index.js +8 -0
- package/dist/providers/openai/index.js.map +1 -0
- package/dist/providers/openai/openai-client.d.ts +16 -0
- package/dist/providers/openai/openai-client.d.ts.map +1 -0
- package/dist/providers/openai/openai-client.js +85 -0
- package/dist/providers/openai/openai-client.js.map +1 -0
- package/dist/schema/SchemaAdapter.d.ts +34 -0
- package/dist/schema/SchemaAdapter.d.ts.map +1 -0
- package/dist/schema/SchemaAdapter.js +59 -0
- package/dist/schema/SchemaAdapter.js.map +1 -0
- package/dist/schema/field-extractor.d.ts +10 -0
- package/dist/schema/field-extractor.d.ts.map +1 -0
- package/dist/schema/field-extractor.js +58 -0
- package/dist/schema/field-extractor.js.map +1 -0
- package/dist/schema/index.d.ts +5 -0
- package/dist/schema/index.d.ts.map +1 -0
- package/dist/schema/index.js +13 -0
- package/dist/schema/index.js.map +1 -0
- package/dist/schema/normalizer.d.ts +6 -0
- package/dist/schema/normalizer.d.ts.map +1 -0
- package/dist/schema/normalizer.js +17 -0
- package/dist/schema/normalizer.js.map +1 -0
- package/dist/schema/validator.d.ts +17 -0
- package/dist/schema/validator.d.ts.map +1 -0
- package/dist/schema/validator.js +50 -0
- package/dist/schema/validator.js.map +1 -0
- package/dist/security/index.d.ts +5 -0
- package/dist/security/index.d.ts.map +1 -0
- package/dist/security/index.js +21 -0
- package/dist/security/index.js.map +1 -0
- package/dist/security/input-validator.d.ts +6 -0
- package/dist/security/input-validator.d.ts.map +1 -0
- package/dist/security/input-validator.js +76 -0
- package/dist/security/input-validator.js.map +1 -0
- package/dist/security/prompt-sanitizer.d.ts +12 -0
- package/dist/security/prompt-sanitizer.d.ts.map +1 -0
- package/dist/security/prompt-sanitizer.js +66 -0
- package/dist/security/prompt-sanitizer.js.map +1 -0
- package/dist/security/redactor.d.ts +5 -0
- package/dist/security/redactor.d.ts.map +1 -0
- package/dist/security/redactor.js +37 -0
- package/dist/security/redactor.js.map +1 -0
- package/dist/security/security-config.d.ts +10 -0
- package/dist/security/security-config.d.ts.map +1 -0
- package/dist/security/security-config.js +26 -0
- package/dist/security/security-config.js.map +1 -0
- package/dist/trace/TraceBuilder.d.ts +58 -0
- package/dist/trace/TraceBuilder.d.ts.map +1 -0
- package/dist/trace/TraceBuilder.js +117 -0
- package/dist/trace/TraceBuilder.js.map +1 -0
- package/dist/trace/confidence-analyzer.d.ts +6 -0
- package/dist/trace/confidence-analyzer.d.ts.map +1 -0
- package/dist/trace/confidence-analyzer.js +30 -0
- package/dist/trace/confidence-analyzer.js.map +1 -0
- package/dist/trace/index.d.ts +4 -0
- package/dist/trace/index.d.ts.map +1 -0
- package/dist/trace/index.js +22 -0
- package/dist/trace/index.js.map +1 -0
- package/dist/trace/trace-utils.d.ts +20 -0
- package/dist/trace/trace-utils.d.ts.map +1 -0
- package/dist/trace/trace-utils.js +33 -0
- package/dist/trace/trace-utils.js.map +1 -0
- package/dist/transform.d.ts +30 -0
- package/dist/transform.d.ts.map +1 -0
- package/dist/transform.js +62 -0
- package/dist/transform.js.map +1 -0
- package/dist/types/cache.types.d.ts +41 -0
- package/dist/types/cache.types.d.ts.map +1 -0
- package/dist/types/cache.types.js +3 -0
- package/dist/types/cache.types.js.map +1 -0
- package/dist/types/errors.types.d.ts +22 -0
- package/dist/types/errors.types.d.ts.map +1 -0
- package/dist/types/errors.types.js +31 -0
- package/dist/types/errors.types.js.map +1 -0
- package/dist/types/index.d.ts +9 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +8 -0
- package/dist/types/index.js.map +1 -0
- package/dist/types/mapping.types.d.ts +48 -0
- package/dist/types/mapping.types.d.ts.map +1 -0
- package/dist/types/mapping.types.js +3 -0
- package/dist/types/mapping.types.js.map +1 -0
- package/dist/types/provider.types.d.ts +62 -0
- package/dist/types/provider.types.d.ts.map +1 -0
- package/dist/types/provider.types.js +3 -0
- package/dist/types/provider.types.js.map +1 -0
- package/dist/types/schema.types.d.ts +68 -0
- package/dist/types/schema.types.d.ts.map +1 -0
- package/dist/types/schema.types.js +3 -0
- package/dist/types/schema.types.js.map +1 -0
- package/dist/types/security.types.d.ts +32 -0
- package/dist/types/security.types.d.ts.map +1 -0
- package/dist/types/security.types.js +3 -0
- package/dist/types/security.types.js.map +1 -0
- package/dist/types/trace.types.d.ts +129 -0
- package/dist/types/trace.types.d.ts.map +1 -0
- package/dist/types/trace.types.js +3 -0
- package/dist/types/trace.types.js.map +1 -0
- package/dist/types/transform.types.d.ts +56 -0
- package/dist/types/transform.types.d.ts.map +1 -0
- package/dist/types/transform.types.js +3 -0
- package/dist/types/transform.types.js.map +1 -0
- package/package.json +107 -0
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.OpenAIClient = void 0;
|
|
4
|
+
const errors_1 = require("../../errors");
|
|
5
|
+
/**
|
|
6
|
+
* OpenAI API client
|
|
7
|
+
*/
|
|
8
|
+
class OpenAIClient {
|
|
9
|
+
constructor(config) {
|
|
10
|
+
if (!config.apiKey) {
|
|
11
|
+
throw new Error('OpenAI API key is required');
|
|
12
|
+
}
|
|
13
|
+
this.apiKey = config.apiKey;
|
|
14
|
+
this.model = config.model || 'gpt-4o-mini';
|
|
15
|
+
this.baseUrl = config.baseUrl || 'https://api.openai.com/v1';
|
|
16
|
+
this.timeout = config.timeout || 30000;
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* Generate content using OpenAI Chat Completions API
|
|
20
|
+
*/
|
|
21
|
+
async generateContent(systemPrompt, userPrompt) {
|
|
22
|
+
const url = `${this.baseUrl}/chat/completions`;
|
|
23
|
+
const payload = {
|
|
24
|
+
model: this.model,
|
|
25
|
+
messages: [
|
|
26
|
+
{
|
|
27
|
+
role: 'system',
|
|
28
|
+
content: systemPrompt,
|
|
29
|
+
},
|
|
30
|
+
{
|
|
31
|
+
role: 'user',
|
|
32
|
+
content: userPrompt,
|
|
33
|
+
},
|
|
34
|
+
],
|
|
35
|
+
response_format: { type: 'json_object' }, // Request JSON output
|
|
36
|
+
max_completion_tokens: 8192, // Use max_completion_tokens for newer models
|
|
37
|
+
};
|
|
38
|
+
// Only add temperature for models that support it (some restricted models don't)
|
|
39
|
+
// Most production models support temperature, but some preview/nano models don't
|
|
40
|
+
if (!this.model.includes('nano')) {
|
|
41
|
+
payload.temperature = 0.1;
|
|
42
|
+
}
|
|
43
|
+
try {
|
|
44
|
+
const controller = new AbortController();
|
|
45
|
+
const timeoutId = setTimeout(() => controller.abort(), this.timeout);
|
|
46
|
+
const response = await fetch(url, {
|
|
47
|
+
method: 'POST',
|
|
48
|
+
headers: {
|
|
49
|
+
'Content-Type': 'application/json',
|
|
50
|
+
Authorization: `Bearer ${this.apiKey}`,
|
|
51
|
+
},
|
|
52
|
+
body: JSON.stringify(payload),
|
|
53
|
+
signal: controller.signal,
|
|
54
|
+
});
|
|
55
|
+
clearTimeout(timeoutId);
|
|
56
|
+
if (!response.ok) {
|
|
57
|
+
const errorBody = await response.text();
|
|
58
|
+
throw (0, errors_1.createProviderError)(`OpenAI API error (${response.status}): ${errorBody}`, {
|
|
59
|
+
status: response.status,
|
|
60
|
+
body: errorBody,
|
|
61
|
+
});
|
|
62
|
+
}
|
|
63
|
+
const data = (await response.json());
|
|
64
|
+
// Extract text from response
|
|
65
|
+
if (!data.choices ||
|
|
66
|
+
!data.choices[0] ||
|
|
67
|
+
!data.choices[0].message ||
|
|
68
|
+
!data.choices[0].message.content) {
|
|
69
|
+
throw (0, errors_1.createProviderError)('Invalid OpenAI API response structure', { response: data });
|
|
70
|
+
}
|
|
71
|
+
return data.choices[0].message.content;
|
|
72
|
+
}
|
|
73
|
+
catch (error) {
|
|
74
|
+
if (error instanceof Error && error.name === 'AbortError') {
|
|
75
|
+
throw (0, errors_1.createProviderError)(`OpenAI API request timed out after ${this.timeout}ms`);
|
|
76
|
+
}
|
|
77
|
+
if (error instanceof Error && error.message.includes('OpenAI API')) {
|
|
78
|
+
throw error;
|
|
79
|
+
}
|
|
80
|
+
throw (0, errors_1.createProviderError)(`OpenAI API request failed: ${error instanceof Error ? error.message : String(error)}`, { originalError: error });
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
exports.OpenAIClient = OpenAIClient;
|
|
85
|
+
//# sourceMappingURL=openai-client.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"openai-client.js","sourceRoot":"","sources":["../../../src/providers/openai/openai-client.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import { SchemaAdapter as ISchemaAdapter, NormalizedSchema, SchemaField, ValidationResult } from '../types';
|
|
2
|
+
/**
|
|
3
|
+
* Schema Adapter implementation
|
|
4
|
+
*/
|
|
5
|
+
export declare class SchemaAdapter implements ISchemaAdapter {
|
|
6
|
+
private normalizedSchema;
|
|
7
|
+
private validator;
|
|
8
|
+
constructor(schema: object);
|
|
9
|
+
/**
|
|
10
|
+
* Get the normalized schema
|
|
11
|
+
*/
|
|
12
|
+
getNormalizedSchema(): NormalizedSchema;
|
|
13
|
+
/**
|
|
14
|
+
* List all fields
|
|
15
|
+
*/
|
|
16
|
+
listFields(): SchemaField[];
|
|
17
|
+
/**
|
|
18
|
+
* Get a specific field by path
|
|
19
|
+
*/
|
|
20
|
+
getField(path: string): SchemaField | undefined;
|
|
21
|
+
/**
|
|
22
|
+
* Check if a path is required
|
|
23
|
+
*/
|
|
24
|
+
isRequired(path: string): boolean;
|
|
25
|
+
/**
|
|
26
|
+
* Validate a payload against the schema
|
|
27
|
+
*/
|
|
28
|
+
validate(payload: unknown): ValidationResult;
|
|
29
|
+
/**
|
|
30
|
+
* Create a SchemaAdapter from a schema object
|
|
31
|
+
*/
|
|
32
|
+
static from(schema: object): SchemaAdapter;
|
|
33
|
+
}
|
|
34
|
+
//# sourceMappingURL=SchemaAdapter.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SchemaAdapter.d.ts","sourceRoot":"","sources":["../../src/schema/SchemaAdapter.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,aAAa,IAAI,cAAc,EAC/B,gBAAgB,EAChB,WAAW,EACX,gBAAgB,EACjB,MAAM,UAAU,CAAC;AAKlB;;GAEG;AACH,qBAAa,aAAc,YAAW,cAAc;IAClD,OAAO,CAAC,gBAAgB,CAAmB;IAC3C,OAAO,CAAC,SAAS,CAAkB;gBAEvB,MAAM,EAAE,MAAM;IAY1B;;OAEG;IACH,mBAAmB,IAAI,gBAAgB;IAIvC;;OAEG;IACH,UAAU,IAAI,WAAW,EAAE;IAI3B;;OAEG;IACH,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,WAAW,GAAG,SAAS;IAI/C;;OAEG;IACH,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO;IAKjC;;OAEG;IACH,QAAQ,CAAC,OAAO,EAAE,OAAO,GAAG,gBAAgB;IAI5C;;OAEG;IACH,MAAM,CAAC,IAAI,CAAC,MAAM,EAAE,MAAM,GAAG,aAAa;CAG3C"}
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.SchemaAdapter = void 0;
|
|
4
|
+
const normalizer_1 = require("./normalizer");
|
|
5
|
+
const validator_1 = require("./validator");
|
|
6
|
+
const errors_1 = require("../errors");
|
|
7
|
+
/**
|
|
8
|
+
* Schema Adapter implementation
|
|
9
|
+
*/
|
|
10
|
+
class SchemaAdapter {
|
|
11
|
+
constructor(schema) {
|
|
12
|
+
try {
|
|
13
|
+
this.normalizedSchema = (0, normalizer_1.normalizeSchema)(schema);
|
|
14
|
+
this.validator = new validator_1.SchemaValidator(schema);
|
|
15
|
+
}
|
|
16
|
+
catch (error) {
|
|
17
|
+
throw (0, errors_1.createSchemaLoadError)(`Failed to load schema: ${error instanceof Error ? error.message : String(error)}`, { originalError: error });
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* Get the normalized schema
|
|
22
|
+
*/
|
|
23
|
+
getNormalizedSchema() {
|
|
24
|
+
return this.normalizedSchema;
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* List all fields
|
|
28
|
+
*/
|
|
29
|
+
listFields() {
|
|
30
|
+
return this.normalizedSchema.fields;
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Get a specific field by path
|
|
34
|
+
*/
|
|
35
|
+
getField(path) {
|
|
36
|
+
return this.normalizedSchema.fields.find((f) => f.path === path);
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* Check if a path is required
|
|
40
|
+
*/
|
|
41
|
+
isRequired(path) {
|
|
42
|
+
const field = this.getField(path);
|
|
43
|
+
return field?.required || false;
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* Validate a payload against the schema
|
|
47
|
+
*/
|
|
48
|
+
validate(payload) {
|
|
49
|
+
return this.validator.validate(payload);
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* Create a SchemaAdapter from a schema object
|
|
53
|
+
*/
|
|
54
|
+
static from(schema) {
|
|
55
|
+
return new SchemaAdapter(schema);
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
exports.SchemaAdapter = SchemaAdapter;
|
|
59
|
+
//# sourceMappingURL=SchemaAdapter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SchemaAdapter.js","sourceRoot":"","sources":["../../src/schema/SchemaAdapter.ts"],"names":[],"mappings":";;;AAMA,6CAA+C;AAC/C,2CAA8C;AAC9C,sCAAkD;AAElD;;GAEG;AACH,MAAa,aAAa;IAIxB,YAAY,MAAc;QACxB,IAAI,CAAC;YACH,IAAI,CAAC,gBAAgB,GAAG,IAAA,4BAAe,EAAC,MAAM,CAAC,CAAC;YAChD,IAAI,CAAC,SAAS,GAAG,IAAI,2BAAe,CAAC,MAAM,CAAC,CAAC;QAC/C,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,IAAA,8BAAqB,EACzB,0BAA0B,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,EAClF,EAAE,aAAa,EAAE,KAAK,EAAE,CACzB,CAAC;QACJ,CAAC;IACH,CAAC;IAED;;OAEG;IACH,mBAAmB;QACjB,OAAO,IAAI,CAAC,gBAAgB,CAAC;IAC/B,CAAC;IAED;;OAEG;IACH,UAAU;QACR,OAAO,IAAI,CAAC,gBAAgB,CAAC,MAAM,CAAC;IACtC,CAAC;IAED;;OAEG;IACH,QAAQ,CAAC,IAAY;QACnB,OAAO,IAAI,CAAC,gBAAgB,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,CAAC;IACnE,CAAC;IAED;;OAEG;IACH,UAAU,CAAC,IAAY;QACrB,MAAM,KAAK,GAAG,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;QAClC,OAAO,KAAK,EAAE,QAAQ,IAAI,KAAK,CAAC;IAClC,CAAC;IAED;;OAEG;IACH,QAAQ,CAAC,OAAgB;QACvB,OAAO,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;IAC1C,CAAC;IAED;;OAEG;IACH,MAAM,CAAC,IAAI,CAAC,MAAc;QACxB,OAAO,IAAI,aAAa,CAAC,MAAM,CAAC,CAAC;IACnC,CAAC;CACF;AA1DD,sCA0DC"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { SchemaField } from '../types';
|
|
2
|
+
/**
|
|
3
|
+
* Extract fields from JSON Schema
|
|
4
|
+
*/
|
|
5
|
+
export declare function extractFields(schema: any, basePath?: string): SchemaField[];
|
|
6
|
+
/**
|
|
7
|
+
* Generate schema version (hash of schema)
|
|
8
|
+
*/
|
|
9
|
+
export declare function generateSchemaVersion(schema: object): string;
|
|
10
|
+
//# sourceMappingURL=field-extractor.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"field-extractor.d.ts","sourceRoot":"","sources":["../../src/schema/field-extractor.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AAGvC;;GAEG;AACH,wBAAgB,aAAa,CAAC,MAAM,EAAE,GAAG,EAAE,QAAQ,GAAE,MAAY,GAAG,WAAW,EAAE,CA+BhF;AAiBD;;GAEG;AACH,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAG5D"}
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.extractFields = extractFields;
|
|
7
|
+
exports.generateSchemaVersion = generateSchemaVersion;
|
|
8
|
+
const crypto_1 = __importDefault(require("crypto"));
|
|
9
|
+
/**
|
|
10
|
+
* Extract fields from JSON Schema
|
|
11
|
+
*/
|
|
12
|
+
function extractFields(schema, basePath = '$') {
|
|
13
|
+
const fields = [];
|
|
14
|
+
// Handle object type
|
|
15
|
+
if (schema.type === 'object' && schema.properties) {
|
|
16
|
+
for (const [key, propSchema] of Object.entries(schema.properties)) {
|
|
17
|
+
const path = `${basePath}.${key}`;
|
|
18
|
+
const isRequired = schema.required?.includes(key) || false;
|
|
19
|
+
fields.push(createField(path, propSchema, isRequired));
|
|
20
|
+
// Recursively extract nested fields
|
|
21
|
+
if (propSchema.type === 'object' && propSchema.properties) {
|
|
22
|
+
fields.push(...extractFields(propSchema, path));
|
|
23
|
+
}
|
|
24
|
+
// Handle arrays with object items
|
|
25
|
+
if (propSchema.type === 'array' &&
|
|
26
|
+
propSchema.items?.type === 'object') {
|
|
27
|
+
const itemSchema = propSchema.items;
|
|
28
|
+
const arrayPath = `${path}[*]`;
|
|
29
|
+
if (itemSchema.properties) {
|
|
30
|
+
fields.push(...extractFields(itemSchema, arrayPath));
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
return fields;
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Create a SchemaField from JSON Schema property
|
|
39
|
+
*/
|
|
40
|
+
function createField(path, propSchema, required) {
|
|
41
|
+
return {
|
|
42
|
+
path,
|
|
43
|
+
type: propSchema.type || 'any',
|
|
44
|
+
required,
|
|
45
|
+
description: propSchema.description,
|
|
46
|
+
format: propSchema.format,
|
|
47
|
+
enum: propSchema.enum,
|
|
48
|
+
default: propSchema.default,
|
|
49
|
+
};
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* Generate schema version (hash of schema)
|
|
53
|
+
*/
|
|
54
|
+
function generateSchemaVersion(schema) {
|
|
55
|
+
const schemaStr = JSON.stringify(schema, Object.keys(schema).sort());
|
|
56
|
+
return crypto_1.default.createHash('sha256').update(schemaStr).digest('hex').substring(0, 16);
|
|
57
|
+
}
|
|
58
|
+
//# sourceMappingURL=field-extractor.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"field-extractor.js","sourceRoot":"","sources":["../../src/schema/field-extractor.ts"],"names":[],"mappings":";;;;;AAMA,sCA+BC;AAoBD,sDAGC;AA3DD,oDAA4B;AAE5B;;GAEG;AACH,SAAgB,aAAa,CAAC,MAAW,EAAE,WAAmB,GAAG;IAC/D,MAAM,MAAM,GAAkB,EAAE,CAAC;IAEjC,qBAAqB;IACrB,IAAI,MAAM,CAAC,IAAI,KAAK,QAAQ,IAAI,MAAM,CAAC,UAAU,EAAE,CAAC;QAClD,KAAK,MAAM,CAAC,GAAG,EAAE,UAAU,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,UAAU,CAAC,EAAE,CAAC;YAClE,MAAM,IAAI,GAAG,GAAG,QAAQ,IAAI,GAAG,EAAE,CAAC;YAClC,MAAM,UAAU,GAAG,MAAM,CAAC,QAAQ,EAAE,QAAQ,CAAC,GAAG,CAAC,IAAI,KAAK,CAAC;YAE3D,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,IAAI,EAAE,UAAiB,EAAE,UAAU,CAAC,CAAC,CAAC;YAE9D,oCAAoC;YACpC,IAAK,UAAkB,CAAC,IAAI,KAAK,QAAQ,IAAK,UAAkB,CAAC,UAAU,EAAE,CAAC;gBAC5E,MAAM,CAAC,IAAI,CAAC,GAAG,aAAa,CAAC,UAAiB,EAAE,IAAI,CAAC,CAAC,CAAC;YACzD,CAAC;YAED,kCAAkC;YAClC,IACG,UAAkB,CAAC,IAAI,KAAK,OAAO;gBACnC,UAAkB,CAAC,KAAK,EAAE,IAAI,KAAK,QAAQ,EAC5C,CAAC;gBACD,MAAM,UAAU,GAAI,UAAkB,CAAC,KAAK,CAAC;gBAC7C,MAAM,SAAS,GAAG,GAAG,IAAI,KAAK,CAAC;gBAC/B,IAAI,UAAU,CAAC,UAAU,EAAE,CAAC;oBAC1B,MAAM,CAAC,IAAI,CAAC,GAAG,aAAa,CAAC,UAAU,EAAE,SAAS,CAAC,CAAC,CAAC;gBACvD,CAAC;YACH,CAAC;QACH,CAAC;IACH,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC;AAED;;GAEG;AACH,SAAS,WAAW,CAAC,IAAY,EAAE,UAAe,EAAE,QAAiB;IACnE,OAAO;QACL,IAAI;QACJ,IAAI,EAAE,UAAU,CAAC,IAAI,IAAI,KAAK;QAC9B,QAAQ;QACR,WAAW,EAAE,UAAU,CAAC,WAAW;QACnC,MAAM,EAAE,UAAU,CAAC,MAAM;QACzB,IAAI,EAAE,UAAU,CAAC,IAAI;QACrB,OAAO,EAAE,UAAU,CAAC,OAAO;KAC5B,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,SAAgB,qBAAqB,CAAC,MAAc;IAClD,MAAM,SAAS,GAAG,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;IACrE,OAAO,gBAAM,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,SAAS,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;AACtF,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/schema/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAChD,OAAO,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAC/C,OAAO,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAC9C,OAAO,EAAE,aAAa,EAAE,qBAAqB,EAAE,MAAM,mBAAmB,CAAC"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.generateSchemaVersion = exports.extractFields = exports.SchemaValidator = exports.normalizeSchema = exports.SchemaAdapter = void 0;
|
|
4
|
+
var SchemaAdapter_1 = require("./SchemaAdapter");
|
|
5
|
+
Object.defineProperty(exports, "SchemaAdapter", { enumerable: true, get: function () { return SchemaAdapter_1.SchemaAdapter; } });
|
|
6
|
+
var normalizer_1 = require("./normalizer");
|
|
7
|
+
Object.defineProperty(exports, "normalizeSchema", { enumerable: true, get: function () { return normalizer_1.normalizeSchema; } });
|
|
8
|
+
var validator_1 = require("./validator");
|
|
9
|
+
Object.defineProperty(exports, "SchemaValidator", { enumerable: true, get: function () { return validator_1.SchemaValidator; } });
|
|
10
|
+
var field_extractor_1 = require("./field-extractor");
|
|
11
|
+
Object.defineProperty(exports, "extractFields", { enumerable: true, get: function () { return field_extractor_1.extractFields; } });
|
|
12
|
+
Object.defineProperty(exports, "generateSchemaVersion", { enumerable: true, get: function () { return field_extractor_1.generateSchemaVersion; } });
|
|
13
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/schema/index.ts"],"names":[],"mappings":";;;AAAA,iDAAgD;AAAvC,8GAAA,aAAa,OAAA;AACtB,2CAA+C;AAAtC,6GAAA,eAAe,OAAA;AACxB,yCAA8C;AAArC,4GAAA,eAAe,OAAA;AACxB,qDAAyE;AAAhE,gHAAA,aAAa,OAAA;AAAE,wHAAA,qBAAqB,OAAA"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"normalizer.d.ts","sourceRoot":"","sources":["../../src/schema/normalizer.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,UAAU,CAAC;AAG5C;;GAEG;AACH,wBAAgB,eAAe,CAAC,MAAM,EAAE,MAAM,GAAG,gBAAgB,CAShE"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.normalizeSchema = normalizeSchema;
|
|
4
|
+
const field_extractor_1 = require("./field-extractor");
|
|
5
|
+
/**
|
|
6
|
+
* Normalize JSON Schema to internal representation
|
|
7
|
+
*/
|
|
8
|
+
function normalizeSchema(schema) {
|
|
9
|
+
const fields = (0, field_extractor_1.extractFields)(schema);
|
|
10
|
+
const version = (0, field_extractor_1.generateSchemaVersion)(schema);
|
|
11
|
+
return {
|
|
12
|
+
version,
|
|
13
|
+
fields,
|
|
14
|
+
raw: schema,
|
|
15
|
+
};
|
|
16
|
+
}
|
|
17
|
+
//# sourceMappingURL=normalizer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"normalizer.js","sourceRoot":"","sources":["../../src/schema/normalizer.ts"],"names":[],"mappings":";;AAMA,0CASC;AAdD,uDAAyE;AAEzE;;GAEG;AACH,SAAgB,eAAe,CAAC,MAAc;IAC5C,MAAM,MAAM,GAAG,IAAA,+BAAa,EAAC,MAAM,CAAC,CAAC;IACrC,MAAM,OAAO,GAAG,IAAA,uCAAqB,EAAC,MAAM,CAAC,CAAC;IAE9C,OAAO;QACL,OAAO;QACP,MAAM;QACN,GAAG,EAAE,MAAM;KACZ,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { ValidationResult } from '../types';
|
|
2
|
+
/**
|
|
3
|
+
* JSON Schema validator using AJV
|
|
4
|
+
*/
|
|
5
|
+
export declare class SchemaValidator {
|
|
6
|
+
private ajv;
|
|
7
|
+
constructor(schema: object);
|
|
8
|
+
/**
|
|
9
|
+
* Validate a payload against the schema
|
|
10
|
+
*/
|
|
11
|
+
validate(payload: unknown): ValidationResult;
|
|
12
|
+
/**
|
|
13
|
+
* Convert AJV error to ValidationError
|
|
14
|
+
*/
|
|
15
|
+
private convertAjvError;
|
|
16
|
+
}
|
|
17
|
+
//# sourceMappingURL=validator.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validator.d.ts","sourceRoot":"","sources":["../../src/schema/validator.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,gBAAgB,EAAmB,MAAM,UAAU,CAAC;AAE7D;;GAEG;AACH,qBAAa,eAAe;IAC1B,OAAO,CAAC,GAAG,CAAM;gBAEL,MAAM,EAAE,MAAM;IAa1B;;OAEG;IACH,QAAQ,CAAC,OAAO,EAAE,OAAO,GAAG,gBAAgB;IAc5C;;OAEG;IACH,OAAO,CAAC,eAAe;CAQxB"}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.SchemaValidator = void 0;
|
|
7
|
+
const ajv_1 = __importDefault(require("ajv"));
|
|
8
|
+
const ajv_formats_1 = __importDefault(require("ajv-formats"));
|
|
9
|
+
/**
|
|
10
|
+
* JSON Schema validator using AJV
|
|
11
|
+
*/
|
|
12
|
+
class SchemaValidator {
|
|
13
|
+
constructor(schema) {
|
|
14
|
+
this.ajv = new ajv_1.default({
|
|
15
|
+
strict: false, // Allow unknown formats
|
|
16
|
+
allErrors: true,
|
|
17
|
+
verbose: true,
|
|
18
|
+
});
|
|
19
|
+
// Add format support (email, date-time, etc.)
|
|
20
|
+
(0, ajv_formats_1.default)(this.ajv);
|
|
21
|
+
this.ajv.addSchema(schema, 'target-schema');
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* Validate a payload against the schema
|
|
25
|
+
*/
|
|
26
|
+
validate(payload) {
|
|
27
|
+
const valid = this.ajv.validate('target-schema', payload);
|
|
28
|
+
if (valid) {
|
|
29
|
+
return { valid: true, errors: [] };
|
|
30
|
+
}
|
|
31
|
+
const errors = this.ajv.errors || [];
|
|
32
|
+
return {
|
|
33
|
+
valid: false,
|
|
34
|
+
errors: errors.map((err) => this.convertAjvError(err)),
|
|
35
|
+
};
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Convert AJV error to ValidationError
|
|
39
|
+
*/
|
|
40
|
+
convertAjvError(error) {
|
|
41
|
+
return {
|
|
42
|
+
path: error.instancePath || '$',
|
|
43
|
+
message: error.message || 'Validation failed',
|
|
44
|
+
keyword: error.keyword,
|
|
45
|
+
params: error.params,
|
|
46
|
+
};
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
exports.SchemaValidator = SchemaValidator;
|
|
50
|
+
//# sourceMappingURL=validator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validator.js","sourceRoot":"","sources":["../../src/schema/validator.ts"],"names":[],"mappings":";;;;;;AAAA,8CAAuC;AACvC,8DAAqC;AAGrC;;GAEG;AACH,MAAa,eAAe;IAG1B,YAAY,MAAc;QACxB,IAAI,CAAC,GAAG,GAAG,IAAI,aAAG,CAAC;YACjB,MAAM,EAAE,KAAK,EAAE,wBAAwB;YACvC,SAAS,EAAE,IAAI;YACf,OAAO,EAAE,IAAI;SACd,CAAC,CAAC;QAEH,8CAA8C;QAC9C,IAAA,qBAAU,EAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QAErB,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,MAAM,EAAE,eAAe,CAAC,CAAC;IAC9C,CAAC;IAED;;OAEG;IACH,QAAQ,CAAC,OAAgB;QACvB,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,eAAe,EAAE,OAAO,CAAC,CAAC;QAE1D,IAAI,KAAK,EAAE,CAAC;YACV,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC;QACrC,CAAC;QAED,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,MAAM,IAAI,EAAE,CAAC;QACrC,OAAO;YACL,KAAK,EAAE,KAAK;YACZ,MAAM,EAAE,MAAM,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,CAAC;SACvD,CAAC;IACJ,CAAC;IAED;;OAEG;IACK,eAAe,CAAC,KAAkB;QACxC,OAAO;YACL,IAAI,EAAE,KAAK,CAAC,YAAY,IAAI,GAAG;YAC/B,OAAO,EAAE,KAAK,CAAC,OAAO,IAAI,mBAAmB;YAC7C,OAAO,EAAE,KAAK,CAAC,OAAO;YACtB,MAAM,EAAE,KAAK,CAAC,MAAM;SACrB,CAAC;IACJ,CAAC;CACF;AA5CD,0CA4CC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/security/index.ts"],"names":[],"mappings":"AAAA,cAAc,mBAAmB,CAAC;AAClC,cAAc,mBAAmB,CAAC;AAClC,cAAc,YAAY,CAAC;AAC3B,cAAc,oBAAoB,CAAC"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
14
|
+
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
|
15
|
+
};
|
|
16
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
17
|
+
__exportStar(require("./security-config"), exports);
|
|
18
|
+
__exportStar(require("./input-validator"), exports);
|
|
19
|
+
__exportStar(require("./redactor"), exports);
|
|
20
|
+
__exportStar(require("./prompt-sanitizer"), exports);
|
|
21
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/security/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,oDAAkC;AAClC,oDAAkC;AAClC,6CAA2B;AAC3B,qDAAmC"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import { InputValidationResult, SecurityOptions } from '../types';
|
|
2
|
+
/**
|
|
3
|
+
* Validate input against security limits
|
|
4
|
+
*/
|
|
5
|
+
export declare function validateInput(input: unknown, security: Required<SecurityOptions>): InputValidationResult;
|
|
6
|
+
//# sourceMappingURL=input-validator.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"input-validator.d.ts","sourceRoot":"","sources":["../../src/security/input-validator.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,qBAAqB,EAAE,eAAe,EAAE,MAAM,UAAU,CAAC;AAElE;;GAEG;AACH,wBAAgB,aAAa,CAC3B,KAAK,EAAE,OAAO,EACd,QAAQ,EAAE,QAAQ,CAAC,eAAe,CAAC,GAClC,qBAAqB,CAkCvB"}
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.validateInput = validateInput;
|
|
4
|
+
/**
|
|
5
|
+
* Validate input against security limits
|
|
6
|
+
*/
|
|
7
|
+
function validateInput(input, security) {
|
|
8
|
+
const errors = [];
|
|
9
|
+
// Check input size
|
|
10
|
+
const inputStr = JSON.stringify(input);
|
|
11
|
+
const size = Buffer.byteLength(inputStr, 'utf8');
|
|
12
|
+
if (size > security.maxInputSize) {
|
|
13
|
+
errors.push(`Input size (${size} bytes) exceeds maximum allowed (${security.maxInputSize} bytes)`);
|
|
14
|
+
}
|
|
15
|
+
// Check depth
|
|
16
|
+
const depth = getDepth(input);
|
|
17
|
+
if (depth > security.maxDepth) {
|
|
18
|
+
errors.push(`Input depth (${depth}) exceeds maximum allowed (${security.maxDepth})`);
|
|
19
|
+
}
|
|
20
|
+
// Check key count
|
|
21
|
+
const keyCount = countKeys(input);
|
|
22
|
+
if (keyCount > security.maxKeys) {
|
|
23
|
+
errors.push(`Input key count (${keyCount}) exceeds maximum allowed (${security.maxKeys})`);
|
|
24
|
+
}
|
|
25
|
+
return {
|
|
26
|
+
valid: errors.length === 0,
|
|
27
|
+
errors,
|
|
28
|
+
stats: {
|
|
29
|
+
size,
|
|
30
|
+
depth,
|
|
31
|
+
keys: keyCount,
|
|
32
|
+
},
|
|
33
|
+
};
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* Get maximum depth of nested object
|
|
37
|
+
*/
|
|
38
|
+
function getDepth(obj, currentDepth = 0) {
|
|
39
|
+
if (currentDepth > 100)
|
|
40
|
+
return currentDepth; // Prevent infinite recursion
|
|
41
|
+
if (obj === null || obj === undefined)
|
|
42
|
+
return currentDepth;
|
|
43
|
+
if (Array.isArray(obj)) {
|
|
44
|
+
if (obj.length === 0)
|
|
45
|
+
return currentDepth + 1;
|
|
46
|
+
return Math.max(...obj.map((item) => getDepth(item, currentDepth + 1)));
|
|
47
|
+
}
|
|
48
|
+
if (typeof obj === 'object') {
|
|
49
|
+
const values = Object.values(obj);
|
|
50
|
+
if (values.length === 0)
|
|
51
|
+
return currentDepth + 1;
|
|
52
|
+
return Math.max(...values.map((value) => getDepth(value, currentDepth + 1)));
|
|
53
|
+
}
|
|
54
|
+
return currentDepth;
|
|
55
|
+
}
|
|
56
|
+
/**
|
|
57
|
+
* Count total number of keys
|
|
58
|
+
*/
|
|
59
|
+
function countKeys(obj, count = 0) {
|
|
60
|
+
if (count > 10000)
|
|
61
|
+
return count; // Prevent infinite recursion
|
|
62
|
+
if (obj === null || obj === undefined)
|
|
63
|
+
return count;
|
|
64
|
+
if (Array.isArray(obj)) {
|
|
65
|
+
return obj.reduce((acc, item) => countKeys(item, acc), count);
|
|
66
|
+
}
|
|
67
|
+
if (typeof obj === 'object') {
|
|
68
|
+
let total = count + Object.keys(obj).length;
|
|
69
|
+
for (const value of Object.values(obj)) {
|
|
70
|
+
total = countKeys(value, total);
|
|
71
|
+
}
|
|
72
|
+
return total;
|
|
73
|
+
}
|
|
74
|
+
return count;
|
|
75
|
+
}
|
|
76
|
+
//# sourceMappingURL=input-validator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"input-validator.js","sourceRoot":"","sources":["../../src/security/input-validator.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Sanitize prompts to mitigate prompt injection attacks
|
|
3
|
+
*/
|
|
4
|
+
/**
|
|
5
|
+
* Check if input contains suspicious prompt injection patterns
|
|
6
|
+
*/
|
|
7
|
+
export declare function detectPromptInjection(input: string): boolean;
|
|
8
|
+
/**
|
|
9
|
+
* Sanitize string fields in input to prevent prompt injection
|
|
10
|
+
*/
|
|
11
|
+
export declare function sanitizeInput(input: unknown): unknown;
|
|
12
|
+
//# sourceMappingURL=prompt-sanitizer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"prompt-sanitizer.d.ts","sourceRoot":"","sources":["../../src/security/prompt-sanitizer.ts"],"names":[],"mappings":"AAAA;;GAEG;AAYH;;GAEG;AACH,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAE5D;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CA4BrD"}
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Sanitize prompts to mitigate prompt injection attacks
|
|
4
|
+
*/
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.detectPromptInjection = detectPromptInjection;
|
|
7
|
+
exports.sanitizeInput = sanitizeInput;
|
|
8
|
+
const SUSPICIOUS_PATTERNS = [
|
|
9
|
+
/ignore\s+(previous|above|all)\s+instructions/i,
|
|
10
|
+
/new\s+instructions/i,
|
|
11
|
+
/system\s*:/i,
|
|
12
|
+
/assistant\s*:/i,
|
|
13
|
+
/you\s+are\s+now/i,
|
|
14
|
+
/forget\s+everything/i,
|
|
15
|
+
/disregard\s+.*(previous|above|instructions)/i,
|
|
16
|
+
];
|
|
17
|
+
/**
|
|
18
|
+
* Check if input contains suspicious prompt injection patterns
|
|
19
|
+
*/
|
|
20
|
+
function detectPromptInjection(input) {
|
|
21
|
+
return SUSPICIOUS_PATTERNS.some((pattern) => pattern.test(input));
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* Sanitize string fields in input to prevent prompt injection
|
|
25
|
+
*/
|
|
26
|
+
function sanitizeInput(input) {
|
|
27
|
+
if (input === null || input === undefined)
|
|
28
|
+
return input;
|
|
29
|
+
if (typeof input === 'string') {
|
|
30
|
+
return sanitizeString(input);
|
|
31
|
+
}
|
|
32
|
+
if (Array.isArray(input)) {
|
|
33
|
+
return input.map((item) => sanitizeInput(item));
|
|
34
|
+
}
|
|
35
|
+
if (typeof input === 'object') {
|
|
36
|
+
const sanitized = {};
|
|
37
|
+
for (const [key, value] of Object.entries(input)) {
|
|
38
|
+
if (typeof value === 'string') {
|
|
39
|
+
sanitized[key] = sanitizeString(value);
|
|
40
|
+
}
|
|
41
|
+
else if (value && typeof value === 'object') {
|
|
42
|
+
sanitized[key] = sanitizeInput(value);
|
|
43
|
+
}
|
|
44
|
+
else {
|
|
45
|
+
sanitized[key] = value;
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
return sanitized;
|
|
49
|
+
}
|
|
50
|
+
return input;
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* Sanitize a string by escaping special characters that might be used for injection
|
|
54
|
+
*/
|
|
55
|
+
function sanitizeString(str) {
|
|
56
|
+
// Trim excessive whitespace
|
|
57
|
+
let sanitized = str.trim();
|
|
58
|
+
// Limit length
|
|
59
|
+
if (sanitized.length > 10000) {
|
|
60
|
+
sanitized = sanitized.substring(0, 10000);
|
|
61
|
+
}
|
|
62
|
+
// Escape control characters
|
|
63
|
+
sanitized = sanitized.replace(/[\x00-\x1F\x7F]/g, '');
|
|
64
|
+
return sanitized;
|
|
65
|
+
}
|
|
66
|
+
//# sourceMappingURL=prompt-sanitizer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"prompt-sanitizer.js","sourceRoot":"","sources":["../../src/security/prompt-sanitizer.ts"],"names":[],"mappings":";AAAA;;GAEG;;AAeH,sDAEC;AAKD,sCA4BC;AAhDD,MAAM,mBAAmB,GAAG;IAC1B,+CAA+C;IAC/C,qBAAqB;IACrB,aAAa;IACb,gBAAgB;IAChB,kBAAkB;IAClB,sBAAsB;IACtB,8CAA8C;CAC/C,CAAC;AAEF;;GAEG;AACH,SAAgB,qBAAqB,CAAC,KAAa;IACjD,OAAO,mBAAmB,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC;AACpE,CAAC;AAED;;GAEG;AACH,SAAgB,aAAa,CAAC,KAAc;IAC1C,IAAI,KAAK,KAAK,IAAI,IAAI,KAAK,KAAK,SAAS;QAAE,OAAO,KAAK,CAAC;IAExD,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QAC9B,OAAO,cAAc,CAAC,KAAK,CAAC,CAAC;IAC/B,CAAC;IAED,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;QACzB,OAAO,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC,CAAC;IAClD,CAAC;IAED,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QAC9B,MAAM,SAAS,GAAQ,EAAE,CAAC;QAE1B,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;YACjD,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;gBAC9B,SAAS,CAAC,GAAG,CAAC,GAAG,cAAc,CAAC,KAAK,CAAC,CAAC;YACzC,CAAC;iBAAM,IAAI,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;gBAC9C,SAAS,CAAC,GAAG,CAAC,GAAG,aAAa,CAAC,KAAK,CAAC,CAAC;YACxC,CAAC;iBAAM,CAAC;gBACN,SAAS,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC;YACzB,CAAC;QACH,CAAC;QAED,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,OAAO,KAAK,CAAC;AACf,CAAC;AAED;;GAEG;AACH,SAAS,cAAc,CAAC,GAAW;IACjC,4BAA4B;IAC5B,IAAI,SAAS,GAAG,GAAG,CAAC,IAAI,EAAE,CAAC;IAE3B,eAAe;IACf,IAAI,SAAS,CAAC,MAAM,GAAG,KAAK,EAAE,CAAC;QAC7B,SAAS,GAAG,SAAS,CAAC,SAAS,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC;IAC5C,CAAC;IAED,4BAA4B;IAC5B,SAAS,GAAG,SAAS,CAAC,OAAO,CAAC,kBAAkB,EAAE,EAAE,CAAC,CAAC;IAEtD,OAAO,SAAS,CAAC;AACnB,CAAC"}
|