@astrasyncai/verification-gateway 5.21.2 → 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 +9 -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 +20 -5
  58. package/dist/index.d.ts +20 -5
  59. package/dist/index.js +60 -11
  60. package/dist/index.js.map +1 -1
  61. package/dist/index.mjs +60 -11
  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
@@ -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.2";
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,8 @@ 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]
1693
1734
  },
1694
1735
  // Round 30.1: xAI's documented crawlers (GrokBot/1.0, xAI-Grok/1.0,
1695
1736
  // Grok-DeepSearch/1.0). Anchored, versioned tokens — never in a stock UA.
@@ -1698,7 +1739,8 @@ var PLATFORM_AGENT_SIGNATURES = [
1698
1739
  displayName: "xAI Grok",
1699
1740
  uaPatterns: [/\bGrokBot\//i, /\bxAI-Grok\//i, /\bGrok-DeepSearch\//i],
1700
1741
  agentCardPatterns: [/\bx\.ai\b/i, /grok\.com/i],
1701
- apiKeyFormatPatterns: [/^xai-/i]
1742
+ apiKeyFormatPatterns: [/^xai-/i],
1743
+ wafLabelPatterns: [/\bgrok/i, /\bxai\b/i]
1702
1744
  },
1703
1745
  // Round 30.1: Meta AI's index and fetch crawlers. facebookexternalhit
1704
1746
  // (link previews) is deliberately NOT here — it stays a generic crawler.
@@ -1706,7 +1748,12 @@ var PLATFORM_AGENT_SIGNATURES = [
1706
1748
  vendor: "meta-ai",
1707
1749
  displayName: "Meta AI",
1708
1750
  uaPatterns: [/\bMeta-WebIndexer\b/i, /\bMeta-ExternalFetcher\b/i],
1709
- agentCardPatterns: [/meta\.ai/i]
1751
+ agentCardPatterns: [/meta\.ai/i],
1752
+ wafLabelPatterns: [
1753
+ /\bmeta-webindexer\b/i,
1754
+ /\bmeta-externalfetcher\b/i,
1755
+ /\bmeta-externalagent\b/i
1756
+ ]
1710
1757
  },
1711
1758
  // Agentic browsers — versioned-token patterns ONLY (a stock Chrome UA must
1712
1759
  // never match). Distinct vendor keys (not 'chatgpt'/'perplexity'): the
@@ -1754,6 +1801,7 @@ function matchPlatformSignature(signatures, input) {
1754
1801
  const apiKeyFormat = input.apiKeyFormat ?? "";
1755
1802
  const ja4 = input.ja4 ?? "";
1756
1803
  const asn = input.asn ?? "";
1804
+ const wafLabels = input.wafLabels ?? [];
1757
1805
  const headerLines = [];
1758
1806
  if (input.platformHeaders) {
1759
1807
  for (const [name, value] of Object.entries(input.platformHeaders)) {
@@ -1767,7 +1815,8 @@ function matchPlatformSignature(signatures, input) {
1767
1815
  const headerMatch = headerLines.length > 0 && sig.headerPatterns?.some((p) => headerLines.some((line) => p.test(line)));
1768
1816
  const ja4Match = ja4.length > 0 && sig.ja4Patterns?.some((p) => p.test(ja4));
1769
1817
  const asnMatch = asn.length > 0 && sig.asnList?.includes(asn);
1770
- 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) {
1771
1820
  const uaBase = ua.split(/[\s/]/)[0]?.toLowerCase() ?? "";
1772
1821
  const cardHost = (() => {
1773
1822
  try {
@@ -1776,7 +1825,7 @@ function matchPlatformSignature(signatures, input) {
1776
1825
  return "";
1777
1826
  }
1778
1827
  })();
1779
- 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";
1780
1829
  return {
1781
1830
  vendor: sig.vendor,
1782
1831
  fingerprintKey: `${sig.vendor}:${keyBasis}`,