@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
@@ -70,7 +70,11 @@ var PLATFORM_HEADER_NAMES = /* @__PURE__ */ new Set([
70
70
  "x-goog-api-client",
71
71
  "user-agent",
72
72
  "x-agent-card-url",
73
- "x-agent-provider"
73
+ "x-agent-provider",
74
+ // Round 31 — Web Bot Auth's Signature-Agent names the signing agent's
75
+ // directory host (a public URL, never a secret). It attributes a signed
76
+ // agent even when its UA is stock Chrome.
77
+ "signature-agent"
74
78
  ]);
75
79
  var PLATFORM_HEADER_PREFIXES = [
76
80
  "x-goog-",
@@ -187,7 +191,12 @@ function sanitizeHeaders(raw) {
187
191
  return result;
188
192
  }
189
193
  var CONNECTION_HEADER_SOURCES = [
190
- ["ip", ["cf-connecting-ip", "fastly-client-ip", "true-client-ip", "x-real-ip"]],
194
+ // Round 31: `incap-client-ip` = Imperva Cloud WAF; `true-client-ip` is
195
+ // also Akamai's client-IP header when the property enables it.
196
+ [
197
+ "ip",
198
+ ["cf-connecting-ip", "fastly-client-ip", "incap-client-ip", "true-client-ip", "x-real-ip"]
199
+ ],
191
200
  [
192
201
  "country",
193
202
  ["cf-ipcountry", "x-vercel-ip-country", "cloudfront-viewer-country", "fastly-geo-country"]
@@ -238,6 +247,28 @@ function deriveConnectionFromHeaders(headers) {
238
247
  if (portMatch) connection.sourcePort = portMatch[1];
239
248
  if (!connection.ip && addr) connection.ip = addr.replace(/:\d+$/, "");
240
249
  }
250
+ {
251
+ const edgescape = (lower["x-akamai-edgescape"] ?? lower["akamai-edgescape"])?.trim();
252
+ if (edgescape) {
253
+ const fields = /* @__PURE__ */ new Map();
254
+ for (const pair of edgescape.split(",")) {
255
+ const i = pair.indexOf("=");
256
+ if (i > 0) fields.set(pair.slice(0, i).trim().toLowerCase(), pair.slice(i + 1).trim());
257
+ }
258
+ const fill = (key, field) => {
259
+ const v = fields.get(field);
260
+ if (v && !connection[key]) connection[key] = v.slice(0, MAX_CONNECTION_VALUE_CHARS);
261
+ };
262
+ fill("country", "country_code");
263
+ fill("region", "region_code");
264
+ fill("city", "city");
265
+ fill("latitude", "lat");
266
+ fill("longitude", "long");
267
+ fill("timeZone", "timezone");
268
+ fill("asn", "asnum");
269
+ fill("continent", "continent");
270
+ }
271
+ }
241
272
  if (!connection.ip) {
242
273
  const xff = lower["x-forwarded-for"];
243
274
  const client = xff?.split(",")[0]?.trim();
@@ -471,7 +502,7 @@ function routePolicyOf(route) {
471
502
  }
472
503
 
473
504
  // src/version.ts
474
- var SDK_VERSION = "5.21.1";
505
+ var SDK_VERSION = "5.22.0";
475
506
 
476
507
  // src/http.ts
477
508
  var SDK_USER_AGENT = `astrasync-sdk/${SDK_VERSION}`;
@@ -1638,7 +1669,8 @@ var PLATFORM_AGENT_SIGNATURES = [
1638
1669
  uaPatterns: [/claude/i, /anthropic/i],
1639
1670
  agentCardPatterns: [/anthropic\.com/i, /claude\.ai/i],
1640
1671
  apiKeyFormatPatterns: [/^sk-ant/i],
1641
- headerPatterns: [/^anthropic-version/i, /^anthropic-beta/i, /^x-anthropic-/i]
1672
+ headerPatterns: [/^anthropic-version/i, /^anthropic-beta/i, /^x-anthropic-/i],
1673
+ wafLabelPatterns: [/\bclaude/i, /\banthropic/i]
1642
1674
  },
1643
1675
  {
1644
1676
  vendor: "chatgpt",
@@ -1649,7 +1681,14 @@ var PLATFORM_AGENT_SIGNATURES = [
1649
1681
  uaPatterns: [/chatgpt/i, /openai/i, /gpt-?\d/i, /\bGPTBot\b/i, /\bOAI-SearchBot\b/i],
1650
1682
  agentCardPatterns: [/openai\.com/i, /chatgpt\.com/i],
1651
1683
  apiKeyFormatPatterns: [/^sk-proj/i, /^sk-svcacct/i],
1652
- headerPatterns: [/^openai-organization/i, /^openai-project/i, /^openai-version/i]
1684
+ headerPatterns: [
1685
+ /^openai-organization/i,
1686
+ /^openai-project/i,
1687
+ /^openai-version/i,
1688
+ // ChatGPT agent signs with Web Bot Auth under this directory host.
1689
+ /^signature-agent: "?https:\/\/chatgpt\.com/i
1690
+ ],
1691
+ wafLabelPatterns: [/\bgptbot\b/i, /\bchatgpt/i, /\boai-searchbot\b/i, /\bopenai/i]
1653
1692
  },
1654
1693
  {
1655
1694
  vendor: "gemini",
@@ -1670,7 +1709,8 @@ var PLATFORM_AGENT_SIGNATURES = [
1670
1709
  ],
1671
1710
  agentCardPatterns: [/gemini\.google\.com/i, /ai\.google\.dev/i],
1672
1711
  apiKeyFormatPatterns: [/^aiza/i],
1673
- headerPatterns: [/^x-goog-user-project/i, /^x-goog-api-client/i]
1712
+ headerPatterns: [/^x-goog-user-project/i, /^x-goog-api-client/i],
1713
+ wafLabelPatterns: [/\bgoogle-extended\b/i, /\bgoogleother\b/i, /\bgemini/i]
1674
1714
  },
1675
1715
  {
1676
1716
  vendor: "cursor",
@@ -1689,7 +1729,31 @@ var PLATFORM_AGENT_SIGNATURES = [
1689
1729
  displayName: "Perplexity",
1690
1730
  uaPatterns: [/perplexity/i],
1691
1731
  agentCardPatterns: [/perplexity\.ai/i],
1692
- apiKeyFormatPatterns: [/^pplx-/i]
1732
+ apiKeyFormatPatterns: [/^pplx-/i],
1733
+ wafLabelPatterns: [/\bperplexity/i]
1734
+ },
1735
+ // Round 30.1: xAI's documented crawlers (GrokBot/1.0, xAI-Grok/1.0,
1736
+ // Grok-DeepSearch/1.0). Anchored, versioned tokens — never in a stock UA.
1737
+ {
1738
+ vendor: "grok",
1739
+ displayName: "xAI Grok",
1740
+ uaPatterns: [/\bGrokBot\//i, /\bxAI-Grok\//i, /\bGrok-DeepSearch\//i],
1741
+ agentCardPatterns: [/\bx\.ai\b/i, /grok\.com/i],
1742
+ apiKeyFormatPatterns: [/^xai-/i],
1743
+ wafLabelPatterns: [/\bgrok/i, /\bxai\b/i]
1744
+ },
1745
+ // Round 30.1: Meta AI's index and fetch crawlers. facebookexternalhit
1746
+ // (link previews) is deliberately NOT here — it stays a generic crawler.
1747
+ {
1748
+ vendor: "meta-ai",
1749
+ displayName: "Meta AI",
1750
+ uaPatterns: [/\bMeta-WebIndexer\b/i, /\bMeta-ExternalFetcher\b/i],
1751
+ agentCardPatterns: [/meta\.ai/i],
1752
+ wafLabelPatterns: [
1753
+ /\bmeta-webindexer\b/i,
1754
+ /\bmeta-externalfetcher\b/i,
1755
+ /\bmeta-externalagent\b/i
1756
+ ]
1693
1757
  },
1694
1758
  // Agentic browsers — versioned-token patterns ONLY (a stock Chrome UA must
1695
1759
  // never match). Distinct vendor keys (not 'chatgpt'/'perplexity'): the
@@ -1737,6 +1801,7 @@ function matchPlatformSignature(signatures, input) {
1737
1801
  const apiKeyFormat = input.apiKeyFormat ?? "";
1738
1802
  const ja4 = input.ja4 ?? "";
1739
1803
  const asn = input.asn ?? "";
1804
+ const wafLabels = input.wafLabels ?? [];
1740
1805
  const headerLines = [];
1741
1806
  if (input.platformHeaders) {
1742
1807
  for (const [name, value] of Object.entries(input.platformHeaders)) {
@@ -1750,7 +1815,8 @@ function matchPlatformSignature(signatures, input) {
1750
1815
  const headerMatch = headerLines.length > 0 && sig.headerPatterns?.some((p) => headerLines.some((line) => p.test(line)));
1751
1816
  const ja4Match = ja4.length > 0 && sig.ja4Patterns?.some((p) => p.test(ja4));
1752
1817
  const asnMatch = asn.length > 0 && sig.asnList?.includes(asn);
1753
- if (uaMatch || cardMatch || keyMatch || headerMatch || ja4Match || asnMatch) {
1818
+ const wafMatch = wafLabels.length > 0 && sig.wafLabelPatterns?.some((p) => wafLabels.some((label) => p.test(label)));
1819
+ if (uaMatch || cardMatch || keyMatch || headerMatch || ja4Match || asnMatch || wafMatch) {
1754
1820
  const uaBase = ua.split(/[\s/]/)[0]?.toLowerCase() ?? "";
1755
1821
  const cardHost = (() => {
1756
1822
  try {
@@ -1759,7 +1825,7 @@ function matchPlatformSignature(signatures, input) {
1759
1825
  return "";
1760
1826
  }
1761
1827
  })();
1762
- const keyBasis = uaBase || cardHost || apiKeyFormat || ja4 || asn && `asn${asn}` || "unknown";
1828
+ const keyBasis = uaBase || cardHost || apiKeyFormat || ja4 || asn && `asn${asn}` || wafMatch && `waf:${wafLabels[0]?.toLowerCase()}` || "unknown";
1763
1829
  return {
1764
1830
  vendor: sig.vendor,
1765
1831
  fingerprintKey: `${sig.vendor}:${keyBasis}`,