@arcis/node 1.6.1 → 1.6.3
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/README.md +5 -3
- package/dist/_third_party/rate-limit/abstract.d.ts +36 -0
- package/dist/_third_party/rate-limit/abstract.d.ts.map +1 -0
- package/dist/_third_party/rate-limit/bursty.d.ts +21 -0
- package/dist/_third_party/rate-limit/bursty.d.ts.map +1 -0
- package/dist/_third_party/rate-limit/index.d.ts +12 -0
- package/dist/_third_party/rate-limit/index.d.ts.map +1 -0
- package/dist/_third_party/rate-limit/memory-storage.d.ts +28 -0
- package/dist/_third_party/rate-limit/memory-storage.d.ts.map +1 -0
- package/dist/_third_party/rate-limit/memory.d.ts +23 -0
- package/dist/_third_party/rate-limit/memory.d.ts.map +1 -0
- package/dist/_third_party/rate-limit/record.d.ts +11 -0
- package/dist/_third_party/rate-limit/record.d.ts.map +1 -0
- package/dist/_third_party/rate-limit/types.d.ts +39 -0
- package/dist/_third_party/rate-limit/types.d.ts.map +1 -0
- package/dist/astro/index.js +405 -0
- package/dist/astro/index.js.map +1 -1
- package/dist/astro/index.mjs +405 -0
- package/dist/astro/index.mjs.map +1 -1
- package/dist/bun/index.js +405 -0
- package/dist/bun/index.js.map +1 -1
- package/dist/bun/index.mjs +405 -0
- package/dist/bun/index.mjs.map +1 -1
- package/dist/fastify/index.js +405 -0
- package/dist/fastify/index.js.map +1 -1
- package/dist/fastify/index.mjs +405 -0
- package/dist/fastify/index.mjs.map +1 -1
- package/dist/hono/index.js +405 -0
- package/dist/hono/index.js.map +1 -1
- package/dist/hono/index.mjs +405 -0
- package/dist/hono/index.mjs.map +1 -1
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +754 -5
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +754 -6
- package/dist/index.mjs.map +1 -1
- package/dist/koa/index.js +405 -0
- package/dist/koa/index.js.map +1 -1
- package/dist/koa/index.mjs +405 -0
- package/dist/koa/index.mjs.map +1 -1
- package/dist/middleware/brute-force.d.ts +69 -0
- package/dist/middleware/brute-force.d.ts.map +1 -0
- package/dist/middleware/index.js +702 -1
- package/dist/middleware/index.js.map +1 -1
- package/dist/middleware/index.mjs +702 -1
- package/dist/middleware/index.mjs.map +1 -1
- package/dist/middleware/nestjs.d.ts +50 -1
- package/dist/middleware/nestjs.d.ts.map +1 -1
- package/dist/middleware/protect.d.ts +9 -0
- package/dist/middleware/protect.d.ts.map +1 -1
- package/dist/nestjs/index.js +57 -2
- package/dist/nestjs/index.js.map +1 -1
- package/dist/nestjs/index.mjs +57 -3
- package/dist/nestjs/index.mjs.map +1 -1
- package/dist/nextjs/index.js +405 -0
- package/dist/nextjs/index.js.map +1 -1
- package/dist/nextjs/index.mjs +405 -0
- package/dist/nextjs/index.mjs.map +1 -1
- package/dist/nuxt/index.js +405 -0
- package/dist/nuxt/index.js.map +1 -1
- package/dist/nuxt/index.mjs +405 -0
- package/dist/nuxt/index.mjs.map +1 -1
- package/dist/sanitizers/index.js +2 -1
- package/dist/sanitizers/index.js.map +1 -1
- package/dist/sanitizers/index.mjs +2 -1
- package/dist/sanitizers/index.mjs.map +1 -1
- package/dist/sanitizers/ldap.d.ts.map +1 -1
- package/dist/sanitizers/prompt-injection.d.ts +3 -3
- package/dist/sanitizers/prompt-injection.d.ts.map +1 -1
- package/dist/sveltekit/index.js +405 -0
- package/dist/sveltekit/index.js.map +1 -1
- package/dist/sveltekit/index.mjs +405 -0
- package/dist/sveltekit/index.mjs.map +1 -1
- package/package.json +2 -2
package/README.md
CHANGED
|
@@ -15,7 +15,9 @@ import { arcis } from '@arcis/node';
|
|
|
15
15
|
app.use(arcis({ block: true }));
|
|
16
16
|
```
|
|
17
17
|
|
|
18
|
-
|
|
18
|
+
What `arcis({ block: true })` actually wires into the request path: XSS, SQL injection, NoSQL injection, command injection, path traversal, prototype pollution, SSTI, XXE, LDAP injection, XPath injection, email-header injection. Plus rate limiting, security headers, and error scrubbing. Pattern matches return 403 before your handler runs.
|
|
19
|
+
|
|
20
|
+
Available as opt-in helpers (not auto-wired into `arcis()`): bot detection (695-pattern corpus, `botProtection()`), per-IP correlation window (`new CorrelationWindow(...)`), HPP guard (`hppProtection()`), CSRF (`csrfProtection()`), V32 toolcall-injection signatures (`detectPromptInjection`), V33 deserialization markers (`detectDeserialization`), V34 GraphQL alias bomb / fragment cycle (`graphqlGuard`), SSRF URL validation (`validateUrl`). Compose as needed.
|
|
19
21
|
|
|
20
22
|
**Docs**: [Quickstart](https://gagancm.github.io/arcis/documentation/getting-started.html) · [Detector reference](https://gagancm.github.io/arcis/documentation/detectors/) · [Framework adapters](https://gagancm.github.io/arcis/documentation/frameworks.html) · [Why Arcis](https://gagancm.github.io/arcis/documentation/why-arcis.html) · [Release notes](https://gagancm.github.io/arcis/documentation/release-notes.html)
|
|
21
23
|
|
|
@@ -52,7 +54,7 @@ That's it. XSS, SQL injection, NoSQL injection, command injection, path traversa
|
|
|
52
54
|
|
|
53
55
|
- **10 first-party framework adapters** — Express + Fastify (`@arcis/node/fastify`) + Koa (`@arcis/node/koa`) + Hono (`@arcis/node/hono`) + Next.js (`@arcis/node/nextjs`) + NestJS + SvelteKit + Astro + Nuxt + Bun. Each subpath import keeps the framework SDK as a type-only dependency.
|
|
54
56
|
- **9 new attack vectors**: GraphQL depth-bombs (`graphqlGuard`), LDAP / XPath / email-header injection wired into block-mode, mass assignment (`massAssign`), HTTP method tampering (`methodAllowlist`), response splitting (`responseSplittingGuard`), event-loop overload (`eventLoopProtection`), SSRF DNS TOCTOU (`validateUrlAsync` + `pinnedDnsLookup` + `safeFollowRedirect`).
|
|
55
|
-
- **AI-era protections**: 28-signature prompt-injection library (`detectPromptInjection`), per-key `tokenBudget` middleware,
|
|
57
|
+
- **AI-era protections**: 28-signature prompt-injection library (`detectPromptInjection`), per-key `tokenBudget` middleware, 695-pattern bot corpus.
|
|
56
58
|
- **Composite helpers**: `protectLogin`, `protectSignup`, `protectApi`.
|
|
57
59
|
- **Dry-run / `onSanitize` mode**: observe attack surface without enforcing.
|
|
58
60
|
- **Guards API**: `arcis.guard({ input, context })` for queue consumers + agent tool handlers.
|
|
@@ -184,7 +186,7 @@ app.use('*', async (c, next) => {
|
|
|
184
186
|
| CORS Misconfiguration | Whitelist-based origins, `null` origin blocked, `Vary: Origin` enforced |
|
|
185
187
|
| Cookie Security | HttpOnly, Secure, SameSite enforced on all cookies |
|
|
186
188
|
| Rate Limiting | Per-IP, sliding window, token bucket, in-memory or Redis, `X-RateLimit-*` headers |
|
|
187
|
-
| Bot Detection |
|
|
189
|
+
| Bot Detection | 695 patterns, 7 categories (crawlers, scrapers, AI bots, etc.), behavioral signals |
|
|
188
190
|
| Deserialization (v1.6) | `detectDeserialization()` flags Python pickle, Java FastJSON `@type`, PHP `unserialize`, Ruby Marshal, .NET BinaryFormatter payloads |
|
|
189
191
|
| GraphQL Abuse | `graphqlGuard` with `maxDepth`, `maxAliases`, `blockIntrospection`, `blockFragmentCycles` (v1.6) |
|
|
190
192
|
| Stateful Correlation (v1.6) | `CorrelationWindow` detects scanners, credential stuffing, race-window probes per IP |
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Abstract base for storage-backed rate limiters. Holds the `points` /
|
|
3
|
+
* `duration` / `blockDuration` / `execEvenly` configuration that any
|
|
4
|
+
* concrete limiter shares. Subclasses (`MemoryLimiter`, future Redis
|
|
5
|
+
* backend) implement `consume()` and friends.
|
|
6
|
+
*
|
|
7
|
+
* Ported to TypeScript from upstream RateLimiterAbstract. See
|
|
8
|
+
* `THIRDPARTY-LICENSES.md` for attribution.
|
|
9
|
+
*/
|
|
10
|
+
import type { LimiterOptions, LimiterConsumeOptions, IRateLimiterRes } from './types';
|
|
11
|
+
export declare abstract class AbstractLimiter {
|
|
12
|
+
protected _points: number;
|
|
13
|
+
protected _duration: number;
|
|
14
|
+
protected _blockDuration: number;
|
|
15
|
+
protected _execEvenly: boolean;
|
|
16
|
+
protected _execEvenlyMinDelayMs: number;
|
|
17
|
+
protected _keyPrefix: string;
|
|
18
|
+
constructor(opts: LimiterOptions);
|
|
19
|
+
get points(): number;
|
|
20
|
+
get duration(): number;
|
|
21
|
+
get msDuration(): number;
|
|
22
|
+
get blockDuration(): number;
|
|
23
|
+
get msBlockDuration(): number;
|
|
24
|
+
get execEvenly(): boolean;
|
|
25
|
+
get execEvenlyMinDelayMs(): number;
|
|
26
|
+
get keyPrefix(): string;
|
|
27
|
+
protected _getKeySecDuration(options?: LimiterConsumeOptions): number;
|
|
28
|
+
protected _getKey(key: string): string;
|
|
29
|
+
abstract consume(key: string, pointsToConsume?: number, options?: LimiterConsumeOptions): Promise<IRateLimiterRes>;
|
|
30
|
+
abstract penalty(key: string, points?: number, options?: LimiterConsumeOptions): Promise<IRateLimiterRes>;
|
|
31
|
+
abstract reward(key: string, points?: number, options?: LimiterConsumeOptions): Promise<IRateLimiterRes>;
|
|
32
|
+
abstract block(key: string, secDuration: number): Promise<IRateLimiterRes>;
|
|
33
|
+
abstract get(key: string): Promise<IRateLimiterRes | null>;
|
|
34
|
+
abstract delete(key: string): Promise<boolean>;
|
|
35
|
+
}
|
|
36
|
+
//# sourceMappingURL=abstract.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"abstract.d.ts","sourceRoot":"","sources":["../../../src/_third_party/rate-limit/abstract.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EAAE,cAAc,EAAE,qBAAqB,EAAE,eAAe,EAAE,MAAM,SAAS,CAAC;AAEtF,8BAAsB,eAAe;IACnC,SAAS,CAAC,OAAO,EAAE,MAAM,CAAC;IAC1B,SAAS,CAAC,SAAS,EAAE,MAAM,CAAC;IAC5B,SAAS,CAAC,cAAc,EAAE,MAAM,CAAC;IACjC,SAAS,CAAC,WAAW,EAAE,OAAO,CAAC;IAC/B,SAAS,CAAC,qBAAqB,EAAE,MAAM,CAAC;IACxC,SAAS,CAAC,UAAU,EAAE,MAAM,CAAC;gBAEjB,IAAI,EAAE,cAAc;IAwBhC,IAAI,MAAM,IAAI,MAAM,CAEnB;IACD,IAAI,QAAQ,IAAI,MAAM,CAErB;IACD,IAAI,UAAU,IAAI,MAAM,CAEvB;IACD,IAAI,aAAa,IAAI,MAAM,CAE1B;IACD,IAAI,eAAe,IAAI,MAAM,CAE5B;IACD,IAAI,UAAU,IAAI,OAAO,CAExB;IACD,IAAI,oBAAoB,IAAI,MAAM,CAEjC;IACD,IAAI,SAAS,IAAI,MAAM,CAEtB;IAED,SAAS,CAAC,kBAAkB,CAAC,OAAO,GAAE,qBAA0B,GAAG,MAAM;IAMzE,SAAS,CAAC,OAAO,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM;IAItC,QAAQ,CAAC,OAAO,CAAC,GAAG,EAAE,MAAM,EAAE,eAAe,CAAC,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,qBAAqB,GAAG,OAAO,CAAC,eAAe,CAAC;IAClH,QAAQ,CAAC,OAAO,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,qBAAqB,GAAG,OAAO,CAAC,eAAe,CAAC;IACzG,QAAQ,CAAC,MAAM,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,qBAAqB,GAAG,OAAO,CAAC,eAAe,CAAC;IACxG,QAAQ,CAAC,KAAK,CAAC,GAAG,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,CAAC;IAC1E,QAAQ,CAAC,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,GAAG,IAAI,CAAC;IAC1D,QAAQ,CAAC,MAAM,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;CAC/C"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Bursty rate limiter that wraps two underlying limiters. The first is the
|
|
3
|
+
* steady-state limiter; if it rejects, the bursty limiter is consulted
|
|
4
|
+
* to grant short-term burst capacity. Useful for "5 req/sec normally,
|
|
5
|
+
* but allow occasional bursts of up to 15 within 10 sec" patterns.
|
|
6
|
+
*
|
|
7
|
+
* Ported to TypeScript from upstream BurstyRateLimiter. See
|
|
8
|
+
* `THIRDPARTY-LICENSES.md` for attribution.
|
|
9
|
+
*/
|
|
10
|
+
import type { AbstractLimiter } from './abstract';
|
|
11
|
+
import { LimiterResult } from './types';
|
|
12
|
+
import type { IRateLimiterRes, LimiterConsumeOptions } from './types';
|
|
13
|
+
export declare class BurstyLimiter {
|
|
14
|
+
private readonly _steady;
|
|
15
|
+
private readonly _burst;
|
|
16
|
+
constructor(_steady: AbstractLimiter, _burst: AbstractLimiter);
|
|
17
|
+
consume(key: string, pointsToConsume?: number, options?: LimiterConsumeOptions): Promise<IRateLimiterRes>;
|
|
18
|
+
get(key: string): Promise<LimiterResult | null>;
|
|
19
|
+
get points(): number;
|
|
20
|
+
}
|
|
21
|
+
//# sourceMappingURL=bursty.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bursty.d.ts","sourceRoot":"","sources":["../../../src/_third_party/rate-limit/bursty.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAClD,OAAO,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AACxC,OAAO,KAAK,EAAE,eAAe,EAAE,qBAAqB,EAAE,MAAM,SAAS,CAAC;AAWtE,qBAAa,aAAa;IAEtB,OAAO,CAAC,QAAQ,CAAC,OAAO;IACxB,OAAO,CAAC,QAAQ,CAAC,MAAM;gBADN,OAAO,EAAE,eAAe,EACxB,MAAM,EAAE,eAAe;IAG1C,OAAO,CACL,GAAG,EAAE,MAAM,EACX,eAAe,GAAE,MAAU,EAC3B,OAAO,GAAE,qBAA0B,GAClC,OAAO,CAAC,eAAe,CAAC;IAiB3B,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,GAAG,IAAI,CAAC;IAM/C,IAAI,MAAM,IAAI,MAAM,CAEnB;CACF"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Internal limiter primitives. Not part of the public Arcis API. These
|
|
3
|
+
* are wired into `middleware/brute-force.ts` and the protect helpers.
|
|
4
|
+
*
|
|
5
|
+
* Upstream attribution lives in `THIRDPARTY-LICENSES.md` (Source E:
|
|
6
|
+
* animir/node-rate-limiter-flexible, ISC).
|
|
7
|
+
*/
|
|
8
|
+
export { MemoryLimiter } from './memory';
|
|
9
|
+
export { BurstyLimiter } from './bursty';
|
|
10
|
+
export { LimiterResult } from './types';
|
|
11
|
+
export type { IRateLimiterRes, LimiterOptions, LimiterConsumeOptions, } from './types';
|
|
12
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/_third_party/rate-limit/index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AACxC,YAAY,EACV,eAAe,EACf,cAAc,EACd,qBAAqB,GACtB,MAAM,SAAS,CAAC"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* In-memory storage backend for the rate limiter. Tracks integer counters
|
|
3
|
+
* per key with optional TTL expiry. Ported to TypeScript from the upstream
|
|
4
|
+
* MemoryStorage class. See `THIRDPARTY-LICENSES.md` for attribution.
|
|
5
|
+
*/
|
|
6
|
+
import { LimiterResult } from './types';
|
|
7
|
+
import { StorageRecord } from './record';
|
|
8
|
+
export declare class MemoryStorage {
|
|
9
|
+
private _storage;
|
|
10
|
+
/**
|
|
11
|
+
* Increment the counter for `key` by `value`. If the key has no record
|
|
12
|
+
* (or its TTL has expired), a new record is created with `durationSec`
|
|
13
|
+
* lifetime.
|
|
14
|
+
*/
|
|
15
|
+
incrby(key: string, value: number, durationSec: number): LimiterResult;
|
|
16
|
+
/**
|
|
17
|
+
* Write the counter for `key` to `value`, replacing any existing
|
|
18
|
+
* record. `durationSec` of 0 means "never expires".
|
|
19
|
+
*/
|
|
20
|
+
set(key: string, value: number, durationSec: number): LimiterResult;
|
|
21
|
+
get(key: string): LimiterResult | null;
|
|
22
|
+
delete(key: string): boolean;
|
|
23
|
+
/** Inspect the underlying map. Test-only and not part of the public API. */
|
|
24
|
+
_dump(): IterableIterator<[string, StorageRecord]>;
|
|
25
|
+
/** Clear all records. Used by tests and by `Limiter.dispose()`. */
|
|
26
|
+
clear(): void;
|
|
27
|
+
}
|
|
28
|
+
//# sourceMappingURL=memory-storage.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"memory-storage.d.ts","sourceRoot":"","sources":["../../../src/_third_party/rate-limit/memory-storage.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AACxC,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAEzC,qBAAa,aAAa;IACxB,OAAO,CAAC,QAAQ,CAAyC;IAEzD;;;;OAIG;IACH,MAAM,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,aAAa;IAatE;;;OAGG;IACH,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,aAAa;IAsBnE,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,aAAa,GAAG,IAAI;IAOtC,MAAM,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO;IAU5B,4EAA4E;IAC5E,KAAK,IAAI,gBAAgB,CAAC,CAAC,MAAM,EAAE,aAAa,CAAC,CAAC;IAIlD,mEAAmE;IACnE,KAAK,IAAI,IAAI;CAMd"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* In-memory rate limiter backed by `MemoryStorage`. Implements the
|
|
3
|
+
* `consume()` / `penalty()` / `reward()` / `block()` / `get()` /
|
|
4
|
+
* `delete()` surface from the upstream limiter library.
|
|
5
|
+
*
|
|
6
|
+
* Ported to TypeScript from RateLimiterMemory. See
|
|
7
|
+
* `THIRDPARTY-LICENSES.md` for attribution.
|
|
8
|
+
*/
|
|
9
|
+
import { AbstractLimiter } from './abstract';
|
|
10
|
+
import type { LimiterOptions, LimiterConsumeOptions, IRateLimiterRes } from './types';
|
|
11
|
+
export declare class MemoryLimiter extends AbstractLimiter {
|
|
12
|
+
private _storage;
|
|
13
|
+
constructor(opts: LimiterOptions);
|
|
14
|
+
consume(key: string, pointsToConsume?: number, options?: LimiterConsumeOptions): Promise<IRateLimiterRes>;
|
|
15
|
+
penalty(key: string, points?: number, options?: LimiterConsumeOptions): Promise<IRateLimiterRes>;
|
|
16
|
+
reward(key: string, points?: number, options?: LimiterConsumeOptions): Promise<IRateLimiterRes>;
|
|
17
|
+
block(key: string, secDuration: number): Promise<IRateLimiterRes>;
|
|
18
|
+
get(key: string): Promise<IRateLimiterRes | null>;
|
|
19
|
+
delete(key: string): Promise<boolean>;
|
|
20
|
+
/** Test/teardown helper. Drops every key and clears timers. */
|
|
21
|
+
dispose(): void;
|
|
22
|
+
}
|
|
23
|
+
//# sourceMappingURL=memory.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"memory.d.ts","sourceRoot":"","sources":["../../../src/_third_party/rate-limit/memory.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAG7C,OAAO,KAAK,EAAE,cAAc,EAAE,qBAAqB,EAAE,eAAe,EAAE,MAAM,SAAS,CAAC;AAEtF,qBAAa,aAAc,SAAQ,eAAe;IAChD,OAAO,CAAC,QAAQ,CAAgB;gBAEpB,IAAI,EAAE,cAAc;IAKhC,OAAO,CAAC,GAAG,EAAE,MAAM,EAAE,eAAe,GAAE,MAAU,EAAE,OAAO,GAAE,qBAA0B,GAAG,OAAO,CAAC,eAAe,CAAC;IAgChH,OAAO,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,GAAE,MAAU,EAAE,OAAO,GAAE,qBAA0B,GAAG,OAAO,CAAC,eAAe,CAAC;IAQvG,MAAM,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,GAAE,MAAU,EAAE,OAAO,GAAE,qBAA0B,GAAG,OAAO,CAAC,eAAe,CAAC;IAQtG,KAAK,CAAC,GAAG,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,CAAC;IAOjE,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,GAAG,IAAI,CAAC;IAQjD,MAAM,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAIrC,+DAA+D;IAC/D,OAAO,IAAI,IAAI;CAGhB"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Internal record stored inside the in-memory storage map. One per key.
|
|
3
|
+
* See `THIRDPARTY-LICENSES.md` for upstream attribution.
|
|
4
|
+
*/
|
|
5
|
+
export declare class StorageRecord {
|
|
6
|
+
value: number;
|
|
7
|
+
expiresAt: number | null;
|
|
8
|
+
timeoutId: ReturnType<typeof setTimeout> | null;
|
|
9
|
+
constructor(value: number, expiresAt: number | null, timeoutId?: ReturnType<typeof setTimeout> | null);
|
|
10
|
+
}
|
|
11
|
+
//# sourceMappingURL=record.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"record.d.ts","sourceRoot":"","sources":["../../../src/_third_party/rate-limit/record.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,qBAAa,aAAa;IACxB,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,SAAS,EAAE,UAAU,CAAC,OAAO,UAAU,CAAC,GAAG,IAAI,CAAC;gBAEpC,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,IAAI,EAAE,SAAS,GAAE,UAAU,CAAC,OAAO,UAAU,CAAC,GAAG,IAAW;CAK5G"}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Rate-limiter response object. The shape returned (or rejected with) by
|
|
3
|
+
* every limiter call. Mirrors the upstream `RateLimiterRes` contract.
|
|
4
|
+
*
|
|
5
|
+
* See `THIRDPARTY-LICENSES.md` for upstream attribution. This file is
|
|
6
|
+
* an internal TypeScript port; do not re-export the class name verbatim.
|
|
7
|
+
*/
|
|
8
|
+
export interface IRateLimiterRes {
|
|
9
|
+
remainingPoints: number;
|
|
10
|
+
msBeforeNext: number;
|
|
11
|
+
consumedPoints: number;
|
|
12
|
+
isFirstInDuration: boolean;
|
|
13
|
+
}
|
|
14
|
+
export declare class LimiterResult implements IRateLimiterRes {
|
|
15
|
+
remainingPoints: number;
|
|
16
|
+
msBeforeNext: number;
|
|
17
|
+
consumedPoints: number;
|
|
18
|
+
isFirstInDuration: boolean;
|
|
19
|
+
constructor(remainingPoints?: number, msBeforeNext?: number, consumedPoints?: number, isFirstInDuration?: boolean);
|
|
20
|
+
}
|
|
21
|
+
export interface LimiterOptions {
|
|
22
|
+
/** Total points available per duration window. */
|
|
23
|
+
points: number;
|
|
24
|
+
/** Window length in seconds. 0 = never expires. */
|
|
25
|
+
duration: number;
|
|
26
|
+
/** Seconds to block a key after it consumed more than `points`. 0 = no block. */
|
|
27
|
+
blockDuration?: number;
|
|
28
|
+
/** Spread allowed actions evenly across the window via setTimeout delays. */
|
|
29
|
+
execEvenly?: boolean;
|
|
30
|
+
/** Floor on the per-call delay introduced by `execEvenly`. */
|
|
31
|
+
execEvenlyMinDelayMs?: number;
|
|
32
|
+
/** Namespace prefix for keys inside the underlying storage. */
|
|
33
|
+
keyPrefix?: string;
|
|
34
|
+
}
|
|
35
|
+
export interface LimiterConsumeOptions {
|
|
36
|
+
/** Override the configured duration for this call only (seconds). */
|
|
37
|
+
customDuration?: number;
|
|
38
|
+
}
|
|
39
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/_third_party/rate-limit/types.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,MAAM,WAAW,eAAe;IAC9B,eAAe,EAAE,MAAM,CAAC;IACxB,YAAY,EAAE,MAAM,CAAC;IACrB,cAAc,EAAE,MAAM,CAAC;IACvB,iBAAiB,EAAE,OAAO,CAAC;CAC5B;AAED,qBAAa,aAAc,YAAW,eAAe;IACnD,eAAe,EAAE,MAAM,CAAC;IACxB,YAAY,EAAE,MAAM,CAAC;IACrB,cAAc,EAAE,MAAM,CAAC;IACvB,iBAAiB,EAAE,OAAO,CAAC;gBAGzB,eAAe,GAAE,MAAU,EAC3B,YAAY,GAAE,MAAU,EACxB,cAAc,GAAE,MAAU,EAC1B,iBAAiB,GAAE,OAAe;CAOrC;AAED,MAAM,WAAW,cAAc;IAC7B,kDAAkD;IAClD,MAAM,EAAE,MAAM,CAAC;IACf,mDAAmD;IACnD,QAAQ,EAAE,MAAM,CAAC;IACjB,iFAAiF;IACjF,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,6EAA6E;IAC7E,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,8DAA8D;IAC9D,oBAAoB,CAAC,EAAE,MAAM,CAAC;IAC9B,+DAA+D;IAC/D,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,qBAAqB;IACpC,qEAAqE;IACrE,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB"}
|
package/dist/astro/index.js
CHANGED
|
@@ -5895,6 +5895,411 @@ var bot_patterns_default = [
|
|
|
5895
5895
|
"ZuperlistBot\\/"
|
|
5896
5896
|
],
|
|
5897
5897
|
forbidden: []
|
|
5898
|
+
},
|
|
5899
|
+
{
|
|
5900
|
+
id: "ext-ahrefsbotsiteaudit",
|
|
5901
|
+
name: "ahrefsbotsiteaudit",
|
|
5902
|
+
category: "SEO",
|
|
5903
|
+
patterns: [
|
|
5904
|
+
"Ahrefs(Bot|SiteAudit)"
|
|
5905
|
+
],
|
|
5906
|
+
forbidden: []
|
|
5907
|
+
},
|
|
5908
|
+
{
|
|
5909
|
+
id: "ext-amazonproductdiscovery",
|
|
5910
|
+
name: "amazonproductdiscovery",
|
|
5911
|
+
category: "SEARCH_ENGINE",
|
|
5912
|
+
patterns: [
|
|
5913
|
+
"AmazonProductDiscovery"
|
|
5914
|
+
],
|
|
5915
|
+
forbidden: []
|
|
5916
|
+
},
|
|
5917
|
+
{
|
|
5918
|
+
id: "ext-amazonsellerinitiatedlisting",
|
|
5919
|
+
name: "amazonsellerinitiatedlisting",
|
|
5920
|
+
category: "SEARCH_ENGINE",
|
|
5921
|
+
patterns: [
|
|
5922
|
+
"AmazonSellerInitiatedListing"
|
|
5923
|
+
],
|
|
5924
|
+
forbidden: []
|
|
5925
|
+
},
|
|
5926
|
+
{
|
|
5927
|
+
id: "ext-cclaudebbot",
|
|
5928
|
+
name: "cclaudebbot",
|
|
5929
|
+
category: "GENERIC",
|
|
5930
|
+
patterns: [
|
|
5931
|
+
"[cC]laude[bB]ot"
|
|
5932
|
+
],
|
|
5933
|
+
forbidden: []
|
|
5934
|
+
},
|
|
5935
|
+
{
|
|
5936
|
+
id: "ext-meta-externalagent",
|
|
5937
|
+
name: "meta-externalagent",
|
|
5938
|
+
category: "GENERIC",
|
|
5939
|
+
patterns: [
|
|
5940
|
+
"meta-externalagent\\/"
|
|
5941
|
+
],
|
|
5942
|
+
forbidden: []
|
|
5943
|
+
},
|
|
5944
|
+
{
|
|
5945
|
+
id: "ext-meta-externalfetcher",
|
|
5946
|
+
name: "meta-externalfetcher",
|
|
5947
|
+
category: "GENERIC",
|
|
5948
|
+
patterns: [
|
|
5949
|
+
"meta-externalfetcher\\/"
|
|
5950
|
+
],
|
|
5951
|
+
forbidden: []
|
|
5952
|
+
},
|
|
5953
|
+
{
|
|
5954
|
+
id: "ext-hydrozenio",
|
|
5955
|
+
name: "hydrozenio",
|
|
5956
|
+
category: "MONITORING",
|
|
5957
|
+
patterns: [
|
|
5958
|
+
"Hydrozen\\.io"
|
|
5959
|
+
],
|
|
5960
|
+
forbidden: []
|
|
5961
|
+
},
|
|
5962
|
+
{
|
|
5963
|
+
id: "ext-yextbot",
|
|
5964
|
+
name: "yextbot",
|
|
5965
|
+
category: "SEO",
|
|
5966
|
+
patterns: [
|
|
5967
|
+
"YextBot\\/"
|
|
5968
|
+
],
|
|
5969
|
+
forbidden: []
|
|
5970
|
+
},
|
|
5971
|
+
{
|
|
5972
|
+
id: "ext-datadogsynthetics",
|
|
5973
|
+
name: "datadogsynthetics",
|
|
5974
|
+
category: "MONITORING",
|
|
5975
|
+
patterns: [
|
|
5976
|
+
"DatadogSynthetics"
|
|
5977
|
+
],
|
|
5978
|
+
forbidden: []
|
|
5979
|
+
},
|
|
5980
|
+
{
|
|
5981
|
+
id: "ext-observepoint",
|
|
5982
|
+
name: "observepoint",
|
|
5983
|
+
category: "MONITORING",
|
|
5984
|
+
patterns: [
|
|
5985
|
+
"ObservePoint"
|
|
5986
|
+
],
|
|
5987
|
+
forbidden: []
|
|
5988
|
+
},
|
|
5989
|
+
{
|
|
5990
|
+
id: "ext-checkly",
|
|
5991
|
+
name: "checkly",
|
|
5992
|
+
category: "MONITORING",
|
|
5993
|
+
patterns: [
|
|
5994
|
+
"Checkly"
|
|
5995
|
+
],
|
|
5996
|
+
forbidden: []
|
|
5997
|
+
},
|
|
5998
|
+
{
|
|
5999
|
+
id: "ext-alittleclient",
|
|
6000
|
+
name: "alittleclient",
|
|
6001
|
+
category: "GENERIC",
|
|
6002
|
+
patterns: [
|
|
6003
|
+
"ALittle Client"
|
|
6004
|
+
],
|
|
6005
|
+
forbidden: []
|
|
6006
|
+
},
|
|
6007
|
+
{
|
|
6008
|
+
id: "ext-aliyunsecbot",
|
|
6009
|
+
name: "aliyunsecbot",
|
|
6010
|
+
category: "GENERIC",
|
|
6011
|
+
patterns: [
|
|
6012
|
+
"AliyunSecBot"
|
|
6013
|
+
],
|
|
6014
|
+
forbidden: []
|
|
6015
|
+
},
|
|
6016
|
+
{
|
|
6017
|
+
id: "ext-claude-web",
|
|
6018
|
+
name: "claude-web",
|
|
6019
|
+
category: "GENERIC",
|
|
6020
|
+
patterns: [
|
|
6021
|
+
"Claude-Web"
|
|
6022
|
+
],
|
|
6023
|
+
forbidden: []
|
|
6024
|
+
},
|
|
6025
|
+
{
|
|
6026
|
+
id: "ext-google-extended",
|
|
6027
|
+
name: "google-extended",
|
|
6028
|
+
category: "GENERIC",
|
|
6029
|
+
patterns: [
|
|
6030
|
+
"Google-Extended"
|
|
6031
|
+
],
|
|
6032
|
+
forbidden: []
|
|
6033
|
+
},
|
|
6034
|
+
{
|
|
6035
|
+
id: "ext-serankingbacklinksbot",
|
|
6036
|
+
name: "serankingbacklinksbot",
|
|
6037
|
+
category: "SEO",
|
|
6038
|
+
patterns: [
|
|
6039
|
+
"SERankingBacklinksBot"
|
|
6040
|
+
],
|
|
6041
|
+
forbidden: []
|
|
6042
|
+
},
|
|
6043
|
+
{
|
|
6044
|
+
id: "ext-cmschecker",
|
|
6045
|
+
name: "cmschecker",
|
|
6046
|
+
category: "SEO",
|
|
6047
|
+
patterns: [
|
|
6048
|
+
"CMSChecker"
|
|
6049
|
+
],
|
|
6050
|
+
forbidden: []
|
|
6051
|
+
},
|
|
6052
|
+
{
|
|
6053
|
+
id: "ext-wayback",
|
|
6054
|
+
name: "wayback",
|
|
6055
|
+
category: "GENERIC",
|
|
6056
|
+
patterns: [
|
|
6057
|
+
"Wayback"
|
|
6058
|
+
],
|
|
6059
|
+
forbidden: []
|
|
6060
|
+
},
|
|
6061
|
+
{
|
|
6062
|
+
id: "ext-playwright",
|
|
6063
|
+
name: "playwright",
|
|
6064
|
+
category: "GENERIC",
|
|
6065
|
+
patterns: [
|
|
6066
|
+
"Playwright"
|
|
6067
|
+
],
|
|
6068
|
+
forbidden: []
|
|
6069
|
+
},
|
|
6070
|
+
{
|
|
6071
|
+
id: "ext-puppeteer",
|
|
6072
|
+
name: "puppeteer",
|
|
6073
|
+
category: "GENERIC",
|
|
6074
|
+
patterns: [
|
|
6075
|
+
"Puppeteer"
|
|
6076
|
+
],
|
|
6077
|
+
forbidden: []
|
|
6078
|
+
},
|
|
6079
|
+
{
|
|
6080
|
+
id: "ext-selenium",
|
|
6081
|
+
name: "selenium",
|
|
6082
|
+
category: "GENERIC",
|
|
6083
|
+
patterns: [
|
|
6084
|
+
"Selenium"
|
|
6085
|
+
],
|
|
6086
|
+
forbidden: []
|
|
6087
|
+
},
|
|
6088
|
+
{
|
|
6089
|
+
id: "ext-nikto",
|
|
6090
|
+
name: "nikto",
|
|
6091
|
+
category: "GENERIC",
|
|
6092
|
+
patterns: [
|
|
6093
|
+
"Nikto"
|
|
6094
|
+
],
|
|
6095
|
+
forbidden: []
|
|
6096
|
+
},
|
|
6097
|
+
{
|
|
6098
|
+
id: "ext-sqlmap",
|
|
6099
|
+
name: "sqlmap",
|
|
6100
|
+
category: "GENERIC",
|
|
6101
|
+
patterns: [
|
|
6102
|
+
"sqlmap"
|
|
6103
|
+
],
|
|
6104
|
+
forbidden: []
|
|
6105
|
+
},
|
|
6106
|
+
{
|
|
6107
|
+
id: "ext-zmeu",
|
|
6108
|
+
name: "zmeu",
|
|
6109
|
+
category: "GENERIC",
|
|
6110
|
+
patterns: [
|
|
6111
|
+
"ZmEu"
|
|
6112
|
+
],
|
|
6113
|
+
forbidden: []
|
|
6114
|
+
},
|
|
6115
|
+
{
|
|
6116
|
+
id: "ext-masscan",
|
|
6117
|
+
name: "masscan",
|
|
6118
|
+
category: "GENERIC",
|
|
6119
|
+
patterns: [
|
|
6120
|
+
"masscan"
|
|
6121
|
+
],
|
|
6122
|
+
forbidden: []
|
|
6123
|
+
},
|
|
6124
|
+
{
|
|
6125
|
+
id: "ext-wpscan",
|
|
6126
|
+
name: "wpscan",
|
|
6127
|
+
category: "GENERIC",
|
|
6128
|
+
patterns: [
|
|
6129
|
+
"WPScan"
|
|
6130
|
+
],
|
|
6131
|
+
forbidden: []
|
|
6132
|
+
},
|
|
6133
|
+
{
|
|
6134
|
+
id: "ext-aacunetix",
|
|
6135
|
+
name: "aacunetix",
|
|
6136
|
+
category: "GENERIC",
|
|
6137
|
+
patterns: [
|
|
6138
|
+
"[aA]cunetix"
|
|
6139
|
+
],
|
|
6140
|
+
forbidden: []
|
|
6141
|
+
},
|
|
6142
|
+
{
|
|
6143
|
+
id: "ext-nessus",
|
|
6144
|
+
name: "nessus",
|
|
6145
|
+
category: "GENERIC",
|
|
6146
|
+
patterns: [
|
|
6147
|
+
"Nessus"
|
|
6148
|
+
],
|
|
6149
|
+
forbidden: []
|
|
6150
|
+
},
|
|
6151
|
+
{
|
|
6152
|
+
id: "ext-ddirbbuster",
|
|
6153
|
+
name: "ddirbbuster",
|
|
6154
|
+
category: "GENERIC",
|
|
6155
|
+
patterns: [
|
|
6156
|
+
"[dD]ir[Bb]uster"
|
|
6157
|
+
],
|
|
6158
|
+
forbidden: []
|
|
6159
|
+
},
|
|
6160
|
+
{
|
|
6161
|
+
id: "ext-colly",
|
|
6162
|
+
name: "colly",
|
|
6163
|
+
category: "GENERIC",
|
|
6164
|
+
patterns: [
|
|
6165
|
+
"colly"
|
|
6166
|
+
],
|
|
6167
|
+
forbidden: []
|
|
6168
|
+
},
|
|
6169
|
+
{
|
|
6170
|
+
id: "ext-mmechanize",
|
|
6171
|
+
name: "mmechanize",
|
|
6172
|
+
category: "GENERIC",
|
|
6173
|
+
patterns: [
|
|
6174
|
+
"[mM]echanize"
|
|
6175
|
+
],
|
|
6176
|
+
forbidden: []
|
|
6177
|
+
},
|
|
6178
|
+
{
|
|
6179
|
+
id: "ext-airaiscanning",
|
|
6180
|
+
name: "airaiscanning",
|
|
6181
|
+
category: "GENERIC",
|
|
6182
|
+
patterns: [
|
|
6183
|
+
"air\\.ai\\/scanning"
|
|
6184
|
+
],
|
|
6185
|
+
forbidden: []
|
|
6186
|
+
},
|
|
6187
|
+
{
|
|
6188
|
+
id: "ext-asnriskscorer",
|
|
6189
|
+
name: "asnriskscorer",
|
|
6190
|
+
category: "GENERIC",
|
|
6191
|
+
patterns: [
|
|
6192
|
+
"asnriskscorer"
|
|
6193
|
+
],
|
|
6194
|
+
forbidden: []
|
|
6195
|
+
},
|
|
6196
|
+
{
|
|
6197
|
+
id: "ext-oicrawler",
|
|
6198
|
+
name: "oicrawler",
|
|
6199
|
+
category: "SEARCH_ENGINE",
|
|
6200
|
+
patterns: [
|
|
6201
|
+
"OICrawler"
|
|
6202
|
+
],
|
|
6203
|
+
forbidden: []
|
|
6204
|
+
},
|
|
6205
|
+
{
|
|
6206
|
+
id: "ext-l9scan",
|
|
6207
|
+
name: "l9scan",
|
|
6208
|
+
category: "GENERIC",
|
|
6209
|
+
patterns: [
|
|
6210
|
+
"l9scan"
|
|
6211
|
+
],
|
|
6212
|
+
forbidden: []
|
|
6213
|
+
},
|
|
6214
|
+
{
|
|
6215
|
+
id: "ext-slaccalebot",
|
|
6216
|
+
name: "slaccalebot",
|
|
6217
|
+
category: "SEO",
|
|
6218
|
+
patterns: [
|
|
6219
|
+
"SlaccaleBot"
|
|
6220
|
+
],
|
|
6221
|
+
forbidden: []
|
|
6222
|
+
},
|
|
6223
|
+
{
|
|
6224
|
+
id: "ext-customasynchttpclient",
|
|
6225
|
+
name: "customasynchttpclient",
|
|
6226
|
+
category: "GENERIC",
|
|
6227
|
+
patterns: [
|
|
6228
|
+
"CustomAsyncHttpClient"
|
|
6229
|
+
],
|
|
6230
|
+
forbidden: []
|
|
6231
|
+
},
|
|
6232
|
+
{
|
|
6233
|
+
id: "ext-gemini-deep-research",
|
|
6234
|
+
name: "gemini-deep-research",
|
|
6235
|
+
category: "SEARCH_ENGINE",
|
|
6236
|
+
patterns: [
|
|
6237
|
+
"Gemini-Deep-Research"
|
|
6238
|
+
],
|
|
6239
|
+
forbidden: []
|
|
6240
|
+
},
|
|
6241
|
+
{
|
|
6242
|
+
id: "ext-perplexity-user",
|
|
6243
|
+
name: "perplexity-user",
|
|
6244
|
+
category: "SEARCH_ENGINE",
|
|
6245
|
+
patterns: [
|
|
6246
|
+
"Perplexity-User"
|
|
6247
|
+
],
|
|
6248
|
+
forbidden: []
|
|
6249
|
+
},
|
|
6250
|
+
{
|
|
6251
|
+
id: "ext-perplexityuser",
|
|
6252
|
+
name: "perplexityuser",
|
|
6253
|
+
category: "SEARCH_ENGINE",
|
|
6254
|
+
patterns: [
|
|
6255
|
+
"PerplexityUser"
|
|
6256
|
+
],
|
|
6257
|
+
forbidden: []
|
|
6258
|
+
},
|
|
6259
|
+
{
|
|
6260
|
+
id: "ext-meta-webindexer",
|
|
6261
|
+
name: "meta-webindexer",
|
|
6262
|
+
category: "GENERIC",
|
|
6263
|
+
patterns: [
|
|
6264
|
+
"meta-webindexer"
|
|
6265
|
+
],
|
|
6266
|
+
forbidden: []
|
|
6267
|
+
},
|
|
6268
|
+
{
|
|
6269
|
+
id: "ext-duckassistbot",
|
|
6270
|
+
name: "duckassistbot",
|
|
6271
|
+
category: "SEARCH_ENGINE",
|
|
6272
|
+
patterns: [
|
|
6273
|
+
"DuckAssistBot"
|
|
6274
|
+
],
|
|
6275
|
+
forbidden: []
|
|
6276
|
+
},
|
|
6277
|
+
{
|
|
6278
|
+
id: "ext-mistralai-user",
|
|
6279
|
+
name: "mistralai-user",
|
|
6280
|
+
category: "GENERIC",
|
|
6281
|
+
patterns: [
|
|
6282
|
+
"MistralAI-User"
|
|
6283
|
+
],
|
|
6284
|
+
forbidden: []
|
|
6285
|
+
},
|
|
6286
|
+
{
|
|
6287
|
+
id: "ext-webzio",
|
|
6288
|
+
name: "webzio",
|
|
6289
|
+
category: "SEO",
|
|
6290
|
+
patterns: [
|
|
6291
|
+
"webzio"
|
|
6292
|
+
],
|
|
6293
|
+
forbidden: []
|
|
6294
|
+
},
|
|
6295
|
+
{
|
|
6296
|
+
id: "ext-newsai",
|
|
6297
|
+
name: "newsai",
|
|
6298
|
+
category: "GENERIC",
|
|
6299
|
+
patterns: [
|
|
6300
|
+
"newsai\\/"
|
|
6301
|
+
],
|
|
6302
|
+
forbidden: []
|
|
5898
6303
|
}
|
|
5899
6304
|
];
|
|
5900
6305
|
|