@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();
@@ -452,7 +483,7 @@ function routePolicyOf(route) {
452
483
  }
453
484
 
454
485
  // src/version.ts
455
- var SDK_VERSION = "5.21.1";
486
+ var SDK_VERSION = "5.22.0";
456
487
 
457
488
  // src/http.ts
458
489
  var SDK_USER_AGENT = `astrasync-sdk/${SDK_VERSION}`;
@@ -1873,7 +1904,8 @@ var PLATFORM_AGENT_SIGNATURES = [
1873
1904
  uaPatterns: [/claude/i, /anthropic/i],
1874
1905
  agentCardPatterns: [/anthropic\.com/i, /claude\.ai/i],
1875
1906
  apiKeyFormatPatterns: [/^sk-ant/i],
1876
- headerPatterns: [/^anthropic-version/i, /^anthropic-beta/i, /^x-anthropic-/i]
1907
+ headerPatterns: [/^anthropic-version/i, /^anthropic-beta/i, /^x-anthropic-/i],
1908
+ wafLabelPatterns: [/\bclaude/i, /\banthropic/i]
1877
1909
  },
1878
1910
  {
1879
1911
  vendor: "chatgpt",
@@ -1884,7 +1916,14 @@ var PLATFORM_AGENT_SIGNATURES = [
1884
1916
  uaPatterns: [/chatgpt/i, /openai/i, /gpt-?\d/i, /\bGPTBot\b/i, /\bOAI-SearchBot\b/i],
1885
1917
  agentCardPatterns: [/openai\.com/i, /chatgpt\.com/i],
1886
1918
  apiKeyFormatPatterns: [/^sk-proj/i, /^sk-svcacct/i],
1887
- headerPatterns: [/^openai-organization/i, /^openai-project/i, /^openai-version/i]
1919
+ headerPatterns: [
1920
+ /^openai-organization/i,
1921
+ /^openai-project/i,
1922
+ /^openai-version/i,
1923
+ // ChatGPT agent signs with Web Bot Auth under this directory host.
1924
+ /^signature-agent: "?https:\/\/chatgpt\.com/i
1925
+ ],
1926
+ wafLabelPatterns: [/\bgptbot\b/i, /\bchatgpt/i, /\boai-searchbot\b/i, /\bopenai/i]
1888
1927
  },
1889
1928
  {
1890
1929
  vendor: "gemini",
@@ -1905,7 +1944,8 @@ var PLATFORM_AGENT_SIGNATURES = [
1905
1944
  ],
1906
1945
  agentCardPatterns: [/gemini\.google\.com/i, /ai\.google\.dev/i],
1907
1946
  apiKeyFormatPatterns: [/^aiza/i],
1908
- headerPatterns: [/^x-goog-user-project/i, /^x-goog-api-client/i]
1947
+ headerPatterns: [/^x-goog-user-project/i, /^x-goog-api-client/i],
1948
+ wafLabelPatterns: [/\bgoogle-extended\b/i, /\bgoogleother\b/i, /\bgemini/i]
1909
1949
  },
1910
1950
  {
1911
1951
  vendor: "cursor",
@@ -1924,7 +1964,31 @@ var PLATFORM_AGENT_SIGNATURES = [
1924
1964
  displayName: "Perplexity",
1925
1965
  uaPatterns: [/perplexity/i],
1926
1966
  agentCardPatterns: [/perplexity\.ai/i],
1927
- apiKeyFormatPatterns: [/^pplx-/i]
1967
+ apiKeyFormatPatterns: [/^pplx-/i],
1968
+ wafLabelPatterns: [/\bperplexity/i]
1969
+ },
1970
+ // Round 30.1: xAI's documented crawlers (GrokBot/1.0, xAI-Grok/1.0,
1971
+ // Grok-DeepSearch/1.0). Anchored, versioned tokens — never in a stock UA.
1972
+ {
1973
+ vendor: "grok",
1974
+ displayName: "xAI Grok",
1975
+ uaPatterns: [/\bGrokBot\//i, /\bxAI-Grok\//i, /\bGrok-DeepSearch\//i],
1976
+ agentCardPatterns: [/\bx\.ai\b/i, /grok\.com/i],
1977
+ apiKeyFormatPatterns: [/^xai-/i],
1978
+ wafLabelPatterns: [/\bgrok/i, /\bxai\b/i]
1979
+ },
1980
+ // Round 30.1: Meta AI's index and fetch crawlers. facebookexternalhit
1981
+ // (link previews) is deliberately NOT here — it stays a generic crawler.
1982
+ {
1983
+ vendor: "meta-ai",
1984
+ displayName: "Meta AI",
1985
+ uaPatterns: [/\bMeta-WebIndexer\b/i, /\bMeta-ExternalFetcher\b/i],
1986
+ agentCardPatterns: [/meta\.ai/i],
1987
+ wafLabelPatterns: [
1988
+ /\bmeta-webindexer\b/i,
1989
+ /\bmeta-externalfetcher\b/i,
1990
+ /\bmeta-externalagent\b/i
1991
+ ]
1928
1992
  },
1929
1993
  // Agentic browsers — versioned-token patterns ONLY (a stock Chrome UA must
1930
1994
  // never match). Distinct vendor keys (not 'chatgpt'/'perplexity'): the
@@ -1972,6 +2036,7 @@ function matchPlatformSignature(signatures, input) {
1972
2036
  const apiKeyFormat = input.apiKeyFormat ?? "";
1973
2037
  const ja4 = input.ja4 ?? "";
1974
2038
  const asn = input.asn ?? "";
2039
+ const wafLabels = input.wafLabels ?? [];
1975
2040
  const headerLines = [];
1976
2041
  if (input.platformHeaders) {
1977
2042
  for (const [name, value] of Object.entries(input.platformHeaders)) {
@@ -1985,7 +2050,8 @@ function matchPlatformSignature(signatures, input) {
1985
2050
  const headerMatch = headerLines.length > 0 && sig.headerPatterns?.some((p) => headerLines.some((line) => p.test(line)));
1986
2051
  const ja4Match = ja4.length > 0 && sig.ja4Patterns?.some((p) => p.test(ja4));
1987
2052
  const asnMatch = asn.length > 0 && sig.asnList?.includes(asn);
1988
- if (uaMatch || cardMatch || keyMatch || headerMatch || ja4Match || asnMatch) {
2053
+ const wafMatch = wafLabels.length > 0 && sig.wafLabelPatterns?.some((p) => wafLabels.some((label) => p.test(label)));
2054
+ if (uaMatch || cardMatch || keyMatch || headerMatch || ja4Match || asnMatch || wafMatch) {
1989
2055
  const uaBase = ua.split(/[\s/]/)[0]?.toLowerCase() ?? "";
1990
2056
  const cardHost = (() => {
1991
2057
  try {
@@ -1994,7 +2060,7 @@ function matchPlatformSignature(signatures, input) {
1994
2060
  return "";
1995
2061
  }
1996
2062
  })();
1997
- const keyBasis = uaBase || cardHost || apiKeyFormat || ja4 || asn && `asn${asn}` || "unknown";
2063
+ const keyBasis = uaBase || cardHost || apiKeyFormat || ja4 || asn && `asn${asn}` || wafMatch && `waf:${wafLabels[0]?.toLowerCase()}` || "unknown";
1998
2064
  return {
1999
2065
  vendor: sig.vendor,
2000
2066
  fingerprintKey: `${sig.vendor}:${keyBasis}`,