@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
|
@@ -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
|
-
|
|
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();
|
|
@@ -452,7 +483,7 @@ function routePolicyOf(route) {
|
|
|
452
483
|
}
|
|
453
484
|
|
|
454
485
|
// src/version.ts
|
|
455
|
-
var SDK_VERSION = "5.
|
|
486
|
+
var SDK_VERSION = "5.22.0";
|
|
456
487
|
|
|
457
488
|
// src/http.ts
|
|
458
489
|
var SDK_USER_AGENT = `astrasync-sdk/${SDK_VERSION}`;
|
|
@@ -1873,7 +1904,8 @@ var PLATFORM_AGENT_SIGNATURES = [
|
|
|
1873
1904
|
uaPatterns: [/claude/i, /anthropic/i],
|
|
1874
1905
|
agentCardPatterns: [/anthropic\.com/i, /claude\.ai/i],
|
|
1875
1906
|
apiKeyFormatPatterns: [/^sk-ant/i],
|
|
1876
|
-
headerPatterns: [/^anthropic-version/i, /^anthropic-beta/i, /^x-anthropic-/i]
|
|
1907
|
+
headerPatterns: [/^anthropic-version/i, /^anthropic-beta/i, /^x-anthropic-/i],
|
|
1908
|
+
wafLabelPatterns: [/\bclaude/i, /\banthropic/i]
|
|
1877
1909
|
},
|
|
1878
1910
|
{
|
|
1879
1911
|
vendor: "chatgpt",
|
|
@@ -1884,7 +1916,14 @@ var PLATFORM_AGENT_SIGNATURES = [
|
|
|
1884
1916
|
uaPatterns: [/chatgpt/i, /openai/i, /gpt-?\d/i, /\bGPTBot\b/i, /\bOAI-SearchBot\b/i],
|
|
1885
1917
|
agentCardPatterns: [/openai\.com/i, /chatgpt\.com/i],
|
|
1886
1918
|
apiKeyFormatPatterns: [/^sk-proj/i, /^sk-svcacct/i],
|
|
1887
|
-
headerPatterns: [
|
|
1919
|
+
headerPatterns: [
|
|
1920
|
+
/^openai-organization/i,
|
|
1921
|
+
/^openai-project/i,
|
|
1922
|
+
/^openai-version/i,
|
|
1923
|
+
// ChatGPT agent signs with Web Bot Auth under this directory host.
|
|
1924
|
+
/^signature-agent: "?https:\/\/chatgpt\.com/i
|
|
1925
|
+
],
|
|
1926
|
+
wafLabelPatterns: [/\bgptbot\b/i, /\bchatgpt/i, /\boai-searchbot\b/i, /\bopenai/i]
|
|
1888
1927
|
},
|
|
1889
1928
|
{
|
|
1890
1929
|
vendor: "gemini",
|
|
@@ -1905,7 +1944,8 @@ var PLATFORM_AGENT_SIGNATURES = [
|
|
|
1905
1944
|
],
|
|
1906
1945
|
agentCardPatterns: [/gemini\.google\.com/i, /ai\.google\.dev/i],
|
|
1907
1946
|
apiKeyFormatPatterns: [/^aiza/i],
|
|
1908
|
-
headerPatterns: [/^x-goog-user-project/i, /^x-goog-api-client/i]
|
|
1947
|
+
headerPatterns: [/^x-goog-user-project/i, /^x-goog-api-client/i],
|
|
1948
|
+
wafLabelPatterns: [/\bgoogle-extended\b/i, /\bgoogleother\b/i, /\bgemini/i]
|
|
1909
1949
|
},
|
|
1910
1950
|
{
|
|
1911
1951
|
vendor: "cursor",
|
|
@@ -1924,7 +1964,31 @@ var PLATFORM_AGENT_SIGNATURES = [
|
|
|
1924
1964
|
displayName: "Perplexity",
|
|
1925
1965
|
uaPatterns: [/perplexity/i],
|
|
1926
1966
|
agentCardPatterns: [/perplexity\.ai/i],
|
|
1927
|
-
apiKeyFormatPatterns: [/^pplx-/i]
|
|
1967
|
+
apiKeyFormatPatterns: [/^pplx-/i],
|
|
1968
|
+
wafLabelPatterns: [/\bperplexity/i]
|
|
1969
|
+
},
|
|
1970
|
+
// Round 30.1: xAI's documented crawlers (GrokBot/1.0, xAI-Grok/1.0,
|
|
1971
|
+
// Grok-DeepSearch/1.0). Anchored, versioned tokens — never in a stock UA.
|
|
1972
|
+
{
|
|
1973
|
+
vendor: "grok",
|
|
1974
|
+
displayName: "xAI Grok",
|
|
1975
|
+
uaPatterns: [/\bGrokBot\//i, /\bxAI-Grok\//i, /\bGrok-DeepSearch\//i],
|
|
1976
|
+
agentCardPatterns: [/\bx\.ai\b/i, /grok\.com/i],
|
|
1977
|
+
apiKeyFormatPatterns: [/^xai-/i],
|
|
1978
|
+
wafLabelPatterns: [/\bgrok/i, /\bxai\b/i]
|
|
1979
|
+
},
|
|
1980
|
+
// Round 30.1: Meta AI's index and fetch crawlers. facebookexternalhit
|
|
1981
|
+
// (link previews) is deliberately NOT here — it stays a generic crawler.
|
|
1982
|
+
{
|
|
1983
|
+
vendor: "meta-ai",
|
|
1984
|
+
displayName: "Meta AI",
|
|
1985
|
+
uaPatterns: [/\bMeta-WebIndexer\b/i, /\bMeta-ExternalFetcher\b/i],
|
|
1986
|
+
agentCardPatterns: [/meta\.ai/i],
|
|
1987
|
+
wafLabelPatterns: [
|
|
1988
|
+
/\bmeta-webindexer\b/i,
|
|
1989
|
+
/\bmeta-externalfetcher\b/i,
|
|
1990
|
+
/\bmeta-externalagent\b/i
|
|
1991
|
+
]
|
|
1928
1992
|
},
|
|
1929
1993
|
// Agentic browsers — versioned-token patterns ONLY (a stock Chrome UA must
|
|
1930
1994
|
// never match). Distinct vendor keys (not 'chatgpt'/'perplexity'): the
|
|
@@ -1972,6 +2036,7 @@ function matchPlatformSignature(signatures, input) {
|
|
|
1972
2036
|
const apiKeyFormat = input.apiKeyFormat ?? "";
|
|
1973
2037
|
const ja4 = input.ja4 ?? "";
|
|
1974
2038
|
const asn = input.asn ?? "";
|
|
2039
|
+
const wafLabels = input.wafLabels ?? [];
|
|
1975
2040
|
const headerLines = [];
|
|
1976
2041
|
if (input.platformHeaders) {
|
|
1977
2042
|
for (const [name, value] of Object.entries(input.platformHeaders)) {
|
|
@@ -1985,7 +2050,8 @@ function matchPlatformSignature(signatures, input) {
|
|
|
1985
2050
|
const headerMatch = headerLines.length > 0 && sig.headerPatterns?.some((p) => headerLines.some((line) => p.test(line)));
|
|
1986
2051
|
const ja4Match = ja4.length > 0 && sig.ja4Patterns?.some((p) => p.test(ja4));
|
|
1987
2052
|
const asnMatch = asn.length > 0 && sig.asnList?.includes(asn);
|
|
1988
|
-
|
|
2053
|
+
const wafMatch = wafLabels.length > 0 && sig.wafLabelPatterns?.some((p) => wafLabels.some((label) => p.test(label)));
|
|
2054
|
+
if (uaMatch || cardMatch || keyMatch || headerMatch || ja4Match || asnMatch || wafMatch) {
|
|
1989
2055
|
const uaBase = ua.split(/[\s/]/)[0]?.toLowerCase() ?? "";
|
|
1990
2056
|
const cardHost = (() => {
|
|
1991
2057
|
try {
|
|
@@ -1994,7 +2060,7 @@ function matchPlatformSignature(signatures, input) {
|
|
|
1994
2060
|
return "";
|
|
1995
2061
|
}
|
|
1996
2062
|
})();
|
|
1997
|
-
const keyBasis = uaBase || cardHost || apiKeyFormat || ja4 || asn && `asn${asn}` || "unknown";
|
|
2063
|
+
const keyBasis = uaBase || cardHost || apiKeyFormat || ja4 || asn && `asn${asn}` || wafMatch && `waf:${wafLabels[0]?.toLowerCase()}` || "unknown";
|
|
1998
2064
|
return {
|
|
1999
2065
|
vendor: sig.vendor,
|
|
2000
2066
|
fingerprintKey: `${sig.vendor}:${keyBasis}`,
|