@lockllm/sdk 1.0.0 → 1.1.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.
Files changed (51) hide show
  1. package/CHANGELOG.md +146 -5
  2. package/README.md +238 -39
  3. package/dist/client.d.ts +1 -1
  4. package/dist/client.d.ts.map +1 -1
  5. package/dist/errors.d.ts +46 -1
  6. package/dist/errors.d.ts.map +1 -1
  7. package/dist/errors.js +104 -2
  8. package/dist/errors.js.map +1 -1
  9. package/dist/errors.mjs +100 -1
  10. package/dist/index.d.ts +6 -5
  11. package/dist/index.d.ts.map +1 -1
  12. package/dist/index.js +9 -1
  13. package/dist/index.js.map +1 -1
  14. package/dist/index.mjs +3 -2
  15. package/dist/scan.d.ts +20 -5
  16. package/dist/scan.d.ts.map +1 -1
  17. package/dist/scan.js +55 -5
  18. package/dist/scan.js.map +1 -1
  19. package/dist/scan.mjs +55 -5
  20. package/dist/types/common.d.ts +85 -0
  21. package/dist/types/common.d.ts.map +1 -1
  22. package/dist/types/errors.d.ts +33 -0
  23. package/dist/types/errors.d.ts.map +1 -1
  24. package/dist/types/scan.d.ts +102 -3
  25. package/dist/types/scan.d.ts.map +1 -1
  26. package/dist/utils/proxy-headers.d.ts +24 -0
  27. package/dist/utils/proxy-headers.d.ts.map +1 -0
  28. package/dist/utils/proxy-headers.js +175 -0
  29. package/dist/utils/proxy-headers.js.map +1 -0
  30. package/dist/utils/proxy-headers.mjs +170 -0
  31. package/dist/utils.d.ts +24 -0
  32. package/dist/utils.d.ts.map +1 -1
  33. package/dist/utils.js +28 -0
  34. package/dist/utils.js.map +1 -1
  35. package/dist/utils.mjs +27 -0
  36. package/dist/wrappers/anthropic-wrapper.d.ts +10 -1
  37. package/dist/wrappers/anthropic-wrapper.d.ts.map +1 -1
  38. package/dist/wrappers/anthropic-wrapper.js +17 -2
  39. package/dist/wrappers/anthropic-wrapper.js.map +1 -1
  40. package/dist/wrappers/anthropic-wrapper.mjs +17 -2
  41. package/dist/wrappers/generic-wrapper.d.ts +5 -0
  42. package/dist/wrappers/generic-wrapper.d.ts.map +1 -1
  43. package/dist/wrappers/generic-wrapper.js +12 -1
  44. package/dist/wrappers/generic-wrapper.js.map +1 -1
  45. package/dist/wrappers/generic-wrapper.mjs +12 -1
  46. package/dist/wrappers/openai-wrapper.d.ts +10 -1
  47. package/dist/wrappers/openai-wrapper.d.ts.map +1 -1
  48. package/dist/wrappers/openai-wrapper.js +17 -2
  49. package/dist/wrappers/openai-wrapper.js.map +1 -1
  50. package/dist/wrappers/openai-wrapper.mjs +17 -2
  51. package/package.json +2 -18
package/dist/scan.mjs CHANGED
@@ -9,27 +9,77 @@ export class ScanClient {
9
9
  * Scan a prompt for injection attacks
10
10
  *
11
11
  * @param request - Scan request parameters
12
- * @param options - Request options
12
+ * @param options - Scan options with action headers
13
13
  * @returns Scan result with safety information
14
14
  *
15
15
  * @example
16
16
  * ```typescript
17
+ * // Basic scan with combined mode (default)
17
18
  * const result = await client.scan({
18
19
  * input: "Ignore previous instructions and...",
19
- * sensitivity: "medium"
20
+ * sensitivity: "medium",
21
+ * mode: "combined" // Check both core security + custom policies
22
+ * }, {
23
+ * scanAction: "block", // Block core injection attacks
24
+ * policyAction: "allow_with_warning", // Allow but warn on policy violations
25
+ * abuseAction: "block" // Opt-in abuse detection
20
26
  * });
21
27
  *
22
28
  * if (!result.safe) {
23
29
  * console.log("Malicious prompt detected!");
24
30
  * console.log("Injection score:", result.injection);
31
+ *
32
+ * // Check for policy violations
33
+ * if (result.policy_warnings) {
34
+ * console.log("Policy violations:", result.policy_warnings);
35
+ * }
36
+ *
37
+ * // Check for abuse warnings
38
+ * if (result.abuse_warnings) {
39
+ * console.log("Abuse detected:", result.abuse_warnings);
40
+ * }
25
41
  * }
26
42
  * ```
27
43
  */
28
44
  async scan(request, options) {
29
- const { data } = await this.http.post('/v1/scan', {
45
+ // Build headers from scan options
46
+ const headers = {
47
+ ...(options?.headers || {}),
48
+ };
49
+ // Scan mode header
50
+ if (request.mode) {
51
+ headers['x-lockllm-scan-mode'] = request.mode;
52
+ }
53
+ // Sensitivity header
54
+ if (request.sensitivity) {
55
+ headers['x-lockllm-sensitivity'] = request.sensitivity;
56
+ }
57
+ // Chunk header
58
+ if (request.chunk !== undefined) {
59
+ headers['x-lockllm-chunk'] = request.chunk ? 'true' : 'false';
60
+ }
61
+ // Add action headers if provided
62
+ // Scan action: controls core injection detection behavior
63
+ if (options?.scanAction) {
64
+ headers['x-lockllm-scan-action'] = options.scanAction;
65
+ }
66
+ // Policy action: controls custom policy violation behavior
67
+ if (options?.policyAction) {
68
+ headers['x-lockllm-policy-action'] = options.policyAction;
69
+ }
70
+ // Abuse action: opt-in abuse detection (null/undefined means disabled)
71
+ if (options?.abuseAction !== undefined && options?.abuseAction !== null) {
72
+ headers['x-lockllm-abuse-action'] = options.abuseAction;
73
+ }
74
+ // Build request body
75
+ const body = {
30
76
  input: request.input,
31
- sensitivity: request.sensitivity || 'medium',
32
- }, options);
77
+ };
78
+ const { data } = await this.http.post('/v1/scan', body, {
79
+ headers,
80
+ timeout: options?.timeout,
81
+ signal: options?.signal,
82
+ });
33
83
  return data;
34
84
  }
35
85
  }
@@ -28,4 +28,89 @@ export interface ErrorResponse {
28
28
  };
29
29
  }
30
30
  export type Provider = 'openai' | 'anthropic' | 'gemini' | 'cohere' | 'openrouter' | 'perplexity' | 'mistral' | 'groq' | 'deepseek' | 'together' | 'xai' | 'fireworks' | 'anyscale' | 'huggingface' | 'azure' | 'bedrock' | 'vertex-ai';
31
+ /** Scan mode for security checks */
32
+ export type ScanMode = 'normal' | 'policy_only' | 'combined';
33
+ /** Scan action for threat detection */
34
+ export type ScanAction = 'block' | 'allow_with_warning';
35
+ /** Routing action for intelligent model selection */
36
+ export type RouteAction = 'disabled' | 'auto' | 'custom';
37
+ /** Proxy request options with advanced headers */
38
+ export interface ProxyRequestOptions extends RequestOptions {
39
+ /** Scan mode (default: combined) - Check both core security and custom policies */
40
+ scanMode?: ScanMode;
41
+ /** Scan action for core injection (default: allow_with_warning) - Threats detected but not blocked */
42
+ scanAction?: ScanAction;
43
+ /** Policy action for custom policies (default: allow_with_warning) - Violations detected but not blocked */
44
+ policyAction?: ScanAction;
45
+ /** Abuse detection action (opt-in, default: null) - When null, abuse detection is disabled */
46
+ abuseAction?: ScanAction | null;
47
+ /** Routing action (default: disabled) - No intelligent routing unless explicitly enabled */
48
+ routeAction?: RouteAction;
49
+ /** Response caching (default: enabled). Set false to disable. */
50
+ cacheResponse?: boolean;
51
+ /** Cache TTL in seconds (default: 3600) */
52
+ cacheTTL?: number;
53
+ }
54
+ /** Response metadata from proxy */
55
+ export interface ProxyResponseMetadata {
56
+ /** Unique request identifier */
57
+ request_id: string;
58
+ /** Whether the request was scanned */
59
+ scanned: boolean;
60
+ /** Whether the request is safe */
61
+ safe: boolean;
62
+ /** Scan mode used */
63
+ scan_mode: ScanMode;
64
+ /** Credits mode (lockllm_credits or byok) */
65
+ credits_mode: 'lockllm_credits' | 'byok';
66
+ /** Provider used */
67
+ provider: string;
68
+ /** Model used */
69
+ model?: string;
70
+ /** Scan warning details */
71
+ scan_warning?: {
72
+ injection_score: number;
73
+ confidence: number;
74
+ detail: string;
75
+ };
76
+ /** Policy violation warnings */
77
+ policy_warnings?: {
78
+ count: number;
79
+ confidence: number;
80
+ detail: string;
81
+ };
82
+ /** Abuse detection warnings */
83
+ abuse_detected?: {
84
+ confidence: number;
85
+ types: string;
86
+ detail: string;
87
+ };
88
+ /** Routing metadata */
89
+ routing?: {
90
+ enabled: boolean;
91
+ task_type: string;
92
+ complexity: number;
93
+ selected_model: string;
94
+ routing_reason: string;
95
+ original_provider: string;
96
+ original_model: string;
97
+ estimated_savings: number;
98
+ };
99
+ /** Credits reserved for this request */
100
+ credits_reserved?: number;
101
+ /** Routing fee reserved */
102
+ routing_fee_reserved?: number;
103
+ /** Actual credits deducted (available after completion) */
104
+ credits_deducted?: number;
105
+ /** Balance after this request (available after completion) */
106
+ balance_after?: number;
107
+ /** Cache status for this response */
108
+ cache_status?: 'HIT' | 'MISS';
109
+ /** Cache age in seconds (when cache hit) */
110
+ cache_age?: number;
111
+ /** Tokens saved from cache hit */
112
+ tokens_saved?: number;
113
+ /** Cost saved from cache hit */
114
+ cost_saved?: number;
115
+ }
31
116
  //# sourceMappingURL=common.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"common.d.ts","sourceRoot":"","sources":["../../src/types/common.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,MAAM,WAAW,aAAa;IAC5B,2BAA2B;IAC3B,MAAM,EAAE,MAAM,CAAC;IACf,kEAAkE;IAClE,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,uDAAuD;IACvD,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,uEAAuE;IACvE,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,cAAc;IAC7B,+CAA+C;IAC/C,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACjC,sCAAsC;IACtC,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,2CAA2C;IAC3C,MAAM,CAAC,EAAE,WAAW,CAAC;CACtB;AAED,MAAM,WAAW,aAAa;IAC5B,KAAK,EAAE;QACL,OAAO,EAAE,MAAM,CAAC;QAChB,IAAI,EAAE,MAAM,CAAC;QACb,IAAI,CAAC,EAAE,MAAM,CAAC;QACd,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,CAAC;KACpB,CAAC;CACH;AAED,MAAM,MAAM,QAAQ,GAChB,QAAQ,GACR,WAAW,GACX,QAAQ,GACR,QAAQ,GACR,YAAY,GACZ,YAAY,GACZ,SAAS,GACT,MAAM,GACN,UAAU,GACV,UAAU,GACV,KAAK,GACL,WAAW,GACX,UAAU,GACV,aAAa,GACb,OAAO,GACP,SAAS,GACT,WAAW,CAAC"}
1
+ {"version":3,"file":"common.d.ts","sourceRoot":"","sources":["../../src/types/common.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,MAAM,WAAW,aAAa;IAC5B,2BAA2B;IAC3B,MAAM,EAAE,MAAM,CAAC;IACf,kEAAkE;IAClE,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,uDAAuD;IACvD,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,uEAAuE;IACvE,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,cAAc;IAC7B,+CAA+C;IAC/C,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACjC,sCAAsC;IACtC,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,2CAA2C;IAC3C,MAAM,CAAC,EAAE,WAAW,CAAC;CACtB;AAED,MAAM,WAAW,aAAa;IAC5B,KAAK,EAAE;QACL,OAAO,EAAE,MAAM,CAAC;QAChB,IAAI,EAAE,MAAM,CAAC;QACb,IAAI,CAAC,EAAE,MAAM,CAAC;QACd,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,CAAC;KACpB,CAAC;CACH;AAED,MAAM,MAAM,QAAQ,GAChB,QAAQ,GACR,WAAW,GACX,QAAQ,GACR,QAAQ,GACR,YAAY,GACZ,YAAY,GACZ,SAAS,GACT,MAAM,GACN,UAAU,GACV,UAAU,GACV,KAAK,GACL,WAAW,GACX,UAAU,GACV,aAAa,GACb,OAAO,GACP,SAAS,GACT,WAAW,CAAC;AAEhB,oCAAoC;AACpC,MAAM,MAAM,QAAQ,GAAG,QAAQ,GAAG,aAAa,GAAG,UAAU,CAAC;AAE7D,uCAAuC;AACvC,MAAM,MAAM,UAAU,GAAG,OAAO,GAAG,oBAAoB,CAAC;AAExD,qDAAqD;AACrD,MAAM,MAAM,WAAW,GAAG,UAAU,GAAG,MAAM,GAAG,QAAQ,CAAC;AAEzD,kDAAkD;AAClD,MAAM,WAAW,mBAAoB,SAAQ,cAAc;IACzD,mFAAmF;IACnF,QAAQ,CAAC,EAAE,QAAQ,CAAC;IACpB,sGAAsG;IACtG,UAAU,CAAC,EAAE,UAAU,CAAC;IACxB,4GAA4G;IAC5G,YAAY,CAAC,EAAE,UAAU,CAAC;IAC1B,8FAA8F;IAC9F,WAAW,CAAC,EAAE,UAAU,GAAG,IAAI,CAAC;IAChC,4FAA4F;IAC5F,WAAW,CAAC,EAAE,WAAW,CAAC;IAC1B,iEAAiE;IACjE,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,2CAA2C;IAC3C,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,mCAAmC;AACnC,MAAM,WAAW,qBAAqB;IACpC,gCAAgC;IAChC,UAAU,EAAE,MAAM,CAAC;IACnB,sCAAsC;IACtC,OAAO,EAAE,OAAO,CAAC;IACjB,kCAAkC;IAClC,IAAI,EAAE,OAAO,CAAC;IACd,qBAAqB;IACrB,SAAS,EAAE,QAAQ,CAAC;IACpB,6CAA6C;IAC7C,YAAY,EAAE,iBAAiB,GAAG,MAAM,CAAC;IACzC,oBAAoB;IACpB,QAAQ,EAAE,MAAM,CAAC;IACjB,iBAAiB;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,2BAA2B;IAC3B,YAAY,CAAC,EAAE;QACb,eAAe,EAAE,MAAM,CAAC;QACxB,UAAU,EAAE,MAAM,CAAC;QACnB,MAAM,EAAE,MAAM,CAAC;KAChB,CAAC;IACF,gCAAgC;IAChC,eAAe,CAAC,EAAE;QAChB,KAAK,EAAE,MAAM,CAAC;QACd,UAAU,EAAE,MAAM,CAAC;QACnB,MAAM,EAAE,MAAM,CAAC;KAChB,CAAC;IACF,+BAA+B;IAC/B,cAAc,CAAC,EAAE;QACf,UAAU,EAAE,MAAM,CAAC;QACnB,KAAK,EAAE,MAAM,CAAC;QACd,MAAM,EAAE,MAAM,CAAC;KAChB,CAAC;IACF,uBAAuB;IACvB,OAAO,CAAC,EAAE;QACR,OAAO,EAAE,OAAO,CAAC;QACjB,SAAS,EAAE,MAAM,CAAC;QAClB,UAAU,EAAE,MAAM,CAAC;QACnB,cAAc,EAAE,MAAM,CAAC;QACvB,cAAc,EAAE,MAAM,CAAC;QACvB,iBAAiB,EAAE,MAAM,CAAC;QAC1B,cAAc,EAAE,MAAM,CAAC;QACvB,iBAAiB,EAAE,MAAM,CAAC;KAC3B,CAAC;IACF,wCAAwC;IACxC,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,2BAA2B;IAC3B,oBAAoB,CAAC,EAAE,MAAM,CAAC;IAC9B,2DAA2D;IAC3D,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,8DAA8D;IAC9D,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,qCAAqC;IACrC,YAAY,CAAC,EAAE,KAAK,GAAG,MAAM,CAAC;IAC9B,4CAA4C;IAC5C,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,kCAAkC;IAClC,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,gCAAgC;IAChC,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB"}
@@ -19,4 +19,37 @@ export interface LockLLMErrorData {
19
19
  export interface PromptInjectionErrorData extends LockLLMErrorData {
20
20
  scanResult: ScanResult;
21
21
  }
22
+ export interface PolicyViolationErrorData extends LockLLMErrorData {
23
+ violated_policies: Array<{
24
+ policy_name: string;
25
+ violated_categories: Array<{
26
+ name: string;
27
+ }>;
28
+ violation_details?: string;
29
+ }>;
30
+ }
31
+ export interface AbuseDetectedErrorData extends LockLLMErrorData {
32
+ abuse_details: {
33
+ confidence: number;
34
+ abuse_types: string[];
35
+ indicators: {
36
+ bot_score: number;
37
+ repetition_score: number;
38
+ resource_score: number;
39
+ pattern_score: number;
40
+ };
41
+ recommendation?: string;
42
+ details?: {
43
+ recommendation?: string;
44
+ bot_indicators?: string[];
45
+ repetition_indicators?: string[];
46
+ resource_indicators?: string[];
47
+ pattern_indicators?: string[];
48
+ };
49
+ };
50
+ }
51
+ export interface InsufficientCreditsErrorData extends LockLLMErrorData {
52
+ current_balance: number;
53
+ estimated_cost: number;
54
+ }
22
55
  //# sourceMappingURL=errors.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../../src/types/errors.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,OAAO,CAAC;IACd,KAAK,EAAE,CAAC,GAAG,CAAC,CAAC;IACb,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,KAAK,GAAG,QAAQ,GAAG,MAAM,CAAC;CACxC;AAED,MAAM,WAAW,gBAAgB;IAC/B,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,CAAC;CACpB;AAED,MAAM,WAAW,wBAAyB,SAAQ,gBAAgB;IAChE,UAAU,EAAE,UAAU,CAAC;CACxB"}
1
+ {"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../../src/types/errors.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,OAAO,CAAC;IACd,KAAK,EAAE,CAAC,GAAG,CAAC,CAAC;IACb,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,KAAK,GAAG,QAAQ,GAAG,MAAM,CAAC;CACxC;AAED,MAAM,WAAW,gBAAgB;IAC/B,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,CAAC;CACpB;AAED,MAAM,WAAW,wBAAyB,SAAQ,gBAAgB;IAChE,UAAU,EAAE,UAAU,CAAC;CACxB;AAED,MAAM,WAAW,wBAAyB,SAAQ,gBAAgB;IAChE,iBAAiB,EAAE,KAAK,CAAC;QACvB,WAAW,EAAE,MAAM,CAAC;QACpB,mBAAmB,EAAE,KAAK,CAAC;YAAE,IAAI,EAAE,MAAM,CAAA;SAAE,CAAC,CAAC;QAC7C,iBAAiB,CAAC,EAAE,MAAM,CAAC;KAC5B,CAAC,CAAC;CACJ;AAED,MAAM,WAAW,sBAAuB,SAAQ,gBAAgB;IAC9D,aAAa,EAAE;QACb,UAAU,EAAE,MAAM,CAAC;QACnB,WAAW,EAAE,MAAM,EAAE,CAAC;QACtB,UAAU,EAAE;YACV,SAAS,EAAE,MAAM,CAAC;YAClB,gBAAgB,EAAE,MAAM,CAAC;YACzB,cAAc,EAAE,MAAM,CAAC;YACvB,aAAa,EAAE,MAAM,CAAC;SACvB,CAAC;QACF,cAAc,CAAC,EAAE,MAAM,CAAC;QACxB,OAAO,CAAC,EAAE;YACR,cAAc,CAAC,EAAE,MAAM,CAAC;YACxB,cAAc,CAAC,EAAE,MAAM,EAAE,CAAC;YAC1B,qBAAqB,CAAC,EAAE,MAAM,EAAE,CAAC;YACjC,mBAAmB,CAAC,EAAE,MAAM,EAAE,CAAC;YAC/B,kBAAkB,CAAC,EAAE,MAAM,EAAE,CAAC;SAC/B,CAAC;KACH,CAAC;CACH;AAED,MAAM,WAAW,4BAA6B,SAAQ,gBAAgB;IACpE,eAAe,EAAE,MAAM,CAAC;IACxB,cAAc,EAAE,MAAM,CAAC;CACxB"}
@@ -1,21 +1,99 @@
1
1
  /**
2
2
  * Scan API types
3
3
  */
4
- import type { ScanResult } from './errors';
5
4
  export type Sensitivity = 'low' | 'medium' | 'high';
5
+ /** Scan mode determines which security checks are performed */
6
+ export type ScanMode = 'normal' | 'policy_only' | 'combined';
7
+ /** Scan action determines behavior when threats are detected */
8
+ export type ScanAction = 'block' | 'allow_with_warning';
6
9
  export interface ScanRequest {
7
10
  /** The text prompt to scan for injection attacks */
8
11
  input: string;
9
12
  /** Detection sensitivity level (default: medium) */
10
13
  sensitivity?: Sensitivity;
14
+ /** Scan mode (default: combined) - Check both core security and custom policies */
15
+ mode?: ScanMode;
16
+ /** Force chunking for large inputs */
17
+ chunk?: boolean;
18
+ }
19
+ /** Scan request options with action headers */
20
+ export interface ScanOptions {
21
+ /** Scan action for core injection (default: allow_with_warning) - Threats detected but not blocked */
22
+ scanAction?: ScanAction;
23
+ /** Policy action for custom policies (default: allow_with_warning) - Violations detected but not blocked */
24
+ policyAction?: ScanAction;
25
+ /** Abuse detection action (opt-in, default: null) - When null, abuse detection is disabled */
26
+ abuseAction?: ScanAction | null;
27
+ /** Custom headers to include in the request */
28
+ headers?: Record<string, string>;
29
+ /** Request timeout in milliseconds */
30
+ timeout?: number;
31
+ /** Abort signal for cancelling requests */
32
+ signal?: AbortSignal;
33
+ }
34
+ /** Policy violation details */
35
+ export interface PolicyViolation {
36
+ /** Policy name (user-defined or built-in) */
37
+ policy_name: string;
38
+ /** Categories that were violated */
39
+ violated_categories: Array<{
40
+ /** Category name */
41
+ name: string;
42
+ }>;
43
+ /** Specific details about the violation */
44
+ violation_details?: string;
45
+ }
46
+ /** Scan warning when core injection is detected with allow_with_warning */
47
+ export interface ScanWarning {
48
+ /** Warning message */
49
+ message: string;
50
+ /** Injection score (0-100) */
51
+ injection_score: number;
52
+ /** Confidence score (0-100) */
53
+ confidence: number;
54
+ /** Safety label (0 = safe, 1 = unsafe) */
55
+ label: 0 | 1;
56
+ }
57
+ /** Abuse detection warning */
58
+ export interface AbuseWarning {
59
+ /** Whether abuse was detected */
60
+ detected: true;
61
+ /** Overall confidence score (0-100) */
62
+ confidence: number;
63
+ /** Types of abuse detected */
64
+ abuse_types: string[];
65
+ /** Individual abuse indicators */
66
+ indicators: {
67
+ /** Bot-generated content score (0-100) */
68
+ bot_score: number;
69
+ /** Repetition detection score (0-100) */
70
+ repetition_score: number;
71
+ /** Resource exhaustion score (0-100) */
72
+ resource_score: number;
73
+ /** Pattern analysis score (0-100) */
74
+ pattern_score: number;
75
+ };
76
+ /** Recommended mitigation action */
77
+ recommendation?: string;
11
78
  }
12
79
  /**
13
80
  * Full scan response from the scan API endpoint
14
- * Extends the base ScanResult with additional metadata
15
81
  */
16
- export interface ScanResponse extends ScanResult {
82
+ export interface ScanResponse {
17
83
  /** Unique request identifier */
18
84
  request_id: string;
85
+ /** Whether the prompt is safe */
86
+ safe: boolean;
87
+ /** Safety label (0 = safe, 1 = unsafe) */
88
+ label: 0 | 1;
89
+ /** Detection sensitivity level used */
90
+ sensitivity: Sensitivity;
91
+ /** Core injection confidence (not present in policy_only mode) */
92
+ confidence?: number;
93
+ /** Core injection score (not present in policy_only mode) */
94
+ injection?: number;
95
+ /** Policy check confidence (present in policy_only and combined modes) */
96
+ policy_confidence?: number;
19
97
  /** Usage statistics */
20
98
  usage: {
21
99
  /** Number of upstream inference requests */
@@ -32,5 +110,26 @@ export interface ScanResponse extends ScanResult {
32
110
  /** Processing mode used */
33
111
  mode: 'single' | 'chunked';
34
112
  };
113
+ /** Policy warnings (when present in policy_only or combined modes) */
114
+ policy_warnings?: PolicyViolation[];
115
+ /** Scan warning (when core injection detected with allow_with_warning) */
116
+ scan_warning?: ScanWarning;
117
+ /** Abuse warnings (when abuse detected with allow_with_warning) */
118
+ abuse_warnings?: AbuseWarning;
119
+ /** Routing metadata (present when routing is enabled) */
120
+ routing?: {
121
+ /** Whether routing is enabled */
122
+ enabled: boolean;
123
+ /** Detected task type */
124
+ task_type: string;
125
+ /** Complexity score (0-1) */
126
+ complexity: number;
127
+ /** Model selected by router */
128
+ selected_model?: string;
129
+ /** Routing decision reasoning */
130
+ reasoning?: string;
131
+ /** Estimated cost */
132
+ estimated_cost?: number;
133
+ };
35
134
  }
36
135
  //# sourceMappingURL=scan.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"scan.d.ts","sourceRoot":"","sources":["../../src/types/scan.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AAE3C,MAAM,MAAM,WAAW,GAAG,KAAK,GAAG,QAAQ,GAAG,MAAM,CAAC;AAEpD,MAAM,WAAW,WAAW;IAC1B,oDAAoD;IACpD,KAAK,EAAE,MAAM,CAAC;IACd,oDAAoD;IACpD,WAAW,CAAC,EAAE,WAAW,CAAC;CAC3B;AAED;;;GAGG;AACH,MAAM,WAAW,YAAa,SAAQ,UAAU;IAC9C,gCAAgC;IAChC,UAAU,EAAE,MAAM,CAAC;IACnB,uBAAuB;IACvB,KAAK,EAAE;QACL,4CAA4C;QAC5C,QAAQ,EAAE,MAAM,CAAC;QACjB,2CAA2C;QAC3C,WAAW,EAAE,MAAM,CAAC;KACrB,CAAC;IACF,uDAAuD;IACvD,KAAK,CAAC,EAAE;QACN,gDAAgD;QAChD,WAAW,EAAE,MAAM,CAAC;QACpB,qCAAqC;QACrC,YAAY,EAAE,MAAM,CAAC;QACrB,2BAA2B;QAC3B,IAAI,EAAE,QAAQ,GAAG,SAAS,CAAC;KAC5B,CAAC;CACH"}
1
+ {"version":3,"file":"scan.d.ts","sourceRoot":"","sources":["../../src/types/scan.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,24 @@
1
+ /**
2
+ * Proxy headers utility functions
3
+ */
4
+ import type { ProxyRequestOptions, ProxyResponseMetadata } from '../types/common';
5
+ /**
6
+ * Build LockLLM headers from proxy request options
7
+ *
8
+ * Default behavior (when no headers are provided):
9
+ * - Scan Mode: combined (check both core security and custom policies)
10
+ * - Scan Action: allow_with_warning (detect threats but don't block)
11
+ * - Policy Action: allow_with_warning (detect violations but don't block)
12
+ * - Abuse Action: null (abuse detection disabled, opt-in only)
13
+ * - Route Action: disabled (no intelligent routing)
14
+ */
15
+ export declare function buildLockLLMHeaders(options?: ProxyRequestOptions): Record<string, string>;
16
+ /**
17
+ * Parse proxy metadata from response headers
18
+ */
19
+ export declare function parseProxyMetadata(headers: Headers | Record<string, string>): ProxyResponseMetadata;
20
+ /**
21
+ * Decode base64-encoded detail field
22
+ */
23
+ export declare function decodeDetailField(detail: string): any;
24
+ //# sourceMappingURL=proxy-headers.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"proxy-headers.d.ts","sourceRoot":"","sources":["../../src/utils/proxy-headers.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,mBAAmB,EAAE,qBAAqB,EAAE,MAAM,iBAAiB,CAAC;AAElF;;;;;;;;;GASG;AACH,wBAAgB,mBAAmB,CAAC,OAAO,CAAC,EAAE,mBAAmB,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAuCzF;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,OAAO,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,qBAAqB,CA8HnG;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,MAAM,GAAG,GAAG,CAOrD"}
@@ -0,0 +1,175 @@
1
+ "use strict";
2
+ /**
3
+ * Proxy headers utility functions
4
+ */
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.buildLockLLMHeaders = buildLockLLMHeaders;
7
+ exports.parseProxyMetadata = parseProxyMetadata;
8
+ exports.decodeDetailField = decodeDetailField;
9
+ /**
10
+ * Build LockLLM headers from proxy request options
11
+ *
12
+ * Default behavior (when no headers are provided):
13
+ * - Scan Mode: combined (check both core security and custom policies)
14
+ * - Scan Action: allow_with_warning (detect threats but don't block)
15
+ * - Policy Action: allow_with_warning (detect violations but don't block)
16
+ * - Abuse Action: null (abuse detection disabled, opt-in only)
17
+ * - Route Action: disabled (no intelligent routing)
18
+ */
19
+ function buildLockLLMHeaders(options) {
20
+ const headers = {};
21
+ // Scan mode header (controls which security checks are performed)
22
+ if (options?.scanMode) {
23
+ headers['x-lockllm-scan-mode'] = options.scanMode;
24
+ }
25
+ // Scan action header (controls blocking behavior for core injection)
26
+ if (options?.scanAction) {
27
+ headers['x-lockllm-scan-action'] = options.scanAction;
28
+ }
29
+ // Policy action header (controls blocking behavior for policy violations)
30
+ if (options?.policyAction) {
31
+ headers['x-lockllm-policy-action'] = options.policyAction;
32
+ }
33
+ // Abuse action header (opt-in, null means disabled)
34
+ if (options?.abuseAction !== undefined && options?.abuseAction !== null) {
35
+ headers['x-lockllm-abuse-action'] = options.abuseAction;
36
+ }
37
+ // Route action header (controls intelligent routing)
38
+ if (options?.routeAction) {
39
+ headers['x-lockllm-route-action'] = options.routeAction;
40
+ }
41
+ // Response caching control
42
+ if (options?.cacheResponse === false) {
43
+ headers['x-lockllm-cache-response'] = 'false';
44
+ }
45
+ // Cache TTL in seconds
46
+ if (options?.cacheTTL !== undefined) {
47
+ headers['x-lockllm-cache-ttl'] = String(options.cacheTTL);
48
+ }
49
+ return headers;
50
+ }
51
+ /**
52
+ * Parse proxy metadata from response headers
53
+ */
54
+ function parseProxyMetadata(headers) {
55
+ const getHeader = (name) => {
56
+ if (headers instanceof Headers) {
57
+ return headers.get(name);
58
+ }
59
+ return headers[name] || headers[name.toLowerCase()] || null;
60
+ };
61
+ const metadata = {
62
+ request_id: getHeader('x-request-id') || '',
63
+ scanned: getHeader('x-lockllm-scanned') === 'true',
64
+ safe: getHeader('x-lockllm-safe') === 'true',
65
+ scan_mode: getHeader('x-scan-mode') || 'combined',
66
+ credits_mode: getHeader('x-lockllm-credits-mode') || 'byok',
67
+ provider: getHeader('x-lockllm-provider') || '',
68
+ model: getHeader('x-lockllm-model') || undefined,
69
+ };
70
+ // Parse scan warning
71
+ const scanWarning = getHeader('x-lockllm-scan-warning');
72
+ if (scanWarning === 'true') {
73
+ const injectionScore = getHeader('x-lockllm-injection-score');
74
+ const confidence = getHeader('x-lockllm-confidence');
75
+ const detail = getHeader('x-lockllm-scan-detail');
76
+ metadata.scan_warning = {
77
+ injection_score: injectionScore ? parseFloat(injectionScore) : 0,
78
+ confidence: confidence ? parseFloat(confidence) : 0,
79
+ detail: detail || '',
80
+ };
81
+ }
82
+ // Parse policy warnings
83
+ const policyWarnings = getHeader('x-lockllm-policy-warnings');
84
+ if (policyWarnings === 'true') {
85
+ const count = getHeader('x-lockllm-warning-count');
86
+ const confidence = getHeader('x-lockllm-policy-confidence');
87
+ const detail = getHeader('x-lockllm-warning-detail');
88
+ metadata.policy_warnings = {
89
+ count: count ? parseInt(count, 10) : 0,
90
+ confidence: confidence ? parseFloat(confidence) : 0,
91
+ detail: detail || '',
92
+ };
93
+ }
94
+ // Parse abuse detection
95
+ const abuseDetected = getHeader('x-lockllm-abuse-detected');
96
+ if (abuseDetected === 'true') {
97
+ const confidence = getHeader('x-lockllm-abuse-confidence');
98
+ const types = getHeader('x-lockllm-abuse-types');
99
+ const detail = getHeader('x-lockllm-abuse-detail');
100
+ metadata.abuse_detected = {
101
+ confidence: confidence ? parseFloat(confidence) : 0,
102
+ types: types || '',
103
+ detail: detail || '',
104
+ };
105
+ }
106
+ // Parse routing metadata
107
+ const routeEnabled = getHeader('x-lockllm-route-enabled');
108
+ if (routeEnabled === 'true') {
109
+ const taskType = getHeader('x-lockllm-task-type');
110
+ const complexity = getHeader('x-lockllm-complexity');
111
+ const selectedModel = getHeader('x-lockllm-selected-model');
112
+ const routingReason = getHeader('x-lockllm-routing-reason');
113
+ const originalProvider = getHeader('x-lockllm-original-provider');
114
+ const originalModel = getHeader('x-lockllm-original-model');
115
+ const estimatedSavings = getHeader('x-lockllm-estimated-savings');
116
+ metadata.routing = {
117
+ enabled: true,
118
+ task_type: taskType || '',
119
+ complexity: complexity ? parseFloat(complexity) : 0,
120
+ selected_model: selectedModel || '',
121
+ routing_reason: routingReason || '',
122
+ original_provider: originalProvider || '',
123
+ original_model: originalModel || '',
124
+ estimated_savings: estimatedSavings ? parseFloat(estimatedSavings) : 0,
125
+ };
126
+ }
127
+ // Parse credit tracking
128
+ const creditsReserved = getHeader('x-lockllm-credits-reserved');
129
+ if (creditsReserved) {
130
+ metadata.credits_reserved = parseFloat(creditsReserved);
131
+ }
132
+ const routingFeeReserved = getHeader('x-lockllm-routing-fee-reserved');
133
+ if (routingFeeReserved) {
134
+ metadata.routing_fee_reserved = parseFloat(routingFeeReserved);
135
+ }
136
+ // Parse cache status
137
+ const cacheStatus = getHeader('x-lockllm-cache-status');
138
+ if (cacheStatus) {
139
+ metadata.cache_status = cacheStatus;
140
+ }
141
+ const cacheAge = getHeader('x-lockllm-cache-age');
142
+ if (cacheAge) {
143
+ metadata.cache_age = parseInt(cacheAge, 10);
144
+ }
145
+ const tokensSaved = getHeader('x-lockllm-tokens-saved');
146
+ if (tokensSaved) {
147
+ metadata.tokens_saved = parseInt(tokensSaved, 10);
148
+ }
149
+ const costSaved = getHeader('x-lockllm-cost-saved');
150
+ if (costSaved) {
151
+ metadata.cost_saved = parseFloat(costSaved);
152
+ }
153
+ const creditsDeducted = getHeader('x-lockllm-credits-deducted');
154
+ if (creditsDeducted) {
155
+ metadata.credits_deducted = parseFloat(creditsDeducted);
156
+ }
157
+ const balanceAfter = getHeader('x-lockllm-balance-after');
158
+ if (balanceAfter) {
159
+ metadata.balance_after = parseFloat(balanceAfter);
160
+ }
161
+ return metadata;
162
+ }
163
+ /**
164
+ * Decode base64-encoded detail field
165
+ */
166
+ function decodeDetailField(detail) {
167
+ try {
168
+ const decoded = atob(detail);
169
+ return JSON.parse(decoded);
170
+ }
171
+ catch {
172
+ return null;
173
+ }
174
+ }
175
+ //# sourceMappingURL=proxy-headers.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"proxy-headers.js","sourceRoot":"","sources":["../../src/utils/proxy-headers.ts"],"names":[],"mappings":"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"}