From 026820eb3291eab86550cdd78ee4b8b4bb0eb38d Mon Sep 17 00:00:00 2001 From: Chris Portscheller Date: Thu, 20 Aug 2026 12:14:48 -0500 Subject: [PATCH] feat(bots): regenerate registry with WebDecoyBot (companion to app #691) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Generated from pkg/agents via export-agent-registry — do not hand-edit. Adds WebDecoyBot (first-party monitoring crawler, base score 5) so the SDK classifies WebDecoy's own verify/readiness fetches as a known crawler instead of an unknown bot. Parity vectors + the 169-agent count assertion updated to match; parity test replays every vector through the TS matcher. --- packages/webdecoy/src/bots/bots.test.ts | 2 +- .../webdecoy/src/bots/parity-vectors.generated.json | 12 ++++++++++++ packages/webdecoy/src/bots/registry.generated.ts | 3 ++- 3 files changed, 15 insertions(+), 2 deletions(-) diff --git a/packages/webdecoy/src/bots/bots.test.ts b/packages/webdecoy/src/bots/bots.test.ts index 958dd6d..3e67345 100644 --- a/packages/webdecoy/src/bots/bots.test.ts +++ b/packages/webdecoy/src/bots/bots.test.ts @@ -60,7 +60,7 @@ describe('matchUserAgent', () => { describe('registry integrity', () => { it('carries the full generated table', () => { - expect(BOT_REGISTRY.length).toBe(168); + expect(BOT_REGISTRY.length).toBe(169); expect(BOT_CATEGORIES).toContain('training_crawler'); expect(BOT_CATEGORIES).toContain('search_crawler'); }); diff --git a/packages/webdecoy/src/bots/parity-vectors.generated.json b/packages/webdecoy/src/bots/parity-vectors.generated.json index 234e8ce..0dc9254 100644 --- a/packages/webdecoy/src/bots/parity-vectors.generated.json +++ b/packages/webdecoy/src/bots/parity-vectors.generated.json @@ -1967,6 +1967,18 @@ "category": "archiver", "matched": true }, + { + "userAgent": "webdecoybot", + "id": "webdecoybot", + "category": "monitoring", + "matched": true + }, + { + "userAgent": "Mozilla/5.0 (compatible; webdecoybot/1.0; +http://example.com/bot)", + "id": "webdecoybot", + "category": "monitoring", + "matched": true + }, { "userAgent": "webscrapingapi", "id": "webscrapingapi", diff --git a/packages/webdecoy/src/bots/registry.generated.ts b/packages/webdecoy/src/bots/registry.generated.ts index d4baae4..be9b8ed 100644 --- a/packages/webdecoy/src/bots/registry.generated.ts +++ b/packages/webdecoy/src/bots/registry.generated.ts @@ -11,7 +11,7 @@ * agents share User-Agent substrings, so sorting this array changes how real * traffic is classified. * - * 168 agents across 15 categories. + * 169 agents across 15 categories. */ /** @@ -211,6 +211,7 @@ export const BOT_REGISTRY: readonly BotAgent[] = [ { id: "libwww-perl", name: "libwww-perl", category: "fetcher", organization: "Perl", baseScore: 50, respectsRobots: false, uaPatterns: ["libwww-perl"] }, { id: "lwp", name: "LWP", category: "fetcher", organization: "Perl", baseScore: 50, respectsRobots: false, uaPatterns: ["lwp-"] }, { id: "httrack", name: "HTTrack", category: "fetcher", organization: "Open Source", baseScore: 60, respectsRobots: true, uaPatterns: ["httrack"] }, + { id: "webdecoybot", name: "WebDecoyBot", category: "monitoring", organization: "WebDecoy", baseScore: 5, respectsRobots: true, uaPatterns: ["webdecoybot"] }, { id: "uptimerobot", name: "UptimeRobot", category: "monitoring", organization: "UptimeRobot", baseScore: 20, respectsRobots: true, uaPatterns: ["uptimerobot"] }, { id: "pingdom", name: "Pingdom", category: "monitoring", organization: "SolarWinds", baseScore: 20, respectsRobots: true, uaPatterns: ["pingdom"] }, { id: "statuscake", name: "StatusCake", category: "monitoring", organization: "StatusCake", baseScore: 20, respectsRobots: true, uaPatterns: ["statuscake"] },