@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.
- package/CHANGELOG.md +9 -0
- package/README.md +19 -7
- package/dist/adapters/express.js +60 -11
- package/dist/adapters/express.js.map +1 -1
- package/dist/adapters/express.mjs +60 -11
- package/dist/adapters/express.mjs.map +1 -1
- package/dist/adapters/mcp.js +34 -3
- package/dist/adapters/mcp.js.map +1 -1
- package/dist/adapters/mcp.mjs +34 -3
- package/dist/adapters/mcp.mjs.map +1 -1
- package/dist/adapters/nextjs.js +60 -11
- package/dist/adapters/nextjs.js.map +1 -1
- package/dist/adapters/nextjs.mjs +60 -11
- package/dist/adapters/nextjs.mjs.map +1 -1
- package/dist/adapters/sdk.js +1 -1
- package/dist/adapters/sdk.js.map +1 -1
- package/dist/adapters/sdk.mjs +1 -1
- package/dist/adapters/sdk.mjs.map +1 -1
- package/dist/agent/index.js +1 -1
- package/dist/agent/index.js.map +1 -1
- package/dist/agent/index.mjs +1 -1
- package/dist/agent/index.mjs.map +1 -1
- package/dist/bin/astrasync-claude-hook.js +1 -1
- package/dist/bin/astrasync-codex-hook.js +1 -1
- package/dist/bin/astrasync-guard.js +1 -1
- package/dist/bin/astrasync.js +1 -1
- package/dist/browser/background.js +1 -1
- package/dist/browser/background.js.map +1 -1
- package/dist/browser/background.mjs +1 -1
- package/dist/browser/background.mjs.map +1 -1
- package/dist/cli/index.js +1 -1
- package/dist/cli/index.js.map +1 -1
- package/dist/cli/index.mjs +1 -1
- package/dist/cli/index.mjs.map +1 -1
- package/dist/codex/index.js +1 -1
- package/dist/codex/index.js.map +1 -1
- package/dist/codex/index.mjs +1 -1
- package/dist/codex/index.mjs.map +1 -1
- package/dist/cursor/extension.js +1 -1
- package/dist/cursor/extension.js.map +1 -1
- package/dist/cursor/extension.mjs +1 -1
- package/dist/cursor/extension.mjs.map +1 -1
- package/dist/edge-config.js +1 -1
- package/dist/edge-config.js.map +1 -1
- package/dist/edge-config.mjs +1 -1
- package/dist/edge-config.mjs.map +1 -1
- package/dist/edge-core/index.d.mts +4 -1
- package/dist/edge-core/index.d.ts +4 -1
- package/dist/edge-core/index.js +45 -15
- package/dist/edge-core/index.js.map +1 -1
- package/dist/edge-core/index.mjs +45 -15
- package/dist/edge-core/index.mjs.map +1 -1
- package/dist/gateway/gateway.js +1 -1
- package/dist/gateway/gateway.js.map +1 -1
- package/dist/gateway/gateway.mjs +1 -1
- package/dist/gateway/gateway.mjs.map +1 -1
- package/dist/index.d.mts +20 -5
- package/dist/index.d.ts +20 -5
- package/dist/index.js +60 -11
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +60 -11
- package/dist/index.mjs.map +1 -1
- package/dist/metadata-capture.d.mts +5 -3
- package/dist/metadata-capture.d.ts +5 -3
- package/dist/metadata-capture.js +33 -2
- package/dist/metadata-capture.js.map +1 -1
- package/dist/metadata-capture.mjs +33 -2
- package/dist/metadata-capture.mjs.map +1 -1
- package/dist/platform-signatures.d.mts +13 -0
- package/dist/platform-signatures.d.ts +13 -0
- package/dist/platform-signatures.js +26 -8
- package/dist/platform-signatures.js.map +1 -1
- package/dist/platform-signatures.mjs +26 -8
- package/dist/platform-signatures.mjs.map +1 -1
- package/dist/registration/index.js +1 -1
- package/dist/registration/index.js.map +1 -1
- package/dist/registration/index.mjs +1 -1
- package/dist/registration/index.mjs.map +1 -1
- package/dist/transport/index.js +1 -1
- package/dist/transport/index.js.map +1 -1
- package/dist/transport/index.mjs +1 -1
- package/dist/transport/index.mjs.map +1 -1
- package/dist/verify.js +1 -1
- package/dist/verify.js.map +1 -1
- package/dist/verify.mjs +1 -1
- package/dist/verify.mjs.map +1 -1
- package/package.json +3 -3
package/dist/adapters/nextjs.js
CHANGED
|
@@ -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
|
-
|
|
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.
|
|
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: [
|
|
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
|
-
|
|
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}`,
|