veto-sdk 2.2.0 → 2.3.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 (143) hide show
  1. package/README.md +933 -57
  2. package/dist/admin/client.d.ts +93 -0
  3. package/dist/admin/client.d.ts.map +1 -0
  4. package/dist/admin/client.js +365 -0
  5. package/dist/admin/client.js.map +1 -0
  6. package/dist/admin/types.d.ts +205 -0
  7. package/dist/admin/types.d.ts.map +1 -0
  8. package/dist/admin/types.js +2 -0
  9. package/dist/admin/types.js.map +1 -0
  10. package/dist/audit/chain.d.ts +13 -0
  11. package/dist/audit/chain.d.ts.map +1 -0
  12. package/dist/audit/chain.js +32 -0
  13. package/dist/audit/chain.js.map +1 -0
  14. package/dist/browser/protect.d.ts.map +1 -1
  15. package/dist/browser/protect.js +9 -1
  16. package/dist/browser/protect.js.map +1 -1
  17. package/dist/browser/types.d.ts +4 -1
  18. package/dist/browser/types.d.ts.map +1 -1
  19. package/dist/browser/veto.d.ts.map +1 -1
  20. package/dist/browser/veto.js +33 -2
  21. package/dist/browser/veto.js.map +1 -1
  22. package/dist/cli/bin.js +0 -0
  23. package/dist/cli/compile.js +2 -2
  24. package/dist/cli/compile.js.map +1 -1
  25. package/dist/cli/repl-generate.js +1 -1
  26. package/dist/cli/repl-generate.js.map +1 -1
  27. package/dist/cli/runner.d.ts.map +1 -1
  28. package/dist/cli/runner.js +129 -8
  29. package/dist/cli/runner.js.map +1 -1
  30. package/dist/cli/templates.d.ts +1 -1
  31. package/dist/cli/templates.d.ts.map +1 -1
  32. package/dist/cli/templates.js +1 -1
  33. package/dist/compiler/evaluator.d.ts.map +1 -1
  34. package/dist/compiler/evaluator.js +6 -0
  35. package/dist/compiler/evaluator.js.map +1 -1
  36. package/dist/core/events.d.ts +2 -0
  37. package/dist/core/events.d.ts.map +1 -1
  38. package/dist/core/events.js +33 -4
  39. package/dist/core/events.js.map +1 -1
  40. package/dist/core/history.d.ts +14 -0
  41. package/dist/core/history.d.ts.map +1 -1
  42. package/dist/core/history.js +73 -13
  43. package/dist/core/history.js.map +1 -1
  44. package/dist/core/protect.d.ts +4 -0
  45. package/dist/core/protect.d.ts.map +1 -1
  46. package/dist/core/protect.js +9 -1
  47. package/dist/core/protect.js.map +1 -1
  48. package/dist/core/validator.d.ts +4 -0
  49. package/dist/core/validator.d.ts.map +1 -1
  50. package/dist/core/validator.js +119 -97
  51. package/dist/core/validator.js.map +1 -1
  52. package/dist/core/veto.d.ts +35 -1
  53. package/dist/core/veto.d.ts.map +1 -1
  54. package/dist/core/veto.js +106 -6
  55. package/dist/core/veto.js.map +1 -1
  56. package/dist/custom/types.d.ts +1 -1
  57. package/dist/custom/types.d.ts.map +1 -1
  58. package/dist/deterministic/regex-safety.d.ts.map +1 -1
  59. package/dist/deterministic/regex-safety.js +42 -1
  60. package/dist/deterministic/regex-safety.js.map +1 -1
  61. package/dist/extractors/content.d.ts.map +1 -1
  62. package/dist/extractors/content.js +40 -23
  63. package/dist/extractors/content.js.map +1 -1
  64. package/dist/index.d.ts +11 -1
  65. package/dist/index.d.ts.map +1 -1
  66. package/dist/index.js +9 -0
  67. package/dist/index.js.map +1 -1
  68. package/dist/integrations/langchain/middleware.d.ts +1 -1
  69. package/dist/integrations/langchain/middleware.js +1 -1
  70. package/dist/integrations/vercel-ai/middleware.d.ts +1 -1
  71. package/dist/integrations/vercel-ai/middleware.js +1 -1
  72. package/dist/observability/otel.d.ts +29 -0
  73. package/dist/observability/otel.d.ts.map +1 -0
  74. package/dist/observability/otel.js +43 -0
  75. package/dist/observability/otel.js.map +1 -0
  76. package/dist/policy/generator.d.ts.map +1 -1
  77. package/dist/policy/generator.js +4 -2
  78. package/dist/policy/generator.js.map +1 -1
  79. package/dist/proxy/anthropic-interceptor.d.ts +51 -0
  80. package/dist/proxy/anthropic-interceptor.d.ts.map +1 -0
  81. package/dist/proxy/anthropic-interceptor.js +132 -0
  82. package/dist/proxy/anthropic-interceptor.js.map +1 -0
  83. package/dist/proxy/interceptor.d.ts +55 -0
  84. package/dist/proxy/interceptor.d.ts.map +1 -0
  85. package/dist/proxy/interceptor.js +111 -0
  86. package/dist/proxy/interceptor.js.map +1 -0
  87. package/dist/proxy/server.d.ts +21 -0
  88. package/dist/proxy/server.d.ts.map +1 -0
  89. package/dist/proxy/server.js +545 -0
  90. package/dist/proxy/server.js.map +1 -0
  91. package/dist/proxy/types.d.ts +18 -0
  92. package/dist/proxy/types.d.ts.map +1 -0
  93. package/dist/proxy/types.js +7 -0
  94. package/dist/proxy/types.js.map +1 -0
  95. package/dist/rate-limiting/evaluator.d.ts +17 -0
  96. package/dist/rate-limiting/evaluator.d.ts.map +1 -0
  97. package/dist/rate-limiting/evaluator.js +48 -0
  98. package/dist/rate-limiting/evaluator.js.map +1 -0
  99. package/dist/rate-limiting/redis-store.d.ts +36 -0
  100. package/dist/rate-limiting/redis-store.d.ts.map +1 -0
  101. package/dist/rate-limiting/redis-store.js +68 -0
  102. package/dist/rate-limiting/redis-store.js.map +1 -0
  103. package/dist/rate-limiting/store.d.ts +8 -0
  104. package/dist/rate-limiting/store.d.ts.map +1 -0
  105. package/dist/rate-limiting/store.js +60 -0
  106. package/dist/rate-limiting/store.js.map +1 -0
  107. package/dist/rate-limiting/types.d.ts +9 -0
  108. package/dist/rate-limiting/types.d.ts.map +1 -0
  109. package/dist/rate-limiting/types.js +2 -0
  110. package/dist/rate-limiting/types.js.map +1 -0
  111. package/dist/rules/condition-evaluator.d.ts +6 -0
  112. package/dist/rules/condition-evaluator.d.ts.map +1 -1
  113. package/dist/rules/condition-evaluator.js +60 -18
  114. package/dist/rules/condition-evaluator.js.map +1 -1
  115. package/dist/rules/expression-validator.d.ts.map +1 -1
  116. package/dist/rules/expression-validator.js +5 -0
  117. package/dist/rules/expression-validator.js.map +1 -1
  118. package/dist/rules/loader.d.ts.map +1 -1
  119. package/dist/rules/loader.js +2 -0
  120. package/dist/rules/loader.js.map +1 -1
  121. package/dist/rules/local-evaluator.d.ts +11 -15
  122. package/dist/rules/local-evaluator.d.ts.map +1 -1
  123. package/dist/rules/local-evaluator.js +62 -29
  124. package/dist/rules/local-evaluator.js.map +1 -1
  125. package/dist/rules/policy-ir-schema.d.ts +43 -1
  126. package/dist/rules/policy-ir-schema.d.ts.map +1 -1
  127. package/dist/rules/policy-ir-schema.js +27 -1
  128. package/dist/rules/policy-ir-schema.js.map +1 -1
  129. package/dist/rules/types.d.ts +20 -1
  130. package/dist/rules/types.d.ts.map +1 -1
  131. package/dist/rules/types.js.map +1 -1
  132. package/dist/testing/runner.d.ts +21 -0
  133. package/dist/testing/runner.d.ts.map +1 -0
  134. package/dist/testing/runner.js +239 -0
  135. package/dist/testing/runner.js.map +1 -0
  136. package/dist/testing/types.d.ts +39 -0
  137. package/dist/testing/types.d.ts.map +1 -0
  138. package/dist/testing/types.js +7 -0
  139. package/dist/testing/types.js.map +1 -0
  140. package/dist/types/config.d.ts +1 -0
  141. package/dist/types/config.d.ts.map +1 -1
  142. package/dist/types/config.js.map +1 -1
  143. package/package.json +30 -17
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server.js","sourceRoot":"","sources":["../../src/proxy/server.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,18 @@
1
+ /**
2
+ * Type definitions for veto intercept proxy.
3
+ *
4
+ * @module proxy/types
5
+ */
6
+ export interface ProxyConfig {
7
+ /** Port for the local proxy to listen on. Default: 8080 */
8
+ port: number;
9
+ /** Upstream target URL. Default: https://api.openai.com */
10
+ target: string;
11
+ /** Max bytes to buffer before giving up and flushing. Default: 1MB */
12
+ maxBufferBytes: number;
13
+ /** Path to veto config directory. Default: ./veto */
14
+ configDir: string;
15
+ /** SSE format to intercept. 'auto' detects from target URL. Default: 'auto' */
16
+ format?: 'openai' | 'anthropic' | 'auto';
17
+ }
18
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/proxy/types.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,MAAM,WAAW,WAAW;IAC1B,2DAA2D;IAC3D,IAAI,EAAE,MAAM,CAAC;IACb,2DAA2D;IAC3D,MAAM,EAAE,MAAM,CAAC;IACf,sEAAsE;IACtE,cAAc,EAAE,MAAM,CAAC;IACvB,qDAAqD;IACrD,SAAS,EAAE,MAAM,CAAC;IAClB,+EAA+E;IAC/E,MAAM,CAAC,EAAE,QAAQ,GAAG,WAAW,GAAG,MAAM,CAAC;CAC1C"}
@@ -0,0 +1,7 @@
1
+ /**
2
+ * Type definitions for veto intercept proxy.
3
+ *
4
+ * @module proxy/types
5
+ */
6
+ export {};
7
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/proxy/types.ts"],"names":[],"mappings":"AAAA;;;;GAIG"}
@@ -0,0 +1,17 @@
1
+ import type { RateLimitEntry } from './types.js';
2
+ import type { ValidationContext } from '../types/config.js';
3
+ import type { Logger } from '../utils/logger.js';
4
+ export interface RateLimitStore {
5
+ checkAndRecord(key: string, maxCalls: number, windowMs: number): boolean | Promise<boolean>;
6
+ clear(): void | Promise<void>;
7
+ }
8
+ export declare function buildScopeKey(entry: RateLimitEntry, ctx: Pick<ValidationContext, 'agentId' | 'userId' | 'sessionId'>, toolName: string, logger: Logger, ruleId?: string): string;
9
+ /**
10
+ * Evaluate rate limits for a tool call.
11
+ * Returns null if all limits pass, or a denial reason string if any limit is exceeded.
12
+ *
13
+ * When no store is provided, falls back to the built-in in-memory sliding window store.
14
+ * Accepts async stores (e.g. Redis) — callers must await the result.
15
+ */
16
+ export declare function evaluateRateLimits(rateLimits: RateLimitEntry[], ctx: Pick<ValidationContext, 'agentId' | 'userId' | 'sessionId'>, toolName: string, logger: Logger, ruleId?: string, store?: RateLimitStore): Promise<string | null>;
17
+ //# sourceMappingURL=evaluator.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"evaluator.d.ts","sourceRoot":"","sources":["../../src/rate-limiting/evaluator.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AACjD,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AAE5D,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAEjD,MAAM,WAAW,cAAc;IAC7B,cAAc,CAAC,GAAG,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IAC5F,KAAK,IAAI,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CAC/B;AAED,wBAAgB,aAAa,CAC3B,KAAK,EAAE,cAAc,EACrB,GAAG,EAAE,IAAI,CAAC,iBAAiB,EAAE,SAAS,GAAG,QAAQ,GAAG,WAAW,CAAC,EAChE,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,MAAM,EACd,MAAM,CAAC,EAAE,MAAM,GACd,MAAM,CAgBR;AAED;;;;;;GAMG;AACH,wBAAsB,kBAAkB,CACtC,UAAU,EAAE,cAAc,EAAE,EAC5B,GAAG,EAAE,IAAI,CAAC,iBAAiB,EAAE,SAAS,GAAG,QAAQ,GAAG,WAAW,CAAC,EAChE,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,MAAM,EACd,MAAM,CAAC,EAAE,MAAM,EACf,KAAK,CAAC,EAAE,cAAc,GACrB,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAgBxB"}
@@ -0,0 +1,48 @@
1
+ import { checkAndRecord as memoryCheckAndRecord } from './store.js';
2
+ export function buildScopeKey(entry, ctx, toolName, logger, ruleId) {
3
+ let scopeId;
4
+ switch (entry.scope) {
5
+ case 'agent':
6
+ scopeId = ctx.agentId ?? null;
7
+ break;
8
+ case 'user':
9
+ scopeId = ctx.userId ?? null;
10
+ break;
11
+ case 'session':
12
+ scopeId = ctx.sessionId ?? null;
13
+ break;
14
+ default: scopeId = 'global';
15
+ }
16
+ if (scopeId === null) {
17
+ logger.warn(`[veto] rate_limit scope '${entry.scope}' requires ${entry.scope}Id in context. Falling back to global.`);
18
+ scopeId = 'global';
19
+ }
20
+ const prefix = ruleId ? `${ruleId}:` : '';
21
+ return `${prefix}${entry.scope}:${scopeId}:${toolName}`;
22
+ }
23
+ /**
24
+ * Evaluate rate limits for a tool call.
25
+ * Returns null if all limits pass, or a denial reason string if any limit is exceeded.
26
+ *
27
+ * When no store is provided, falls back to the built-in in-memory sliding window store.
28
+ * Accepts async stores (e.g. Redis) — callers must await the result.
29
+ */
30
+ export async function evaluateRateLimits(rateLimits, ctx, toolName, logger, ruleId, store) {
31
+ const check = store ? store.checkAndRecord.bind(store) : memoryCheckAndRecord;
32
+ for (const entry of rateLimits) {
33
+ const key = buildScopeKey(entry, ctx, toolName, logger, ruleId);
34
+ const windowMs = entry.window_seconds * 1000;
35
+ try {
36
+ const allowed = await check(key, entry.max_calls, windowMs);
37
+ if (!allowed) {
38
+ return `Rate limit exceeded: max ${entry.max_calls} calls per ${entry.window_seconds}s (scope: ${entry.scope})`;
39
+ }
40
+ }
41
+ catch (err) {
42
+ logger.error('[veto] rate limit store error, failing closed', { err: String(err) });
43
+ return 'Rate limit check failed (fail-closed)';
44
+ }
45
+ }
46
+ return null;
47
+ }
48
+ //# sourceMappingURL=evaluator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"evaluator.js","sourceRoot":"","sources":["../../src/rate-limiting/evaluator.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,cAAc,IAAI,oBAAoB,EAAE,MAAM,YAAY,CAAC;AAQpE,MAAM,UAAU,aAAa,CAC3B,KAAqB,EACrB,GAAgE,EAChE,QAAgB,EAChB,MAAc,EACd,MAAe;IAEf,IAAI,OAAsB,CAAC;IAC3B,QAAQ,KAAK,CAAC,KAAK,EAAE,CAAC;QACpB,KAAK,OAAO;YAAE,OAAO,GAAG,GAAG,CAAC,OAAO,IAAI,IAAI,CAAC;YAAC,MAAM;QACnD,KAAK,MAAM;YAAE,OAAO,GAAG,GAAG,CAAC,MAAM,IAAI,IAAI,CAAC;YAAC,MAAM;QACjD,KAAK,SAAS;YAAE,OAAO,GAAG,GAAG,CAAC,SAAS,IAAI,IAAI,CAAC;YAAC,MAAM;QACvD,OAAO,CAAC,CAAC,OAAO,GAAG,QAAQ,CAAC;IAC9B,CAAC;IACD,IAAI,OAAO,KAAK,IAAI,EAAE,CAAC;QACrB,MAAM,CAAC,IAAI,CACT,4BAA4B,KAAK,CAAC,KAAK,cAAc,KAAK,CAAC,KAAK,wCAAwC,CACzG,CAAC;QACF,OAAO,GAAG,QAAQ,CAAC;IACrB,CAAC;IACD,MAAM,MAAM,GAAG,MAAM,CAAC,CAAC,CAAC,GAAG,MAAM,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;IAC1C,OAAO,GAAG,MAAM,GAAG,KAAK,CAAC,KAAK,IAAI,OAAO,IAAI,QAAQ,EAAE,CAAC;AAC1D,CAAC;AAED;;;;;;GAMG;AACH,MAAM,CAAC,KAAK,UAAU,kBAAkB,CACtC,UAA4B,EAC5B,GAAgE,EAChE,QAAgB,EAChB,MAAc,EACd,MAAe,EACf,KAAsB;IAEtB,MAAM,KAAK,GAAG,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,cAAc,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,oBAAoB,CAAC;IAC9E,KAAK,MAAM,KAAK,IAAI,UAAU,EAAE,CAAC;QAC/B,MAAM,GAAG,GAAG,aAAa,CAAC,KAAK,EAAE,GAAG,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;QAChE,MAAM,QAAQ,GAAG,KAAK,CAAC,cAAc,GAAG,IAAI,CAAC;QAC7C,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,MAAM,KAAK,CAAC,GAAG,EAAE,KAAK,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC;YAC5D,IAAI,CAAC,OAAO,EAAE,CAAC;gBACb,OAAO,4BAA4B,KAAK,CAAC,SAAS,cAAc,KAAK,CAAC,cAAc,aAAa,KAAK,CAAC,KAAK,GAAG,CAAC;YAClH,CAAC;QACH,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,MAAM,CAAC,KAAK,CAAC,+CAA+C,EAAE,EAAE,GAAG,EAAE,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YACpF,OAAO,uCAAuC,CAAC;QACjD,CAAC;IACH,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC"}
@@ -0,0 +1,36 @@
1
+ /**
2
+ * Redis/Valkey-backed sliding window rate limit store.
3
+ *
4
+ * Uses a sorted set per key with timestamps as scores. A Lua script
5
+ * atomically prunes expired entries, checks the count, and records
6
+ * the new call — no TOCTOU race across cluster nodes.
7
+ *
8
+ * Requires the `redis` npm package (^4.0.0) as an optional peer dependency.
9
+ */
10
+ type RedisClient = {
11
+ scriptLoad(script: string): Promise<string>;
12
+ evalSha(sha: string, options: {
13
+ keys: string[];
14
+ arguments: string[];
15
+ }): Promise<unknown>;
16
+ scan(cursor: number, options: {
17
+ MATCH: string;
18
+ COUNT: number;
19
+ }): Promise<{
20
+ cursor: number;
21
+ keys: string[];
22
+ }>;
23
+ del(keys: string | string[]): Promise<number>;
24
+ };
25
+ import type { RateLimitStore } from './evaluator.js';
26
+ export declare class RedisRateLimitStore implements RateLimitStore {
27
+ private client;
28
+ private scriptSha;
29
+ private keyPrefix;
30
+ constructor(client: RedisClient, keyPrefix?: string);
31
+ checkAndRecord(key: string, maxCalls: number, windowMs: number): Promise<boolean>;
32
+ private _checkAndRecord;
33
+ clear(): Promise<void>;
34
+ }
35
+ export {};
36
+ //# sourceMappingURL=redis-store.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"redis-store.d.ts","sourceRoot":"","sources":["../../src/rate-limiting/redis-store.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,KAAK,WAAW,GAAG;IACjB,UAAU,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;IAC5C,OAAO,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,EAAE;QAAE,IAAI,EAAE,MAAM,EAAE,CAAC;QAAC,SAAS,EAAE,MAAM,EAAE,CAAA;KAAE,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IACzF,IAAI,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,EAAE,CAAA;KAAE,CAAC,CAAC;IAC7G,GAAG,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;CAC/C,CAAC;AAkBF,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAErD,qBAAa,mBAAoB,YAAW,cAAc;IACxD,OAAO,CAAC,MAAM,CAAc;IAC5B,OAAO,CAAC,SAAS,CAAuB;IACxC,OAAO,CAAC,SAAS,CAAS;gBAEd,MAAM,EAAE,WAAW,EAAE,SAAS,SAAa;IAKjD,cAAc,CAAC,GAAG,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;YAIzE,eAAe;IA0BvB,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;CAU7B"}
@@ -0,0 +1,68 @@
1
+ /**
2
+ * Redis/Valkey-backed sliding window rate limit store.
3
+ *
4
+ * Uses a sorted set per key with timestamps as scores. A Lua script
5
+ * atomically prunes expired entries, checks the count, and records
6
+ * the new call — no TOCTOU race across cluster nodes.
7
+ *
8
+ * Requires the `redis` npm package (^4.0.0) as an optional peer dependency.
9
+ */
10
+ const SLIDING_WINDOW_SCRIPT = `
11
+ local key = KEYS[1]
12
+ local windowMs = tonumber(ARGV[1])
13
+ local maxCalls = tonumber(ARGV[2])
14
+ local now = tonumber(ARGV[3])
15
+ local cutoff = now - windowMs
16
+ redis.call('ZREMRANGEBYSCORE', key, '-inf', cutoff)
17
+ local count = redis.call('ZCARD', key)
18
+ if count >= maxCalls then
19
+ return 0
20
+ end
21
+ redis.call('ZADD', key, now, now .. '-' .. math.random(1000000))
22
+ redis.call('PEXPIRE', key, windowMs)
23
+ return 1
24
+ `;
25
+ export class RedisRateLimitStore {
26
+ client;
27
+ scriptSha = null;
28
+ keyPrefix;
29
+ constructor(client, keyPrefix = 'veto:rl:') {
30
+ this.client = client;
31
+ this.keyPrefix = keyPrefix;
32
+ }
33
+ async checkAndRecord(key, maxCalls, windowMs) {
34
+ return this._checkAndRecord(key, maxCalls, windowMs, false);
35
+ }
36
+ async _checkAndRecord(key, maxCalls, windowMs, retried) {
37
+ const fullKey = this.keyPrefix + key;
38
+ const now = Date.now();
39
+ try {
40
+ if (!this.scriptSha) {
41
+ this.scriptSha = await this.client.scriptLoad(SLIDING_WINDOW_SCRIPT);
42
+ }
43
+ const result = await this.client.evalSha(this.scriptSha, {
44
+ keys: [fullKey],
45
+ arguments: [windowMs.toString(), maxCalls.toString(), now.toString()],
46
+ });
47
+ return result === 1;
48
+ }
49
+ catch (err) {
50
+ if (!retried && err instanceof Error && err.message.includes('NOSCRIPT')) {
51
+ this.scriptSha = null;
52
+ return this._checkAndRecord(key, maxCalls, windowMs, true);
53
+ }
54
+ throw err;
55
+ }
56
+ }
57
+ async clear() {
58
+ let cursor = 0;
59
+ do {
60
+ const result = await this.client.scan(cursor, { MATCH: this.keyPrefix + '*', COUNT: 100 });
61
+ cursor = result.cursor;
62
+ if (result.keys.length > 0) {
63
+ await this.client.del(result.keys);
64
+ }
65
+ } while (cursor !== 0);
66
+ }
67
+ }
68
+ //# sourceMappingURL=redis-store.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"redis-store.js","sourceRoot":"","sources":["../../src/rate-limiting/redis-store.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AASH,MAAM,qBAAqB,GAAG;;;;;;;;;;;;;;CAc7B,CAAC;AAIF,MAAM,OAAO,mBAAmB;IACtB,MAAM,CAAc;IACpB,SAAS,GAAkB,IAAI,CAAC;IAChC,SAAS,CAAS;IAE1B,YAAY,MAAmB,EAAE,SAAS,GAAG,UAAU;QACrD,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;QACrB,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC;IAC7B,CAAC;IAED,KAAK,CAAC,cAAc,CAAC,GAAW,EAAE,QAAgB,EAAE,QAAgB;QAClE,OAAO,IAAI,CAAC,eAAe,CAAC,GAAG,EAAE,QAAQ,EAAE,QAAQ,EAAE,KAAK,CAAC,CAAC;IAC9D,CAAC;IAEO,KAAK,CAAC,eAAe,CAC3B,GAAW,EAAE,QAAgB,EAAE,QAAgB,EAAE,OAAgB;QAEjE,MAAM,OAAO,GAAG,IAAI,CAAC,SAAS,GAAG,GAAG,CAAC;QACrC,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QAEvB,IAAI,CAAC;YACH,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,CAAC;gBACpB,IAAI,CAAC,SAAS,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,qBAAqB,CAAC,CAAC;YACvE,CAAC;YAED,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,SAAS,EAAE;gBACvD,IAAI,EAAE,CAAC,OAAO,CAAC;gBACf,SAAS,EAAE,CAAC,QAAQ,CAAC,QAAQ,EAAE,EAAE,QAAQ,CAAC,QAAQ,EAAE,EAAE,GAAG,CAAC,QAAQ,EAAE,CAAC;aACtE,CAAC,CAAC;YAEH,OAAO,MAAM,KAAK,CAAC,CAAC;QACtB,CAAC;QAAC,OAAO,GAAY,EAAE,CAAC;YACtB,IAAI,CAAC,OAAO,IAAI,GAAG,YAAY,KAAK,IAAI,GAAG,CAAC,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAC,EAAE,CAAC;gBACzE,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC;gBACtB,OAAO,IAAI,CAAC,eAAe,CAAC,GAAG,EAAE,QAAQ,EAAE,QAAQ,EAAE,IAAI,CAAC,CAAC;YAC7D,CAAC;YACD,MAAM,GAAG,CAAC;QACZ,CAAC;IACH,CAAC;IAED,KAAK,CAAC,KAAK;QACT,IAAI,MAAM,GAAG,CAAC,CAAC;QACf,GAAG,CAAC;YACF,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,KAAK,EAAE,IAAI,CAAC,SAAS,GAAG,GAAG,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC,CAAC;YAC3F,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC;YACvB,IAAI,MAAM,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBAC3B,MAAM,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;YACrC,CAAC;QACH,CAAC,QAAQ,MAAM,KAAK,CAAC,EAAE;IACzB,CAAC;CACF"}
@@ -0,0 +1,8 @@
1
+ /**
2
+ * Check if a call is allowed, and record it if so.
3
+ * Returns true if allowed, false if rate limited.
4
+ */
5
+ export declare function checkAndRecord(key: string, maxCalls: number, windowMs: number): boolean;
6
+ /** Clear all rate limit state (used in tests) */
7
+ export declare function clearStore(): void;
8
+ //# sourceMappingURL=store.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"store.d.ts","sourceRoot":"","sources":["../../src/rate-limiting/store.ts"],"names":[],"mappings":"AAcA;;;GAGG;AACH,wBAAgB,cAAc,CAAC,GAAG,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAYvF;AAsBD,iDAAiD;AACjD,wBAAgB,UAAU,IAAI,IAAI,CAOjC"}
@@ -0,0 +1,60 @@
1
+ /**
2
+ * In-process sliding window rate limit store.
3
+ *
4
+ * Stores call timestamps per key. Checks are synchronous — safe in Node.js
5
+ * single-threaded event loop (no race conditions on Map reads/writes).
6
+ *
7
+ * Limitations: process-local only. Resets on restart. For multi-process
8
+ * deployments, use cloud mode with stateful counters.
9
+ */
10
+ const store = new Map();
11
+ let sweepInterval = null;
12
+ let maxWindowMs = 0;
13
+ /**
14
+ * Check if a call is allowed, and record it if so.
15
+ * Returns true if allowed, false if rate limited.
16
+ */
17
+ export function checkAndRecord(key, maxCalls, windowMs) {
18
+ const now = Date.now();
19
+ const prev = store.get(key) ?? [];
20
+ const valid = prev.filter(t => now - t < windowMs);
21
+ if (valid.length >= maxCalls)
22
+ return false;
23
+ valid.push(now);
24
+ store.set(key, valid);
25
+ // Track the largest window for sweep purposes
26
+ if (windowMs > maxWindowMs)
27
+ maxWindowMs = windowMs;
28
+ ensureSweep();
29
+ return true;
30
+ }
31
+ /** Remove keys whose newest timestamp is older than the largest configured window. */
32
+ function sweep() {
33
+ if (store.size === 0)
34
+ return;
35
+ const now = Date.now();
36
+ const cutoff = maxWindowMs || 60_000;
37
+ for (const [key, timestamps] of store) {
38
+ if (timestamps.length === 0 || now - timestamps[timestamps.length - 1] >= cutoff) {
39
+ store.delete(key);
40
+ }
41
+ }
42
+ }
43
+ function ensureSweep() {
44
+ if (sweepInterval !== null)
45
+ return;
46
+ sweepInterval = setInterval(sweep, 60_000);
47
+ if (typeof sweepInterval === 'object' && sweepInterval !== null && 'unref' in sweepInterval) {
48
+ sweepInterval.unref();
49
+ }
50
+ }
51
+ /** Clear all rate limit state (used in tests) */
52
+ export function clearStore() {
53
+ store.clear();
54
+ if (sweepInterval !== null) {
55
+ clearInterval(sweepInterval);
56
+ sweepInterval = null;
57
+ }
58
+ maxWindowMs = 0;
59
+ }
60
+ //# sourceMappingURL=store.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"store.js","sourceRoot":"","sources":["../../src/rate-limiting/store.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AACH,MAAM,KAAK,GAAG,IAAI,GAAG,EAAoB,CAAC;AAE1C,IAAI,aAAa,GAA0C,IAAI,CAAC;AAChE,IAAI,WAAW,GAAG,CAAC,CAAC;AAEpB;;;GAGG;AACH,MAAM,UAAU,cAAc,CAAC,GAAW,EAAE,QAAgB,EAAE,QAAgB;IAC5E,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IACvB,MAAM,IAAI,GAAG,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC;IAClC,MAAM,KAAK,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,GAAG,GAAG,CAAC,GAAG,QAAQ,CAAC,CAAC;IACnD,IAAI,KAAK,CAAC,MAAM,IAAI,QAAQ;QAAE,OAAO,KAAK,CAAC;IAC3C,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAChB,KAAK,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;IAEtB,8CAA8C;IAC9C,IAAI,QAAQ,GAAG,WAAW;QAAE,WAAW,GAAG,QAAQ,CAAC;IACnD,WAAW,EAAE,CAAC;IACd,OAAO,IAAI,CAAC;AACd,CAAC;AAED,sFAAsF;AACtF,SAAS,KAAK;IACZ,IAAI,KAAK,CAAC,IAAI,KAAK,CAAC;QAAE,OAAO;IAC7B,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IACvB,MAAM,MAAM,GAAG,WAAW,IAAI,MAAM,CAAC;IACrC,KAAK,MAAM,CAAC,GAAG,EAAE,UAAU,CAAC,IAAI,KAAK,EAAE,CAAC;QACtC,IAAI,UAAU,CAAC,MAAM,KAAK,CAAC,IAAI,GAAG,GAAG,UAAU,CAAC,UAAU,CAAC,MAAM,GAAG,CAAC,CAAC,IAAI,MAAM,EAAE,CAAC;YACjF,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QACpB,CAAC;IACH,CAAC;AACH,CAAC;AAED,SAAS,WAAW;IAClB,IAAI,aAAa,KAAK,IAAI;QAAE,OAAO;IACnC,aAAa,GAAG,WAAW,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;IAC3C,IAAI,OAAO,aAAa,KAAK,QAAQ,IAAI,aAAa,KAAK,IAAI,IAAI,OAAO,IAAI,aAAa,EAAE,CAAC;QAC3F,aAAgC,CAAC,KAAK,EAAE,CAAC;IAC5C,CAAC;AACH,CAAC;AAED,iDAAiD;AACjD,MAAM,UAAU,UAAU;IACxB,KAAK,CAAC,KAAK,EAAE,CAAC;IACd,IAAI,aAAa,KAAK,IAAI,EAAE,CAAC;QAC3B,aAAa,CAAC,aAAa,CAAC,CAAC;QAC7B,aAAa,GAAG,IAAI,CAAC;IACvB,CAAC;IACD,WAAW,GAAG,CAAC,CAAC;AAClB,CAAC"}
@@ -0,0 +1,9 @@
1
+ export interface RateLimitEntry {
2
+ /** Scope of the rate limit */
3
+ scope: 'agent' | 'user' | 'session' | 'global';
4
+ /** Maximum calls allowed in the window */
5
+ max_calls: number;
6
+ /** Window size in seconds */
7
+ window_seconds: number;
8
+ }
9
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/rate-limiting/types.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,cAAc;IAC7B,8BAA8B;IAC9B,KAAK,EAAE,OAAO,GAAG,MAAM,GAAG,SAAS,GAAG,QAAQ,CAAC;IAC/C,0CAA0C;IAC1C,SAAS,EAAE,MAAM,CAAC;IAClB,6BAA6B;IAC7B,cAAc,EAAE,MAAM,CAAC;CACxB"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/rate-limiting/types.ts"],"names":[],"mappings":""}
@@ -4,6 +4,10 @@ export interface ConditionEvaluationOptions {
4
4
  allowNestedObjectStringSearch?: boolean;
5
5
  now?: Date;
6
6
  }
7
+ interface TimeWindowEvaluation {
8
+ inScope: boolean;
9
+ withinWindow: boolean;
10
+ }
7
11
  /**
8
12
  * Resolve a dot-notation field path from an evaluation context.
9
13
  */
@@ -12,6 +16,7 @@ export declare function resolveFieldPath(field: string, context: Record<string,
12
16
  * Compile a regex pattern only if it passes safety checks.
13
17
  */
14
18
  export declare function createSafeRegex(pattern: string, flags?: string): RegExp | null;
19
+ export declare function evaluateTimeWindow(fieldValue: unknown, expected: unknown): TimeWindowEvaluation | null;
15
20
  /**
16
21
  * Evaluate a single legacy field/operator/value condition.
17
22
  */
@@ -26,4 +31,5 @@ export declare function evaluateCondition(condition: RuleCondition, context: Rec
26
31
  * - `conditionGroups`: OR semantics, each group is AND
27
32
  */
28
33
  export declare function evaluateConditionCollections(conditions: RuleCondition[] | undefined, conditionGroups: RuleCondition[][] | undefined, context: Record<string, unknown>, options?: ConditionEvaluationOptions): boolean;
34
+ export {};
29
35
  //# sourceMappingURL=condition-evaluator.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"condition-evaluator.d.ts","sourceRoot":"","sources":["../../src/rules/condition-evaluator.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EACV,iBAAiB,EACjB,aAAa,EAEd,MAAM,YAAY,CAAC;AAEpB,MAAM,WAAW,0BAA0B;IACzC,kBAAkB,CAAC,EAAE,CAAC,UAAU,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,OAAO,CAAC;IACvF,6BAA6B,CAAC,EAAE,OAAO,CAAC;IACxC,GAAG,CAAC,EAAE,IAAI,CAAC;CACZ;AAwDD;;GAEG;AACH,wBAAgB,gBAAgB,CAC9B,KAAK,EAAE,MAAM,EACb,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAChC,cAAc,GAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAoC,GACzE,OAAO,CAWT;AAED;;GAEG;AACH,wBAAgB,eAAe,CAC7B,OAAO,EAAE,MAAM,EACf,KAAK,CAAC,EAAE,MAAM,GACb,MAAM,GAAG,IAAI,CAef;AAuTD;;GAEG;AACH,wBAAgB,uBAAuB,CACrC,UAAU,EAAE,OAAO,EACnB,QAAQ,EAAE,iBAAiB,EAC3B,QAAQ,EAAE,OAAO,EACjB,OAAO,GAAE,IAAI,CAAC,0BAA0B,EAAE,+BAA+B,CAAM,GAC9E,OAAO,CA0FT;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAC/B,SAAS,EAAE,aAAa,EACxB,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAChC,OAAO,GAAE,0BAA+B,GACvC,OAAO,CAuCT;AAED;;;;GAIG;AACH,wBAAgB,4BAA4B,CAC1C,UAAU,EAAE,aAAa,EAAE,GAAG,SAAS,EACvC,eAAe,EAAE,aAAa,EAAE,EAAE,GAAG,SAAS,EAC9C,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAChC,OAAO,GAAE,0BAA+B,GACvC,OAAO,CAiBT"}
1
+ {"version":3,"file":"condition-evaluator.d.ts","sourceRoot":"","sources":["../../src/rules/condition-evaluator.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EACV,iBAAiB,EACjB,aAAa,EAEd,MAAM,YAAY,CAAC;AAEpB,MAAM,WAAW,0BAA0B;IACzC,kBAAkB,CAAC,EAAE,CAAC,UAAU,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,OAAO,CAAC;IACvF,6BAA6B,CAAC,EAAE,OAAO,CAAC;IACxC,GAAG,CAAC,EAAE,IAAI,CAAC;CACZ;AASD,UAAU,oBAAoB;IAC5B,OAAO,EAAE,OAAO,CAAC;IACjB,YAAY,EAAE,OAAO,CAAC;CACvB;AA6CD;;GAEG;AACH,wBAAgB,gBAAgB,CAC9B,KAAK,EAAE,MAAM,EACb,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAChC,cAAc,GAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAoC,GACzE,OAAO,CAWT;AAED;;GAEG;AACH,wBAAgB,eAAe,CAC7B,OAAO,EAAE,MAAM,EACf,KAAK,CAAC,EAAE,MAAM,GACb,MAAM,GAAG,IAAI,CAef;AAqMD,wBAAgB,kBAAkB,CAChC,UAAU,EAAE,OAAO,EACnB,QAAQ,EAAE,OAAO,GAChB,oBAAoB,GAAG,IAAI,CAmD7B;AAgED;;GAEG;AACH,wBAAgB,uBAAuB,CACrC,UAAU,EAAE,OAAO,EACnB,QAAQ,EAAE,iBAAiB,EAC3B,QAAQ,EAAE,OAAO,EACjB,OAAO,GAAE,IAAI,CAAC,0BAA0B,EAAE,+BAA+B,CAAM,GAC9E,OAAO,CAwHT;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAC/B,SAAS,EAAE,aAAa,EACxB,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAChC,OAAO,GAAE,0BAA+B,GACvC,OAAO,CAwCT;AAED;;;;GAIG;AACH,wBAAgB,4BAA4B,CAC1C,UAAU,EAAE,aAAa,EAAE,GAAG,SAAS,EACvC,eAAe,EAAE,aAAa,EAAE,EAAE,GAAG,SAAS,EAC9C,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAChC,OAAO,GAAE,0BAA+B,GACvC,OAAO,CAiBT"}
@@ -31,6 +31,8 @@ function resolveDotPath(path, source) {
31
31
  if (typeof current !== 'object') {
32
32
  return undefined;
33
33
  }
34
+ if (!Object.prototype.hasOwnProperty.call(current, part))
35
+ return undefined;
34
36
  current = current[part];
35
37
  }
36
38
  return current;
@@ -178,6 +180,11 @@ function getTimeZoneFormatter(timezone) {
178
180
  minute: '2-digit',
179
181
  hour12: false,
180
182
  });
183
+ if (TIMEZONE_FORMATTER_CACHE.size >= 1000) {
184
+ const firstKey = TIMEZONE_FORMATTER_CACHE.keys().next().value;
185
+ if (firstKey !== undefined)
186
+ TIMEZONE_FORMATTER_CACHE.delete(firstKey);
187
+ }
181
188
  TIMEZONE_FORMATTER_CACHE.set(timezone, formatter);
182
189
  return formatter;
183
190
  }
@@ -224,7 +231,7 @@ function previousDay(day) {
224
231
  function isDayAllowed(day, allowedDays) {
225
232
  return allowedDays === null || allowedDays.has(day);
226
233
  }
227
- function evaluateTimeWindow(fieldValue, expected) {
234
+ export function evaluateTimeWindow(fieldValue, expected) {
228
235
  const parsedWindow = normalizeTimeWindowValue(expected);
229
236
  if (!parsedWindow) {
230
237
  return null;
@@ -321,60 +328,82 @@ export function evaluateLegacyCondition(fieldValue, operator, expected, options
321
328
  const allowNestedObjectStringSearch = options.allowNestedObjectStringSearch === true;
322
329
  switch (operator) {
323
330
  case 'equals':
331
+ if (typeof fieldValue === 'string' && typeof expected === 'string') {
332
+ return fieldValue.toLowerCase() === expected.toLowerCase();
333
+ }
324
334
  return fieldValue === expected;
325
335
  case 'not_equals':
336
+ if (typeof fieldValue === 'string' && typeof expected === 'string') {
337
+ return fieldValue.toLowerCase() !== expected.toLowerCase();
338
+ }
326
339
  return fieldValue !== expected;
327
340
  case 'contains':
328
341
  if (typeof fieldValue === 'string' && typeof expected === 'string') {
329
- return fieldValue.includes(expected);
342
+ return fieldValue.toLowerCase().includes(expected.toLowerCase());
330
343
  }
331
344
  if (Array.isArray(fieldValue)) {
345
+ if (typeof expected === 'string') {
346
+ const lower = expected.toLowerCase();
347
+ return fieldValue.some((e) => typeof e === 'string' ? e.toLowerCase() === lower : e === expected);
348
+ }
332
349
  return fieldValue.includes(expected);
333
350
  }
334
351
  if (allowNestedObjectStringSearch && typeof expected === 'string') {
352
+ const lower = expected.toLowerCase();
335
353
  return collectNestedStrings(fieldValue)
336
- .some((value) => value.includes(expected));
354
+ .some((value) => value.toLowerCase().includes(lower));
337
355
  }
338
356
  return false;
339
357
  case 'not_contains':
340
358
  if (typeof fieldValue === 'string' && typeof expected === 'string') {
341
- return !fieldValue.includes(expected);
359
+ return !fieldValue.toLowerCase().includes(expected.toLowerCase());
342
360
  }
343
361
  if (Array.isArray(fieldValue)) {
362
+ if (typeof expected === 'string') {
363
+ const lower = expected.toLowerCase();
364
+ return !fieldValue.some((e) => typeof e === 'string' ? e.toLowerCase() === lower : e === expected);
365
+ }
344
366
  return !fieldValue.includes(expected);
345
367
  }
346
368
  if (allowNestedObjectStringSearch && typeof expected === 'string') {
369
+ const lower = expected.toLowerCase();
347
370
  return collectNestedStrings(fieldValue)
348
- .every((value) => !value.includes(expected));
371
+ .every((value) => !value.toLowerCase().includes(lower));
349
372
  }
350
- return true;
373
+ return false;
351
374
  case 'starts_with':
352
375
  return typeof fieldValue === 'string' && typeof expected === 'string'
353
- && fieldValue.startsWith(expected);
376
+ && fieldValue.toLowerCase().startsWith(expected.toLowerCase());
354
377
  case 'ends_with':
355
378
  return typeof fieldValue === 'string' && typeof expected === 'string'
356
- && fieldValue.endsWith(expected);
379
+ && fieldValue.toLowerCase().endsWith(expected.toLowerCase());
357
380
  case 'matches': {
358
381
  if (typeof expected !== 'string') {
359
382
  return false;
360
383
  }
361
384
  if (typeof fieldValue === 'string') {
362
- return createSafeRegex(expected)?.test(fieldValue) ?? false;
385
+ return createSafeRegex(expected, 'i')?.test(fieldValue) ?? false;
363
386
  }
364
387
  if (!allowNestedObjectStringSearch) {
365
388
  return false;
366
389
  }
367
- const regex = createSafeRegex(expected);
390
+ const regex = createSafeRegex(expected, 'i');
368
391
  if (!regex) {
369
392
  return false;
370
393
  }
371
394
  return collectNestedStrings(fieldValue)
372
395
  .some((value) => regex.test(value));
373
396
  }
374
- case 'greater_than':
375
- return Number(fieldValue) > Number(expected);
376
- case 'less_than':
377
- return Number(fieldValue) < Number(expected);
397
+ case 'greater_than': {
398
+ if (typeof fieldValue !== 'number' || typeof expected !== 'number')
399
+ return false;
400
+ return Number.isFinite(fieldValue) && Number.isFinite(expected) && fieldValue > expected;
401
+ }
402
+ case 'less_than': {
403
+ if (typeof fieldValue !== 'number' || typeof expected !== 'number')
404
+ return false;
405
+ return Number.isFinite(fieldValue) && Number.isFinite(expected) && fieldValue < expected;
406
+ }
378
407
  case 'length_greater_than': {
379
408
  const fieldLength = getLengthComparableValue(fieldValue);
380
409
  if (fieldLength === null) {
@@ -387,9 +416,21 @@ export function evaluateLegacyCondition(fieldValue, operator, expected, options
387
416
  return fieldLength > expectedLength;
388
417
  }
389
418
  case 'in':
390
- return Array.isArray(expected) && expected.includes(fieldValue);
419
+ if (!Array.isArray(expected))
420
+ return false;
421
+ if (typeof fieldValue === 'string') {
422
+ const lower = fieldValue.toLowerCase();
423
+ return expected.some((e) => typeof e === 'string' ? e.toLowerCase() === lower : e === fieldValue);
424
+ }
425
+ return expected.includes(fieldValue);
391
426
  case 'not_in':
392
- return Array.isArray(expected) && !expected.includes(fieldValue);
427
+ if (!Array.isArray(expected))
428
+ return false;
429
+ if (typeof fieldValue === 'string') {
430
+ const lower = fieldValue.toLowerCase();
431
+ return !expected.some((e) => typeof e === 'string' ? e.toLowerCase() === lower : e === fieldValue);
432
+ }
433
+ return !expected.includes(fieldValue);
393
434
  case 'within_hours': {
394
435
  const result = evaluateTimeWindow(fieldValue, expected);
395
436
  return result !== null && result.inScope && result.withinWindow;
@@ -425,7 +466,8 @@ export function evaluateCondition(condition, context, options = {}) {
425
466
  const resolvedReferenceValue = Number(referenceValue);
426
467
  if (Number.isNaN(resolvedFieldValue)
427
468
  || Number.isNaN(resolvedExpectedValue)
428
- || Number.isNaN(resolvedReferenceValue)) {
469
+ || Number.isNaN(resolvedReferenceValue)
470
+ || resolvedReferenceValue === 0) {
429
471
  return false;
430
472
  }
431
473
  return resolvedFieldValue > (resolvedReferenceValue * resolvedExpectedValue / 100);
@@ -434,7 +476,7 @@ export function evaluateCondition(condition, context, options = {}) {
434
476
  allowNestedObjectStringSearch: options.allowNestedObjectStringSearch,
435
477
  });
436
478
  }
437
- return true;
479
+ return false;
438
480
  }
439
481
  /**
440
482
  * Evaluate a rule-like condition collection: