@astrasyncai/verification-gateway 5.21.2 → 5.22.1

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 +20 -0
  2. package/README.md +19 -7
  3. package/dist/adapters/express.js +60 -11
  4. package/dist/adapters/express.js.map +1 -1
  5. package/dist/adapters/express.mjs +60 -11
  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 +60 -11
  12. package/dist/adapters/nextjs.js.map +1 -1
  13. package/dist/adapters/nextjs.mjs +60 -11
  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 +45 -15
  50. package/dist/edge-core/index.js.map +1 -1
  51. package/dist/edge-core/index.mjs +45 -15
  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 +44 -6
  58. package/dist/index.d.ts +44 -6
  59. package/dist/index.js +71 -14
  60. package/dist/index.js.map +1 -1
  61. package/dist/index.mjs +71 -14
  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 +13 -0
  70. package/dist/platform-signatures.d.ts +13 -0
  71. package/dist/platform-signatures.js +26 -8
  72. package/dist/platform-signatures.js.map +1 -1
  73. package/dist/platform-signatures.mjs +26 -8
  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.2";
486
+ var SDK_VERSION = "5.22.1";
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,8 @@ 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]
1928
1969
  },
1929
1970
  // Round 30.1: xAI's documented crawlers (GrokBot/1.0, xAI-Grok/1.0,
1930
1971
  // Grok-DeepSearch/1.0). Anchored, versioned tokens — never in a stock UA.
@@ -1933,7 +1974,8 @@ var PLATFORM_AGENT_SIGNATURES = [
1933
1974
  displayName: "xAI Grok",
1934
1975
  uaPatterns: [/\bGrokBot\//i, /\bxAI-Grok\//i, /\bGrok-DeepSearch\//i],
1935
1976
  agentCardPatterns: [/\bx\.ai\b/i, /grok\.com/i],
1936
- apiKeyFormatPatterns: [/^xai-/i]
1977
+ apiKeyFormatPatterns: [/^xai-/i],
1978
+ wafLabelPatterns: [/\bgrok/i, /\bxai\b/i]
1937
1979
  },
1938
1980
  // Round 30.1: Meta AI's index and fetch crawlers. facebookexternalhit
1939
1981
  // (link previews) is deliberately NOT here — it stays a generic crawler.
@@ -1941,7 +1983,12 @@ var PLATFORM_AGENT_SIGNATURES = [
1941
1983
  vendor: "meta-ai",
1942
1984
  displayName: "Meta AI",
1943
1985
  uaPatterns: [/\bMeta-WebIndexer\b/i, /\bMeta-ExternalFetcher\b/i],
1944
- agentCardPatterns: [/meta\.ai/i]
1986
+ agentCardPatterns: [/meta\.ai/i],
1987
+ wafLabelPatterns: [
1988
+ /\bmeta-webindexer\b/i,
1989
+ /\bmeta-externalfetcher\b/i,
1990
+ /\bmeta-externalagent\b/i
1991
+ ]
1945
1992
  },
1946
1993
  // Agentic browsers — versioned-token patterns ONLY (a stock Chrome UA must
1947
1994
  // never match). Distinct vendor keys (not 'chatgpt'/'perplexity'): the
@@ -1989,6 +2036,7 @@ function matchPlatformSignature(signatures, input) {
1989
2036
  const apiKeyFormat = input.apiKeyFormat ?? "";
1990
2037
  const ja4 = input.ja4 ?? "";
1991
2038
  const asn = input.asn ?? "";
2039
+ const wafLabels = input.wafLabels ?? [];
1992
2040
  const headerLines = [];
1993
2041
  if (input.platformHeaders) {
1994
2042
  for (const [name, value] of Object.entries(input.platformHeaders)) {
@@ -2002,7 +2050,8 @@ function matchPlatformSignature(signatures, input) {
2002
2050
  const headerMatch = headerLines.length > 0 && sig.headerPatterns?.some((p) => headerLines.some((line) => p.test(line)));
2003
2051
  const ja4Match = ja4.length > 0 && sig.ja4Patterns?.some((p) => p.test(ja4));
2004
2052
  const asnMatch = asn.length > 0 && sig.asnList?.includes(asn);
2005
- 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) {
2006
2055
  const uaBase = ua.split(/[\s/]/)[0]?.toLowerCase() ?? "";
2007
2056
  const cardHost = (() => {
2008
2057
  try {
@@ -2011,7 +2060,7 @@ function matchPlatformSignature(signatures, input) {
2011
2060
  return "";
2012
2061
  }
2013
2062
  })();
2014
- 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";
2015
2064
  return {
2016
2065
  vendor: sig.vendor,
2017
2066
  fingerprintKey: `${sig.vendor}:${keyBasis}`,