@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.
- package/CHANGELOG.md +16 -0
- package/README.md +19 -7
- package/dist/adapters/express.js +75 -9
- package/dist/adapters/express.js.map +1 -1
- package/dist/adapters/express.mjs +75 -9
- 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 +75 -9
- package/dist/adapters/nextjs.js.map +1 -1
- package/dist/adapters/nextjs.mjs +75 -9
- 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 +60 -13
- package/dist/edge-core/index.js.map +1 -1
- package/dist/edge-core/index.mjs +60 -13
- 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 +27 -6
- package/dist/index.d.ts +27 -6
- package/dist/index.js +75 -9
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +75 -9
- 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 +20 -1
- package/dist/platform-signatures.d.ts +20 -1
- package/dist/platform-signatures.js +41 -6
- package/dist/platform-signatures.js.map +1 -1
- package/dist/platform-signatures.mjs +41 -6
- 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,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
|
-
|
|
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}`,
|