@devtune/ai-traffic 0.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.
package/README.md ADDED
@@ -0,0 +1,88 @@
1
+ # @devtune/ai-traffic
2
+
3
+ `@devtune/ai-traffic` is the filtered edge-push sensor for DevTune AI Traffic. It matches incoming requests against DevTune's AI bot registry and forwards only matching machine hits to DevTune's ingest endpoint.
4
+
5
+ Cloudflare-proxied sites should prefer the Cloudflare pull integration when available. For Vercel and self-hosted sites, this package keeps volume low by filtering at your edge instead of shipping full request logs.
6
+
7
+ ## Install
8
+
9
+ ```bash
10
+ pnpm add @devtune/ai-traffic
11
+ ```
12
+
13
+ Set your project-scoped server-side ingest key:
14
+
15
+ ```bash
16
+ DEVTUNE_AI_TRAFFIC_INGEST_KEY=dt_ingest_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
17
+ ```
18
+
19
+ ## Next.js Middleware
20
+
21
+ ```ts
22
+ // middleware.ts
23
+ import { createDevTuneAiTrafficMiddleware } from "@devtune/ai-traffic";
24
+ import { NextResponse, type NextFetchEvent, type NextRequest } from "next/server";
25
+
26
+ const trackAiTraffic = createDevTuneAiTrafficMiddleware({
27
+ ingestKey: process.env.DEVTUNE_AI_TRAFFIC_INGEST_KEY!,
28
+ });
29
+
30
+ export function middleware(request: NextRequest, event: NextFetchEvent) {
31
+ trackAiTraffic(request, event);
32
+
33
+ return NextResponse.next();
34
+ }
35
+ ```
36
+
37
+ The middleware helper does not import `next/server`; it uses the standard request shape and the `waitUntil` method that Next.js passes to middleware.
38
+
39
+ ## Route Handler Status Capture
40
+
41
+ Next.js middleware cannot observe the final page response status. The middleware helper reports `200` unless you provide `statusResolver` or `notFoundPathPatterns`.
42
+
43
+ Use the route wrapper where you own the handler response and need exact status capture:
44
+
45
+ ```ts
46
+ // app/api/example/route.ts
47
+ import { withDevTuneAiTrafficRoute } from "@devtune/ai-traffic";
48
+
49
+ export const GET = withDevTuneAiTrafficRoute(
50
+ async function GET() {
51
+ return Response.json({ ok: true }, { status: 200 });
52
+ },
53
+ {
54
+ ingestKey: process.env.DEVTUNE_AI_TRAFFIC_INGEST_KEY!,
55
+ },
56
+ );
57
+ ```
58
+
59
+ For known misses in middleware, mark them explicitly:
60
+
61
+ ```ts
62
+ const trackAiTraffic = createDevTuneAiTrafficMiddleware({
63
+ ingestKey: process.env.DEVTUNE_AI_TRAFFIC_INGEST_KEY!,
64
+ notFoundPathPatterns: [/^\/docs\/removed\//],
65
+ });
66
+ ```
67
+
68
+ ## What Gets Sent
69
+
70
+ For matched AI bot requests only, the package sends:
71
+
72
+ - `path`
73
+ - `url`
74
+ - `ua`
75
+ - `status`
76
+ - `ts`
77
+
78
+ It sends the batch to `https://devtune.ai/api/v1/llm-traffic/ingest` with `Authorization: Bearer <ingest key>`. It does not send cookies, request bodies, query-derived user identifiers, IP addresses, headers other than the user agent, or DevTune's client-side snippet key.
79
+
80
+ ## Registry Cache
81
+
82
+ The package fetches `https://devtune.ai/api/v1/llm-traffic/registry`, caches the active registry for about an hour, and uses `ETag` revalidation. If the registry cannot be fetched, it falls back to a bundled snapshot so known AI bots still match.
83
+
84
+ User-agent matching is a v1 signal. Some agents spoof ordinary browsers or need ASN/TLS hints, so counts are floors rather than exact bot truth. Cloudflare pull should be used when available because Cloudflare can combine request, bot-score, and network-level signals.
85
+
86
+ ## Vercel Pull Status
87
+
88
+ Vercel Observability exposes bot and AI-crawler insights in the dashboard query builder, but the public Observability REST API currently covers Observability Plus project settings rather than event reads. Until Vercel ships a supported Observability read/query API, this middleware is the Vercel path.
@@ -0,0 +1,83 @@
1
+ /**
2
+ * ABOUTME: Implements the DevTune AI Traffic edge-push client.
3
+ * Handles registry refresh, AI bot matching, batched ingest beacons, and route wrappers.
4
+ */
5
+ import { type AiBotRegistryEntry } from "./registry.js";
6
+ export interface HeadersLike {
7
+ get(name: string): string | null;
8
+ }
9
+ export interface RequestLike {
10
+ headers: HeadersLike;
11
+ url: string;
12
+ }
13
+ export interface WaitUntilLike {
14
+ waitUntil(promise: Promise<unknown>): void;
15
+ }
16
+ export interface DevTuneAiTrafficEvent {
17
+ path: string;
18
+ url?: string;
19
+ ua: string;
20
+ status: number;
21
+ ts: string;
22
+ }
23
+ export interface DevTuneAiTrafficMatch {
24
+ entry: AiBotRegistryEntry;
25
+ event: DevTuneAiTrafficEvent;
26
+ }
27
+ export interface DevTuneAiTrafficLogger {
28
+ warn(message: string, context?: Record<string, unknown>): void;
29
+ debug?(message: string, context?: Record<string, unknown>): void;
30
+ }
31
+ export interface DevTuneAiTrafficOptions {
32
+ ingestKey: string;
33
+ endpoint?: string;
34
+ registryUrl?: string;
35
+ registryRevalidateMs?: number;
36
+ batchSize?: number;
37
+ flushIntervalMs?: number;
38
+ defaultStatus?: number;
39
+ statusResolver?: (request: RequestLike) => number | undefined;
40
+ notFoundPathPatterns?: Array<RegExp | string>;
41
+ fetch?: typeof fetch;
42
+ logger?: DevTuneAiTrafficLogger;
43
+ now?: () => Date;
44
+ random?: () => number;
45
+ errorSampleRate?: number;
46
+ }
47
+ export type DevTuneAiTrafficRouteHandler<Context, ResponseType extends Response> = (request: RequestLike, context: Context) => ResponseType | Promise<ResponseType>;
48
+ export declare const DEFAULT_INGEST_ENDPOINT = "https://devtune.ai/api/v1/llm-traffic/ingest";
49
+ export declare const DEFAULT_REGISTRY_URL = "https://devtune.ai/api/v1/llm-traffic/registry";
50
+ export declare class DevTuneAiTrafficClient {
51
+ private readonly options;
52
+ private readonly endpoint;
53
+ private readonly registryUrl;
54
+ private readonly registryRevalidateMs;
55
+ private readonly batchSize;
56
+ private readonly flushIntervalMs;
57
+ private readonly defaultStatus;
58
+ private readonly fetchImpl;
59
+ private readonly logger;
60
+ private readonly now;
61
+ private readonly random;
62
+ private readonly errorSampleRate;
63
+ private registry;
64
+ private refreshPromise;
65
+ private flushPromise;
66
+ private delayedFlushPromise;
67
+ private readonly queue;
68
+ constructor(options: DevTuneAiTrafficOptions);
69
+ trackRequest(request: RequestLike, waitUntilContext?: WaitUntilLike, responseStatus?: number): DevTuneAiTrafficMatch | null;
70
+ refreshRegistry(): Promise<void>;
71
+ flush(): Promise<void>;
72
+ private refreshRegistryIfStale;
73
+ private createEvent;
74
+ private resolveStatus;
75
+ private matchesNotFoundPath;
76
+ private enqueue;
77
+ private flushQueuedEvents;
78
+ private sampleWarn;
79
+ }
80
+ export declare function createDevTuneAiTraffic(options: DevTuneAiTrafficOptions): DevTuneAiTrafficClient;
81
+ export declare function createDevTuneAiTrafficMiddleware(options: DevTuneAiTrafficOptions): (request: RequestLike, event?: WaitUntilLike) => void;
82
+ export declare function withDevTuneAiTrafficRoute<Context, ResponseType extends Response>(handler: DevTuneAiTrafficRouteHandler<Context, ResponseType>, options: DevTuneAiTrafficOptions): (request: RequestLike, context: Context) => Promise<ResponseType>;
83
+ //# sourceMappingURL=client.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"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"}
package/dist/client.js ADDED
@@ -0,0 +1,309 @@
1
+ /**
2
+ * ABOUTME: Implements the DevTune AI Traffic edge-push client.
3
+ * Handles registry refresh, AI bot matching, batched ingest beacons, and route wrappers.
4
+ */
5
+ import { FALLBACK_AI_BOT_REGISTRY_ENTRIES, compileAiBotRegistryEntries, matchAiBotRegistryEntry, parseAiBotRegistryPayload, } from "./registry.js";
6
+ export const DEFAULT_INGEST_ENDPOINT = "https://devtune.ai/api/v1/llm-traffic/ingest";
7
+ export const DEFAULT_REGISTRY_URL = "https://devtune.ai/api/v1/llm-traffic/registry";
8
+ const DEFAULT_REGISTRY_REVALIDATE_MS = 60 * 60 * 1000;
9
+ const DEFAULT_BATCH_SIZE = 10;
10
+ const DEFAULT_FLUSH_INTERVAL_MS = 1000;
11
+ const DEFAULT_STATUS = 200;
12
+ const MAX_INGEST_BATCH_SIZE = 100;
13
+ const MAX_EVENT_PATH_LENGTH = 2048;
14
+ const MAX_EVENT_UA_LENGTH = 2048;
15
+ const MAX_EVENT_URL_LENGTH = 4096;
16
+ export class DevTuneAiTrafficClient {
17
+ options;
18
+ endpoint;
19
+ registryUrl;
20
+ registryRevalidateMs;
21
+ batchSize;
22
+ flushIntervalMs;
23
+ defaultStatus;
24
+ fetchImpl;
25
+ logger;
26
+ now;
27
+ random;
28
+ errorSampleRate;
29
+ registry;
30
+ refreshPromise = null;
31
+ flushPromise = null;
32
+ delayedFlushPromise = null;
33
+ queue = [];
34
+ constructor(options) {
35
+ this.options = options;
36
+ if (!options.ingestKey) {
37
+ throw new Error("DevTune AI Traffic ingestKey is required");
38
+ }
39
+ this.endpoint = options.endpoint ?? DEFAULT_INGEST_ENDPOINT;
40
+ this.registryUrl = options.registryUrl ?? DEFAULT_REGISTRY_URL;
41
+ this.registryRevalidateMs = options.registryRevalidateMs ?? DEFAULT_REGISTRY_REVALIDATE_MS;
42
+ this.batchSize = clampInteger(options.batchSize ?? DEFAULT_BATCH_SIZE, 1, MAX_INGEST_BATCH_SIZE);
43
+ this.flushIntervalMs = clampInteger(options.flushIntervalMs ?? DEFAULT_FLUSH_INTERVAL_MS, 0, 60_000);
44
+ this.defaultStatus = normalizeStatus(options.defaultStatus ?? DEFAULT_STATUS, DEFAULT_STATUS);
45
+ this.fetchImpl = options.fetch ?? fetch;
46
+ this.logger = options.logger ?? null;
47
+ this.now = options.now ?? (() => new Date());
48
+ this.random = options.random ?? Math.random;
49
+ this.errorSampleRate = clampNumber(options.errorSampleRate ?? 0.01, 0, 1);
50
+ this.registry = {
51
+ entries: compileAiBotRegistryEntries(FALLBACK_AI_BOT_REGISTRY_ENTRIES),
52
+ etag: null,
53
+ fetchedAt: 0,
54
+ version: "bundled",
55
+ };
56
+ }
57
+ trackRequest(request, waitUntilContext, responseStatus) {
58
+ this.refreshRegistryIfStale(waitUntilContext);
59
+ const userAgent = request.headers.get("user-agent");
60
+ const entry = matchAiBotRegistryEntry(userAgent, this.registry.entries);
61
+ if (!entry || !userAgent) {
62
+ return null;
63
+ }
64
+ const event = this.createEvent(request, userAgent, responseStatus);
65
+ if (!event) {
66
+ return null;
67
+ }
68
+ this.enqueue(event, waitUntilContext);
69
+ return {
70
+ entry,
71
+ event,
72
+ };
73
+ }
74
+ async refreshRegistry() {
75
+ const headers = {
76
+ accept: "application/json",
77
+ };
78
+ if (this.registry.etag) {
79
+ headers["if-none-match"] = this.registry.etag;
80
+ }
81
+ const response = await this.fetchImpl(this.registryUrl, {
82
+ headers,
83
+ method: "GET",
84
+ });
85
+ if (response.status === 304) {
86
+ this.registry = {
87
+ ...this.registry,
88
+ fetchedAt: Date.now(),
89
+ };
90
+ return;
91
+ }
92
+ if (!response.ok) {
93
+ throw new Error(`Registry request failed with status ${response.status}`);
94
+ }
95
+ const payload = parseAiBotRegistryPayload(await response.json());
96
+ if (!payload) {
97
+ throw new Error("Registry response was not a valid DevTune registry");
98
+ }
99
+ this.registry = {
100
+ entries: compileAiBotRegistryEntries(payload.entries),
101
+ etag: response.headers.get("etag") ?? `"${payload.version}"`,
102
+ fetchedAt: Date.now(),
103
+ version: payload.version,
104
+ };
105
+ }
106
+ async flush() {
107
+ if (this.flushPromise) {
108
+ return this.flushPromise;
109
+ }
110
+ this.flushPromise = this.flushQueuedEvents().finally(() => {
111
+ this.flushPromise = null;
112
+ });
113
+ return this.flushPromise;
114
+ }
115
+ refreshRegistryIfStale(waitUntilContext) {
116
+ if (this.refreshPromise) {
117
+ return;
118
+ }
119
+ if (Date.now() - this.registry.fetchedAt < this.registryRevalidateMs) {
120
+ return;
121
+ }
122
+ this.refreshPromise = this.refreshRegistry()
123
+ .catch((error) => {
124
+ this.registry = {
125
+ ...this.registry,
126
+ fetchedAt: Date.now(),
127
+ };
128
+ this.sampleWarn("Failed to refresh DevTune AI bot registry", { error });
129
+ })
130
+ .finally(() => {
131
+ this.refreshPromise = null;
132
+ });
133
+ scheduleBackground(this.refreshPromise, waitUntilContext);
134
+ }
135
+ createEvent(request, userAgent, responseStatus) {
136
+ const url = parseRequestUrl(request.url);
137
+ if (!url) {
138
+ return null;
139
+ }
140
+ const pathname = truncateString(url.pathname || "/", MAX_EVENT_PATH_LENGTH);
141
+ return {
142
+ path: pathname,
143
+ url: truncateString(`${url.origin}${pathname}`, MAX_EVENT_URL_LENGTH),
144
+ ua: truncateString(userAgent, MAX_EVENT_UA_LENGTH),
145
+ status: this.resolveStatus(request, pathname, responseStatus),
146
+ ts: this.now().toISOString(),
147
+ };
148
+ }
149
+ resolveStatus(request, pathname, responseStatus) {
150
+ const explicitStatus = normalizeStatus(responseStatus, null);
151
+ if (explicitStatus) {
152
+ return explicitStatus;
153
+ }
154
+ const resolvedStatus = normalizeStatus(this.options.statusResolver?.(request), null);
155
+ if (resolvedStatus) {
156
+ return resolvedStatus;
157
+ }
158
+ if (this.matchesNotFoundPath(pathname)) {
159
+ return 404;
160
+ }
161
+ return this.defaultStatus;
162
+ }
163
+ matchesNotFoundPath(pathname) {
164
+ for (const pattern of this.options.notFoundPathPatterns ?? []) {
165
+ if (typeof pattern === "string") {
166
+ if (pattern === pathname) {
167
+ return true;
168
+ }
169
+ continue;
170
+ }
171
+ pattern.lastIndex = 0;
172
+ if (pattern.test(pathname)) {
173
+ return true;
174
+ }
175
+ }
176
+ return false;
177
+ }
178
+ enqueue(event, waitUntilContext) {
179
+ this.queue.push(event);
180
+ if (this.queue.length >= this.batchSize) {
181
+ scheduleBackground(this.flush(), waitUntilContext);
182
+ return;
183
+ }
184
+ if (this.delayedFlushPromise) {
185
+ scheduleBackground(this.delayedFlushPromise, waitUntilContext);
186
+ return;
187
+ }
188
+ this.delayedFlushPromise = delay(this.flushIntervalMs)
189
+ .then(() => this.flush())
190
+ .finally(() => {
191
+ this.delayedFlushPromise = null;
192
+ });
193
+ scheduleBackground(this.delayedFlushPromise, waitUntilContext);
194
+ }
195
+ async flushQueuedEvents() {
196
+ while (this.queue.length > 0) {
197
+ const batch = this.queue.splice(0, MAX_INGEST_BATCH_SIZE);
198
+ try {
199
+ const response = await this.fetchImpl(this.endpoint, {
200
+ body: JSON.stringify({ events: batch }),
201
+ headers: {
202
+ authorization: `Bearer ${this.options.ingestKey}`,
203
+ "content-type": "application/json",
204
+ },
205
+ keepalive: true,
206
+ method: "POST",
207
+ });
208
+ if (!response.ok) {
209
+ this.sampleWarn("DevTune AI Traffic ingest request failed", {
210
+ status: response.status,
211
+ });
212
+ }
213
+ }
214
+ catch (error) {
215
+ this.sampleWarn("DevTune AI Traffic ingest request failed", { error });
216
+ }
217
+ }
218
+ }
219
+ sampleWarn(message, context) {
220
+ if (this.errorSampleRate === 0 || this.random() > this.errorSampleRate) {
221
+ return;
222
+ }
223
+ this.logger?.warn(message, context);
224
+ }
225
+ }
226
+ export function createDevTuneAiTraffic(options) {
227
+ return new DevTuneAiTrafficClient(options);
228
+ }
229
+ export function createDevTuneAiTrafficMiddleware(options) {
230
+ const client = createDevTuneAiTraffic(options);
231
+ return function devTuneAiTrafficMiddleware(request, event) {
232
+ client.trackRequest(request, event);
233
+ };
234
+ }
235
+ export function withDevTuneAiTrafficRoute(handler, options) {
236
+ const client = createDevTuneAiTraffic(options);
237
+ return async function devTuneAiTrafficRoute(request, context) {
238
+ const response = await handler(request, context);
239
+ const waitUntilContext = getWaitUntilContext(context);
240
+ client.trackRequest(request, waitUntilContext, response.status);
241
+ return response;
242
+ };
243
+ }
244
+ function scheduleBackground(promise, waitUntilContext) {
245
+ const guardedPromise = promise.catch(() => undefined);
246
+ if (waitUntilContext) {
247
+ waitUntilContext.waitUntil(guardedPromise);
248
+ return;
249
+ }
250
+ void guardedPromise;
251
+ }
252
+ function getWaitUntilContext(value) {
253
+ if (!isRecord(value)) {
254
+ return undefined;
255
+ }
256
+ const waitUntil = value.waitUntil;
257
+ if (typeof waitUntil !== "function") {
258
+ return undefined;
259
+ }
260
+ return {
261
+ waitUntil: (promise) => {
262
+ waitUntil.call(value, promise);
263
+ },
264
+ };
265
+ }
266
+ function parseRequestUrl(url) {
267
+ try {
268
+ return new URL(url);
269
+ }
270
+ catch {
271
+ return null;
272
+ }
273
+ }
274
+ function delay(ms) {
275
+ if (ms <= 0) {
276
+ return Promise.resolve();
277
+ }
278
+ return new Promise((resolve) => {
279
+ setTimeout(resolve, ms);
280
+ });
281
+ }
282
+ function normalizeStatus(value, fallback) {
283
+ if (typeof value === "number" && Number.isInteger(value) && value >= 100 && value <= 599) {
284
+ return value;
285
+ }
286
+ return fallback;
287
+ }
288
+ function clampInteger(value, min, max) {
289
+ if (!Number.isFinite(value)) {
290
+ return min;
291
+ }
292
+ return Math.min(Math.max(Math.trunc(value), min), max);
293
+ }
294
+ function clampNumber(value, min, max) {
295
+ if (!Number.isFinite(value)) {
296
+ return min;
297
+ }
298
+ return Math.min(Math.max(value, min), max);
299
+ }
300
+ function truncateString(value, maxLength) {
301
+ if (value.length <= maxLength) {
302
+ return value;
303
+ }
304
+ return value.slice(0, maxLength);
305
+ }
306
+ function isRecord(value) {
307
+ return typeof value === "object" && value !== null;
308
+ }
309
+ //# sourceMappingURL=client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.js","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ /**
2
+ * ABOUTME: Public exports for the DevTune AI Traffic edge-push package.
3
+ * Exposes middleware helpers, route wrappers, and registry matching utilities.
4
+ */
5
+ export { DEFAULT_INGEST_ENDPOINT, DEFAULT_REGISTRY_URL, DevTuneAiTrafficClient, createDevTuneAiTraffic, createDevTuneAiTrafficMiddleware, withDevTuneAiTrafficRoute, type DevTuneAiTrafficEvent, type DevTuneAiTrafficLogger, type DevTuneAiTrafficMatch, type DevTuneAiTrafficOptions, type DevTuneAiTrafficRouteHandler, type HeadersLike, type RequestLike, type WaitUntilLike, } from "./client.js";
6
+ export { FALLBACK_AI_BOT_REGISTRY_ENTRIES, compileAiBotRegistryEntries, matchAiBotRegistryEntry, parseAiBotRegistryPayload, type AiBotRegistryEntry, type CompiledAiBotRegistryEntry, type LlmPlatform, type MachineTrafficClass, } from "./registry.js";
7
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EACL,uBAAuB,EACvB,oBAAoB,EACpB,sBAAsB,EACtB,sBAAsB,EACtB,gCAAgC,EAChC,yBAAyB,EACzB,KAAK,qBAAqB,EAC1B,KAAK,sBAAsB,EAC3B,KAAK,qBAAqB,EAC1B,KAAK,uBAAuB,EAC5B,KAAK,4BAA4B,EACjC,KAAK,WAAW,EAChB,KAAK,WAAW,EAChB,KAAK,aAAa,GACnB,MAAM,aAAa,CAAC;AAErB,OAAO,EACL,gCAAgC,EAChC,2BAA2B,EAC3B,uBAAuB,EACvB,yBAAyB,EACzB,KAAK,kBAAkB,EACvB,KAAK,0BAA0B,EAC/B,KAAK,WAAW,EAChB,KAAK,mBAAmB,GACzB,MAAM,eAAe,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,7 @@
1
+ /**
2
+ * ABOUTME: Public exports for the DevTune AI Traffic edge-push package.
3
+ * Exposes middleware helpers, route wrappers, and registry matching utilities.
4
+ */
5
+ export { DEFAULT_INGEST_ENDPOINT, DEFAULT_REGISTRY_URL, DevTuneAiTrafficClient, createDevTuneAiTraffic, createDevTuneAiTrafficMiddleware, withDevTuneAiTrafficRoute, } from "./client.js";
6
+ export { FALLBACK_AI_BOT_REGISTRY_ENTRIES, compileAiBotRegistryEntries, matchAiBotRegistryEntry, parseAiBotRegistryPayload, } from "./registry.js";
7
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EACL,uBAAuB,EACvB,oBAAoB,EACpB,sBAAsB,EACtB,sBAAsB,EACtB,gCAAgC,EAChC,yBAAyB,GAS1B,MAAM,aAAa,CAAC;AAErB,OAAO,EACL,gCAAgC,EAChC,2BAA2B,EAC3B,uBAAuB,EACvB,yBAAyB,GAK1B,MAAM,eAAe,CAAC"}
@@ -0,0 +1,139 @@
1
+ /**
2
+ * ABOUTME: Portable AI bot registry matching for DevTune edge-push sensors.
3
+ * Keeps the package able to classify known AI user agents without runtime dependencies.
4
+ */
5
+ export type LlmPlatform = "openai" | "anthropic" | "perplexity" | "google" | "microsoft" | "meta" | "bytedance" | "cohere" | "apple" | "mistral" | "xai" | "you" | "quora" | "other";
6
+ export type MachineTrafficClass = "training_crawler" | "index_bot" | "answer_fetcher" | "acting_agent";
7
+ export interface AiBotRegistryEntry {
8
+ uaPattern: string;
9
+ llmPlatform: LlmPlatform;
10
+ botClass: MachineTrafficClass;
11
+ label: string;
12
+ status?: "active" | "retired";
13
+ asnHints?: number[] | null;
14
+ notes?: string | null;
15
+ }
16
+ export interface CompiledAiBotRegistryEntry {
17
+ entry: AiBotRegistryEntry;
18
+ matcher: RegExp;
19
+ }
20
+ export declare const FALLBACK_AI_BOT_REGISTRY_ENTRIES: ({
21
+ uaPattern: string;
22
+ llmPlatform: "openai";
23
+ botClass: "training_crawler";
24
+ label: string;
25
+ status: "active";
26
+ asnHints: null;
27
+ notes: string;
28
+ } | {
29
+ uaPattern: string;
30
+ llmPlatform: "openai";
31
+ botClass: "index_bot";
32
+ label: string;
33
+ status: "active";
34
+ asnHints: null;
35
+ notes: string;
36
+ } | {
37
+ uaPattern: string;
38
+ llmPlatform: "openai";
39
+ botClass: "answer_fetcher";
40
+ label: string;
41
+ status: "active";
42
+ asnHints: null;
43
+ notes: string;
44
+ } | {
45
+ uaPattern: string;
46
+ llmPlatform: "anthropic";
47
+ botClass: "training_crawler";
48
+ label: string;
49
+ status: "active";
50
+ asnHints: null;
51
+ notes: string;
52
+ } | {
53
+ uaPattern: string;
54
+ llmPlatform: "anthropic";
55
+ botClass: "index_bot";
56
+ label: string;
57
+ status: "active";
58
+ asnHints: null;
59
+ notes: string;
60
+ } | {
61
+ uaPattern: string;
62
+ llmPlatform: "anthropic";
63
+ botClass: "answer_fetcher";
64
+ label: string;
65
+ status: "active";
66
+ asnHints: null;
67
+ notes: string;
68
+ } | {
69
+ uaPattern: string;
70
+ llmPlatform: "perplexity";
71
+ botClass: "index_bot";
72
+ label: string;
73
+ status: "active";
74
+ asnHints: null;
75
+ notes: string;
76
+ } | {
77
+ uaPattern: string;
78
+ llmPlatform: "perplexity";
79
+ botClass: "answer_fetcher";
80
+ label: string;
81
+ status: "active";
82
+ asnHints: null;
83
+ notes: string;
84
+ } | {
85
+ uaPattern: string;
86
+ llmPlatform: "google";
87
+ botClass: "index_bot";
88
+ label: string;
89
+ status: "active";
90
+ asnHints: null;
91
+ notes: string;
92
+ } | {
93
+ uaPattern: string;
94
+ llmPlatform: "google";
95
+ botClass: "training_crawler";
96
+ label: string;
97
+ status: "active";
98
+ asnHints: null;
99
+ notes: string;
100
+ } | {
101
+ uaPattern: string;
102
+ llmPlatform: "google";
103
+ botClass: "acting_agent";
104
+ label: string;
105
+ status: "active";
106
+ asnHints: null;
107
+ notes: string;
108
+ } | {
109
+ uaPattern: string;
110
+ llmPlatform: "google";
111
+ botClass: "answer_fetcher";
112
+ label: string;
113
+ status: "active";
114
+ asnHints: null;
115
+ notes: string;
116
+ } | {
117
+ uaPattern: string;
118
+ llmPlatform: "bytedance";
119
+ botClass: "training_crawler";
120
+ label: string;
121
+ status: "active";
122
+ asnHints: null;
123
+ notes: string;
124
+ } | {
125
+ uaPattern: string;
126
+ llmPlatform: "meta";
127
+ botClass: "training_crawler";
128
+ label: string;
129
+ status: "active";
130
+ asnHints: null;
131
+ notes: string;
132
+ })[];
133
+ export declare function compileAiBotRegistryEntries(entries: readonly AiBotRegistryEntry[]): CompiledAiBotRegistryEntry[];
134
+ export declare function matchAiBotRegistryEntry(userAgent: string | null | undefined, entries?: readonly CompiledAiBotRegistryEntry[]): AiBotRegistryEntry | null;
135
+ export declare function parseAiBotRegistryPayload(payload: unknown): {
136
+ version: string;
137
+ entries: AiBotRegistryEntry[];
138
+ } | null;
139
+ //# sourceMappingURL=registry.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../src/registry.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,MAAM,MAAM,WAAW,GACnB,QAAQ,GACR,WAAW,GACX,YAAY,GACZ,QAAQ,GACR,WAAW,GACX,MAAM,GACN,WAAW,GACX,QAAQ,GACR,OAAO,GACP,SAAS,GACT,KAAK,GACL,KAAK,GACL,OAAO,GACP,OAAO,CAAC;AAEZ,MAAM,MAAM,mBAAmB,GAC3B,kBAAkB,GAClB,WAAW,GACX,gBAAgB,GAChB,cAAc,CAAC;AAEnB,MAAM,WAAW,kBAAkB;IACjC,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,WAAW,CAAC;IACzB,QAAQ,EAAE,mBAAmB,CAAC;IAC9B,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,QAAQ,GAAG,SAAS,CAAC;IAC9B,QAAQ,CAAC,EAAE,MAAM,EAAE,GAAG,IAAI,CAAC;IAC3B,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CACvB;AAED,MAAM,WAAW,0BAA0B;IACzC,KAAK,EAAE,kBAAkB,CAAC;IAC1B,OAAO,EAAE,MAAM,CAAC;CACjB;AAKD,eAAO,MAAM,gCAAgC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;IAkJJ,CAAC;AAE1C,wBAAgB,2BAA2B,CACzC,OAAO,EAAE,SAAS,kBAAkB,EAAE,GACrC,0BAA0B,EAAE,CAuB9B;AAED,wBAAgB,uBAAuB,CACrC,SAAS,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,EACpC,OAAO,GAAE,SAAS,0BAA0B,EAE3C,6BAaF;AAED,wBAAgB,yBAAyB,CAAC,OAAO,EAAE,OAAO;;;SAmBzD"}
@@ -0,0 +1,258 @@
1
+ /**
2
+ * ABOUTME: Portable AI bot registry matching for DevTune edge-push sensors.
3
+ * Keeps the package able to classify known AI user agents without runtime dependencies.
4
+ */
5
+ const MAX_SAFE_UA_PATTERN_LENGTH = 128;
6
+ const UNSAFE_UA_PATTERN_TOKENS = /[()[\]{}*+?\\]/;
7
+ export const FALLBACK_AI_BOT_REGISTRY_ENTRIES = [
8
+ {
9
+ uaPattern: "GPTBot",
10
+ llmPlatform: "openai",
11
+ botClass: "training_crawler",
12
+ label: "GPTBot",
13
+ status: "active",
14
+ asnHints: null,
15
+ notes: "OpenAI training crawler for generative AI foundation models.",
16
+ },
17
+ {
18
+ uaPattern: "OAI-SearchBot",
19
+ llmPlatform: "openai",
20
+ botClass: "index_bot",
21
+ label: "OAI-SearchBot",
22
+ status: "active",
23
+ asnHints: null,
24
+ notes: "OpenAI search crawler used for ChatGPT search result inclusion.",
25
+ },
26
+ {
27
+ uaPattern: "ChatGPT-User",
28
+ llmPlatform: "openai",
29
+ botClass: "answer_fetcher",
30
+ label: "ChatGPT-User",
31
+ status: "active",
32
+ asnHints: null,
33
+ notes: "OpenAI user-triggered fetcher for ChatGPT and Custom GPT user actions.",
34
+ },
35
+ {
36
+ uaPattern: "ClaudeBot",
37
+ llmPlatform: "anthropic",
38
+ botClass: "training_crawler",
39
+ label: "ClaudeBot",
40
+ status: "active",
41
+ asnHints: null,
42
+ notes: "Anthropic training crawler.",
43
+ },
44
+ {
45
+ uaPattern: "anthropic-ai",
46
+ llmPlatform: "anthropic",
47
+ botClass: "training_crawler",
48
+ label: "anthropic-ai",
49
+ status: "active",
50
+ asnHints: null,
51
+ notes: "Legacy Anthropic crawler token retained from the deployed classifier.",
52
+ },
53
+ {
54
+ uaPattern: "Claude-SearchBot",
55
+ llmPlatform: "anthropic",
56
+ botClass: "index_bot",
57
+ label: "Claude-SearchBot",
58
+ status: "active",
59
+ asnHints: null,
60
+ notes: "Anthropic search indexing crawler for Claude search answers.",
61
+ },
62
+ {
63
+ uaPattern: "Claude-User",
64
+ llmPlatform: "anthropic",
65
+ botClass: "answer_fetcher",
66
+ label: "Claude-User",
67
+ status: "active",
68
+ asnHints: null,
69
+ notes: "Anthropic user-triggered fetcher for Claude user queries.",
70
+ },
71
+ {
72
+ uaPattern: "Claude-Web",
73
+ llmPlatform: "anthropic",
74
+ botClass: "answer_fetcher",
75
+ label: "Claude-Web",
76
+ status: "active",
77
+ asnHints: null,
78
+ notes: "Legacy Anthropic web-fetch token retained from the deployed classifier.",
79
+ },
80
+ {
81
+ uaPattern: "PerplexityBot",
82
+ llmPlatform: "perplexity",
83
+ botClass: "index_bot",
84
+ label: "PerplexityBot",
85
+ status: "active",
86
+ asnHints: null,
87
+ notes: "Perplexity indexing crawler used to surface and link websites in Perplexity results.",
88
+ },
89
+ {
90
+ uaPattern: "Perplexity-User",
91
+ llmPlatform: "perplexity",
92
+ botClass: "answer_fetcher",
93
+ label: "Perplexity-User",
94
+ status: "active",
95
+ asnHints: null,
96
+ notes: "Perplexity user-triggered fetcher for answer generation.",
97
+ },
98
+ {
99
+ uaPattern: "Google-CloudVertexBot",
100
+ llmPlatform: "google",
101
+ botClass: "index_bot",
102
+ label: "Google-CloudVertexBot",
103
+ status: "active",
104
+ asnHints: null,
105
+ notes: "Google crawler for content requested by site owners building Vertex AI Agents.",
106
+ },
107
+ {
108
+ uaPattern: "Google-Extended",
109
+ llmPlatform: "google",
110
+ botClass: "training_crawler",
111
+ label: "Google-Extended",
112
+ status: "active",
113
+ asnHints: null,
114
+ notes: "Robots.txt product token for Gemini training and grounding controls.",
115
+ },
116
+ {
117
+ uaPattern: "Google-Agent",
118
+ llmPlatform: "google",
119
+ botClass: "acting_agent",
120
+ label: "Google-Agent",
121
+ status: "active",
122
+ asnHints: null,
123
+ notes: "Google user-triggered agent used by Google-hosted agents to navigate the web and perform actions.",
124
+ },
125
+ {
126
+ uaPattern: "Google-NotebookLM",
127
+ llmPlatform: "google",
128
+ botClass: "answer_fetcher",
129
+ label: "Google-NotebookLM",
130
+ status: "active",
131
+ asnHints: null,
132
+ notes: "Google user-triggered fetcher for NotebookLM source URLs.",
133
+ },
134
+ {
135
+ uaPattern: "Bytespider",
136
+ llmPlatform: "bytedance",
137
+ botClass: "training_crawler",
138
+ label: "Bytespider",
139
+ status: "active",
140
+ asnHints: null,
141
+ notes: "ByteDance training crawler token retained from the deployed classifier.",
142
+ },
143
+ {
144
+ uaPattern: "Meta-ExternalAgent",
145
+ llmPlatform: "meta",
146
+ botClass: "training_crawler",
147
+ label: "Meta-ExternalAgent",
148
+ status: "active",
149
+ asnHints: null,
150
+ notes: "Meta external agent crawler token retained from the deployed classifier.",
151
+ },
152
+ ];
153
+ export function compileAiBotRegistryEntries(entries) {
154
+ const compiled = [];
155
+ for (const entry of entries) {
156
+ if ((entry.status ?? "active") !== "active") {
157
+ continue;
158
+ }
159
+ if (!isSafeUaPattern(entry.uaPattern)) {
160
+ continue;
161
+ }
162
+ try {
163
+ compiled.push({
164
+ entry: { ...entry, status: "active" },
165
+ matcher: new RegExp(entry.uaPattern, "i"),
166
+ });
167
+ }
168
+ catch {
169
+ continue;
170
+ }
171
+ }
172
+ return compiled;
173
+ }
174
+ export function matchAiBotRegistryEntry(userAgent, entries = compileAiBotRegistryEntries(FALLBACK_AI_BOT_REGISTRY_ENTRIES)) {
175
+ if (!userAgent) {
176
+ return null;
177
+ }
178
+ for (const compiled of entries) {
179
+ if (compiled.matcher.test(userAgent)) {
180
+ return compiled.entry;
181
+ }
182
+ }
183
+ return null;
184
+ }
185
+ export function parseAiBotRegistryPayload(payload) {
186
+ if (!isRecord(payload) || typeof payload.version !== "string") {
187
+ return null;
188
+ }
189
+ if (!Array.isArray(payload.entries)) {
190
+ return null;
191
+ }
192
+ const entries = payload.entries.flatMap((entry) => {
193
+ const parsed = parseAiBotRegistryEntry(entry);
194
+ return parsed ? [parsed] : [];
195
+ });
196
+ return {
197
+ version: payload.version,
198
+ entries,
199
+ };
200
+ }
201
+ function parseAiBotRegistryEntry(value) {
202
+ if (!isRecord(value)) {
203
+ return null;
204
+ }
205
+ if (typeof value.uaPattern !== "string" ||
206
+ typeof value.llmPlatform !== "string" ||
207
+ typeof value.botClass !== "string" ||
208
+ typeof value.label !== "string") {
209
+ return null;
210
+ }
211
+ if (!isLlmPlatform(value.llmPlatform)) {
212
+ return null;
213
+ }
214
+ if (!isMachineTrafficClass(value.botClass)) {
215
+ return null;
216
+ }
217
+ return {
218
+ uaPattern: value.uaPattern,
219
+ llmPlatform: value.llmPlatform,
220
+ botClass: value.botClass,
221
+ label: value.label,
222
+ status: value.status === "retired" ? "retired" : "active",
223
+ asnHints: Array.isArray(value.asnHints)
224
+ ? value.asnHints.filter((hint) => Number.isInteger(hint))
225
+ : null,
226
+ notes: typeof value.notes === "string" ? value.notes : null,
227
+ };
228
+ }
229
+ function isSafeUaPattern(pattern) {
230
+ return (pattern.length > 0 &&
231
+ pattern.length <= MAX_SAFE_UA_PATTERN_LENGTH &&
232
+ !UNSAFE_UA_PATTERN_TOKENS.test(pattern));
233
+ }
234
+ function isRecord(value) {
235
+ return typeof value === "object" && value !== null;
236
+ }
237
+ function isLlmPlatform(value) {
238
+ return [
239
+ "openai",
240
+ "anthropic",
241
+ "perplexity",
242
+ "google",
243
+ "microsoft",
244
+ "meta",
245
+ "bytedance",
246
+ "cohere",
247
+ "apple",
248
+ "mistral",
249
+ "xai",
250
+ "you",
251
+ "quora",
252
+ "other",
253
+ ].includes(value);
254
+ }
255
+ function isMachineTrafficClass(value) {
256
+ return ["training_crawler", "index_bot", "answer_fetcher", "acting_agent"].includes(value);
257
+ }
258
+ //# sourceMappingURL=registry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"registry.js","sourceRoot":"","sources":["../src/registry.ts"],"names":[],"mappings":"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"}
package/package.json ADDED
@@ -0,0 +1,51 @@
1
+ {
2
+ "name": "@devtune/ai-traffic",
3
+ "version": "0.1.0",
4
+ "private": false,
5
+ "description": "Filtered edge-push sensor for DevTune AI Traffic.",
6
+ "license": "UNLICENSED",
7
+ "repository": {
8
+ "type": "git",
9
+ "url": "git+https://github.com/devtunehq/ai-traffic.git",
10
+ "directory": "packages/core"
11
+ },
12
+ "bugs": {
13
+ "url": "https://github.com/devtunehq/ai-traffic/issues"
14
+ },
15
+ "homepage": "https://github.com/devtunehq/ai-traffic/tree/main/packages/core#readme",
16
+ "publishConfig": {
17
+ "access": "public"
18
+ },
19
+ "type": "module",
20
+ "sideEffects": false,
21
+ "main": "./dist/index.js",
22
+ "types": "./dist/index.d.ts",
23
+ "files": [
24
+ "dist",
25
+ "README.md"
26
+ ],
27
+ "scripts": {
28
+ "build": "tsc -p tsconfig.build.json",
29
+ "clean": "git clean -xdf .turbo node_modules dist",
30
+ "format": "oxfmt --check \"**/*.{md,ts}\"",
31
+ "format:fix": "oxfmt --write \"**/*.{md,ts}\"",
32
+ "lint": "oxlint src --deny-warnings",
33
+ "prepack": "pnpm build",
34
+ "test": "vitest run",
35
+ "typecheck": "tsc --noEmit -p tsconfig.json"
36
+ },
37
+ "exports": {
38
+ ".": {
39
+ "types": "./dist/index.d.ts",
40
+ "import": "./dist/index.js",
41
+ "default": "./dist/index.js"
42
+ }
43
+ },
44
+ "typesVersions": {
45
+ "*": {
46
+ "*": [
47
+ "dist/*"
48
+ ]
49
+ }
50
+ }
51
+ }