@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
@@ -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.2";
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,8 @@ 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]
1656
1697
  },
1657
1698
  // Round 30.1: xAI's documented crawlers (GrokBot/1.0, xAI-Grok/1.0,
1658
1699
  // Grok-DeepSearch/1.0). Anchored, versioned tokens — never in a stock UA.
@@ -1661,7 +1702,8 @@ var PLATFORM_AGENT_SIGNATURES = [
1661
1702
  displayName: "xAI Grok",
1662
1703
  uaPatterns: [/\bGrokBot\//i, /\bxAI-Grok\//i, /\bGrok-DeepSearch\//i],
1663
1704
  agentCardPatterns: [/\bx\.ai\b/i, /grok\.com/i],
1664
- apiKeyFormatPatterns: [/^xai-/i]
1705
+ apiKeyFormatPatterns: [/^xai-/i],
1706
+ wafLabelPatterns: [/\bgrok/i, /\bxai\b/i]
1665
1707
  },
1666
1708
  // Round 30.1: Meta AI's index and fetch crawlers. facebookexternalhit
1667
1709
  // (link previews) is deliberately NOT here — it stays a generic crawler.
@@ -1669,7 +1711,12 @@ var PLATFORM_AGENT_SIGNATURES = [
1669
1711
  vendor: "meta-ai",
1670
1712
  displayName: "Meta AI",
1671
1713
  uaPatterns: [/\bMeta-WebIndexer\b/i, /\bMeta-ExternalFetcher\b/i],
1672
- agentCardPatterns: [/meta\.ai/i]
1714
+ agentCardPatterns: [/meta\.ai/i],
1715
+ wafLabelPatterns: [
1716
+ /\bmeta-webindexer\b/i,
1717
+ /\bmeta-externalfetcher\b/i,
1718
+ /\bmeta-externalagent\b/i
1719
+ ]
1673
1720
  },
1674
1721
  // Agentic browsers — versioned-token patterns ONLY (a stock Chrome UA must
1675
1722
  // never match). Distinct vendor keys (not 'chatgpt'/'perplexity'): the
@@ -1717,6 +1764,7 @@ function matchPlatformSignature(signatures, input) {
1717
1764
  const apiKeyFormat = input.apiKeyFormat ?? "";
1718
1765
  const ja4 = input.ja4 ?? "";
1719
1766
  const asn = input.asn ?? "";
1767
+ const wafLabels = input.wafLabels ?? [];
1720
1768
  const headerLines = [];
1721
1769
  if (input.platformHeaders) {
1722
1770
  for (const [name, value] of Object.entries(input.platformHeaders)) {
@@ -1730,7 +1778,8 @@ function matchPlatformSignature(signatures, input) {
1730
1778
  const headerMatch = headerLines.length > 0 && sig.headerPatterns?.some((p) => headerLines.some((line) => p.test(line)));
1731
1779
  const ja4Match = ja4.length > 0 && sig.ja4Patterns?.some((p) => p.test(ja4));
1732
1780
  const asnMatch = asn.length > 0 && sig.asnList?.includes(asn);
1733
- 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) {
1734
1783
  const uaBase = ua.split(/[\s/]/)[0]?.toLowerCase() ?? "";
1735
1784
  const cardHost = (() => {
1736
1785
  try {
@@ -1739,7 +1788,7 @@ function matchPlatformSignature(signatures, input) {
1739
1788
  return "";
1740
1789
  }
1741
1790
  })();
1742
- 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";
1743
1792
  return {
1744
1793
  vendor: sig.vendor,
1745
1794
  fingerprintKey: `${sig.vendor}:${keyBasis}`,