@astrasyncai/verification-gateway 5.21.1 → 5.22.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 (87) hide show
  1. package/CHANGELOG.md +16 -0
  2. package/README.md +19 -7
  3. package/dist/adapters/express.js +75 -9
  4. package/dist/adapters/express.js.map +1 -1
  5. package/dist/adapters/express.mjs +75 -9
  6. package/dist/adapters/express.mjs.map +1 -1
  7. package/dist/adapters/mcp.js +34 -3
  8. package/dist/adapters/mcp.js.map +1 -1
  9. package/dist/adapters/mcp.mjs +34 -3
  10. package/dist/adapters/mcp.mjs.map +1 -1
  11. package/dist/adapters/nextjs.js +75 -9
  12. package/dist/adapters/nextjs.js.map +1 -1
  13. package/dist/adapters/nextjs.mjs +75 -9
  14. package/dist/adapters/nextjs.mjs.map +1 -1
  15. package/dist/adapters/sdk.js +1 -1
  16. package/dist/adapters/sdk.js.map +1 -1
  17. package/dist/adapters/sdk.mjs +1 -1
  18. package/dist/adapters/sdk.mjs.map +1 -1
  19. package/dist/agent/index.js +1 -1
  20. package/dist/agent/index.js.map +1 -1
  21. package/dist/agent/index.mjs +1 -1
  22. package/dist/agent/index.mjs.map +1 -1
  23. package/dist/bin/astrasync-claude-hook.js +1 -1
  24. package/dist/bin/astrasync-codex-hook.js +1 -1
  25. package/dist/bin/astrasync-guard.js +1 -1
  26. package/dist/bin/astrasync.js +1 -1
  27. package/dist/browser/background.js +1 -1
  28. package/dist/browser/background.js.map +1 -1
  29. package/dist/browser/background.mjs +1 -1
  30. package/dist/browser/background.mjs.map +1 -1
  31. package/dist/cli/index.js +1 -1
  32. package/dist/cli/index.js.map +1 -1
  33. package/dist/cli/index.mjs +1 -1
  34. package/dist/cli/index.mjs.map +1 -1
  35. package/dist/codex/index.js +1 -1
  36. package/dist/codex/index.js.map +1 -1
  37. package/dist/codex/index.mjs +1 -1
  38. package/dist/codex/index.mjs.map +1 -1
  39. package/dist/cursor/extension.js +1 -1
  40. package/dist/cursor/extension.js.map +1 -1
  41. package/dist/cursor/extension.mjs +1 -1
  42. package/dist/cursor/extension.mjs.map +1 -1
  43. package/dist/edge-config.js +1 -1
  44. package/dist/edge-config.js.map +1 -1
  45. package/dist/edge-config.mjs +1 -1
  46. package/dist/edge-config.mjs.map +1 -1
  47. package/dist/edge-core/index.d.mts +4 -1
  48. package/dist/edge-core/index.d.ts +4 -1
  49. package/dist/edge-core/index.js +60 -13
  50. package/dist/edge-core/index.js.map +1 -1
  51. package/dist/edge-core/index.mjs +60 -13
  52. package/dist/edge-core/index.mjs.map +1 -1
  53. package/dist/gateway/gateway.js +1 -1
  54. package/dist/gateway/gateway.js.map +1 -1
  55. package/dist/gateway/gateway.mjs +1 -1
  56. package/dist/gateway/gateway.mjs.map +1 -1
  57. package/dist/index.d.mts +27 -6
  58. package/dist/index.d.ts +27 -6
  59. package/dist/index.js +75 -9
  60. package/dist/index.js.map +1 -1
  61. package/dist/index.mjs +75 -9
  62. package/dist/index.mjs.map +1 -1
  63. package/dist/metadata-capture.d.mts +5 -3
  64. package/dist/metadata-capture.d.ts +5 -3
  65. package/dist/metadata-capture.js +33 -2
  66. package/dist/metadata-capture.js.map +1 -1
  67. package/dist/metadata-capture.mjs +33 -2
  68. package/dist/metadata-capture.mjs.map +1 -1
  69. package/dist/platform-signatures.d.mts +20 -1
  70. package/dist/platform-signatures.d.ts +20 -1
  71. package/dist/platform-signatures.js +41 -6
  72. package/dist/platform-signatures.js.map +1 -1
  73. package/dist/platform-signatures.mjs +41 -6
  74. package/dist/platform-signatures.mjs.map +1 -1
  75. package/dist/registration/index.js +1 -1
  76. package/dist/registration/index.js.map +1 -1
  77. package/dist/registration/index.mjs +1 -1
  78. package/dist/registration/index.mjs.map +1 -1
  79. package/dist/transport/index.js +1 -1
  80. package/dist/transport/index.js.map +1 -1
  81. package/dist/transport/index.mjs +1 -1
  82. package/dist/transport/index.mjs.map +1 -1
  83. package/dist/verify.js +1 -1
  84. package/dist/verify.js.map +1 -1
  85. package/dist/verify.mjs +1 -1
  86. package/dist/verify.mjs.map +1 -1
  87. package/package.json +3 -3
@@ -33,7 +33,11 @@ var PLATFORM_HEADER_NAMES = /* @__PURE__ */ new Set([
33
33
  "x-goog-api-client",
34
34
  "user-agent",
35
35
  "x-agent-card-url",
36
- "x-agent-provider"
36
+ "x-agent-provider",
37
+ // Round 31 — Web Bot Auth's Signature-Agent names the signing agent's
38
+ // directory host (a public URL, never a secret). It attributes a signed
39
+ // agent even when its UA is stock Chrome.
40
+ "signature-agent"
37
41
  ]);
38
42
  var PLATFORM_HEADER_PREFIXES = [
39
43
  "x-goog-",
@@ -150,7 +154,12 @@ function sanitizeHeaders(raw) {
150
154
  return result;
151
155
  }
152
156
  var CONNECTION_HEADER_SOURCES = [
153
- ["ip", ["cf-connecting-ip", "fastly-client-ip", "true-client-ip", "x-real-ip"]],
157
+ // Round 31: `incap-client-ip` = Imperva Cloud WAF; `true-client-ip` is
158
+ // also Akamai's client-IP header when the property enables it.
159
+ [
160
+ "ip",
161
+ ["cf-connecting-ip", "fastly-client-ip", "incap-client-ip", "true-client-ip", "x-real-ip"]
162
+ ],
154
163
  [
155
164
  "country",
156
165
  ["cf-ipcountry", "x-vercel-ip-country", "cloudfront-viewer-country", "fastly-geo-country"]
@@ -201,6 +210,28 @@ function deriveConnectionFromHeaders(headers) {
201
210
  if (portMatch) connection.sourcePort = portMatch[1];
202
211
  if (!connection.ip && addr) connection.ip = addr.replace(/:\d+$/, "");
203
212
  }
213
+ {
214
+ const edgescape = (lower["x-akamai-edgescape"] ?? lower["akamai-edgescape"])?.trim();
215
+ if (edgescape) {
216
+ const fields = /* @__PURE__ */ new Map();
217
+ for (const pair of edgescape.split(",")) {
218
+ const i = pair.indexOf("=");
219
+ if (i > 0) fields.set(pair.slice(0, i).trim().toLowerCase(), pair.slice(i + 1).trim());
220
+ }
221
+ const fill = (key, field) => {
222
+ const v = fields.get(field);
223
+ if (v && !connection[key]) connection[key] = v.slice(0, MAX_CONNECTION_VALUE_CHARS);
224
+ };
225
+ fill("country", "country_code");
226
+ fill("region", "region_code");
227
+ fill("city", "city");
228
+ fill("latitude", "lat");
229
+ fill("longitude", "long");
230
+ fill("timeZone", "timezone");
231
+ fill("asn", "asnum");
232
+ fill("continent", "continent");
233
+ }
234
+ }
204
235
  if (!connection.ip) {
205
236
  const xff = lower["x-forwarded-for"];
206
237
  const client = xff?.split(",")[0]?.trim();
@@ -434,7 +465,7 @@ function routePolicyOf(route) {
434
465
  }
435
466
 
436
467
  // src/version.ts
437
- var SDK_VERSION = "5.21.1";
468
+ var SDK_VERSION = "5.22.0";
438
469
 
439
470
  // src/http.ts
440
471
  var SDK_USER_AGENT = `astrasync-sdk/${SDK_VERSION}`;
@@ -1601,7 +1632,8 @@ var PLATFORM_AGENT_SIGNATURES = [
1601
1632
  uaPatterns: [/claude/i, /anthropic/i],
1602
1633
  agentCardPatterns: [/anthropic\.com/i, /claude\.ai/i],
1603
1634
  apiKeyFormatPatterns: [/^sk-ant/i],
1604
- headerPatterns: [/^anthropic-version/i, /^anthropic-beta/i, /^x-anthropic-/i]
1635
+ headerPatterns: [/^anthropic-version/i, /^anthropic-beta/i, /^x-anthropic-/i],
1636
+ wafLabelPatterns: [/\bclaude/i, /\banthropic/i]
1605
1637
  },
1606
1638
  {
1607
1639
  vendor: "chatgpt",
@@ -1612,7 +1644,14 @@ var PLATFORM_AGENT_SIGNATURES = [
1612
1644
  uaPatterns: [/chatgpt/i, /openai/i, /gpt-?\d/i, /\bGPTBot\b/i, /\bOAI-SearchBot\b/i],
1613
1645
  agentCardPatterns: [/openai\.com/i, /chatgpt\.com/i],
1614
1646
  apiKeyFormatPatterns: [/^sk-proj/i, /^sk-svcacct/i],
1615
- headerPatterns: [/^openai-organization/i, /^openai-project/i, /^openai-version/i]
1647
+ headerPatterns: [
1648
+ /^openai-organization/i,
1649
+ /^openai-project/i,
1650
+ /^openai-version/i,
1651
+ // ChatGPT agent signs with Web Bot Auth under this directory host.
1652
+ /^signature-agent: "?https:\/\/chatgpt\.com/i
1653
+ ],
1654
+ wafLabelPatterns: [/\bgptbot\b/i, /\bchatgpt/i, /\boai-searchbot\b/i, /\bopenai/i]
1616
1655
  },
1617
1656
  {
1618
1657
  vendor: "gemini",
@@ -1633,7 +1672,8 @@ var PLATFORM_AGENT_SIGNATURES = [
1633
1672
  ],
1634
1673
  agentCardPatterns: [/gemini\.google\.com/i, /ai\.google\.dev/i],
1635
1674
  apiKeyFormatPatterns: [/^aiza/i],
1636
- headerPatterns: [/^x-goog-user-project/i, /^x-goog-api-client/i]
1675
+ headerPatterns: [/^x-goog-user-project/i, /^x-goog-api-client/i],
1676
+ wafLabelPatterns: [/\bgoogle-extended\b/i, /\bgoogleother\b/i, /\bgemini/i]
1637
1677
  },
1638
1678
  {
1639
1679
  vendor: "cursor",
@@ -1652,7 +1692,31 @@ var PLATFORM_AGENT_SIGNATURES = [
1652
1692
  displayName: "Perplexity",
1653
1693
  uaPatterns: [/perplexity/i],
1654
1694
  agentCardPatterns: [/perplexity\.ai/i],
1655
- apiKeyFormatPatterns: [/^pplx-/i]
1695
+ apiKeyFormatPatterns: [/^pplx-/i],
1696
+ wafLabelPatterns: [/\bperplexity/i]
1697
+ },
1698
+ // Round 30.1: xAI's documented crawlers (GrokBot/1.0, xAI-Grok/1.0,
1699
+ // Grok-DeepSearch/1.0). Anchored, versioned tokens — never in a stock UA.
1700
+ {
1701
+ vendor: "grok",
1702
+ displayName: "xAI Grok",
1703
+ uaPatterns: [/\bGrokBot\//i, /\bxAI-Grok\//i, /\bGrok-DeepSearch\//i],
1704
+ agentCardPatterns: [/\bx\.ai\b/i, /grok\.com/i],
1705
+ apiKeyFormatPatterns: [/^xai-/i],
1706
+ wafLabelPatterns: [/\bgrok/i, /\bxai\b/i]
1707
+ },
1708
+ // Round 30.1: Meta AI's index and fetch crawlers. facebookexternalhit
1709
+ // (link previews) is deliberately NOT here — it stays a generic crawler.
1710
+ {
1711
+ vendor: "meta-ai",
1712
+ displayName: "Meta AI",
1713
+ uaPatterns: [/\bMeta-WebIndexer\b/i, /\bMeta-ExternalFetcher\b/i],
1714
+ agentCardPatterns: [/meta\.ai/i],
1715
+ wafLabelPatterns: [
1716
+ /\bmeta-webindexer\b/i,
1717
+ /\bmeta-externalfetcher\b/i,
1718
+ /\bmeta-externalagent\b/i
1719
+ ]
1656
1720
  },
1657
1721
  // Agentic browsers — versioned-token patterns ONLY (a stock Chrome UA must
1658
1722
  // never match). Distinct vendor keys (not 'chatgpt'/'perplexity'): the
@@ -1700,6 +1764,7 @@ function matchPlatformSignature(signatures, input) {
1700
1764
  const apiKeyFormat = input.apiKeyFormat ?? "";
1701
1765
  const ja4 = input.ja4 ?? "";
1702
1766
  const asn = input.asn ?? "";
1767
+ const wafLabels = input.wafLabels ?? [];
1703
1768
  const headerLines = [];
1704
1769
  if (input.platformHeaders) {
1705
1770
  for (const [name, value] of Object.entries(input.platformHeaders)) {
@@ -1713,7 +1778,8 @@ function matchPlatformSignature(signatures, input) {
1713
1778
  const headerMatch = headerLines.length > 0 && sig.headerPatterns?.some((p) => headerLines.some((line) => p.test(line)));
1714
1779
  const ja4Match = ja4.length > 0 && sig.ja4Patterns?.some((p) => p.test(ja4));
1715
1780
  const asnMatch = asn.length > 0 && sig.asnList?.includes(asn);
1716
- if (uaMatch || cardMatch || keyMatch || headerMatch || ja4Match || asnMatch) {
1781
+ const wafMatch = wafLabels.length > 0 && sig.wafLabelPatterns?.some((p) => wafLabels.some((label) => p.test(label)));
1782
+ if (uaMatch || cardMatch || keyMatch || headerMatch || ja4Match || asnMatch || wafMatch) {
1717
1783
  const uaBase = ua.split(/[\s/]/)[0]?.toLowerCase() ?? "";
1718
1784
  const cardHost = (() => {
1719
1785
  try {
@@ -1722,7 +1788,7 @@ function matchPlatformSignature(signatures, input) {
1722
1788
  return "";
1723
1789
  }
1724
1790
  })();
1725
- const keyBasis = uaBase || cardHost || apiKeyFormat || ja4 || asn && `asn${asn}` || "unknown";
1791
+ const keyBasis = uaBase || cardHost || apiKeyFormat || ja4 || asn && `asn${asn}` || wafMatch && `waf:${wafLabels[0]?.toLowerCase()}` || "unknown";
1726
1792
  return {
1727
1793
  vendor: sig.vendor,
1728
1794
  fingerprintKey: `${sig.vendor}:${keyBasis}`,