@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.mjs
CHANGED
|
@@ -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();
|
|
@@ -434,7 +465,7 @@ function routePolicyOf(route) {
|
|
|
434
465
|
}
|
|
435
466
|
|
|
436
467
|
// src/version.ts
|
|
437
|
-
var SDK_VERSION = "5.
|
|
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: [
|
|
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,31 @@ 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]
|
|
1697
|
+
},
|
|
1698
|
+
// Round 30.1: xAI's documented crawlers (GrokBot/1.0, xAI-Grok/1.0,
|
|
1699
|
+
// Grok-DeepSearch/1.0). Anchored, versioned tokens — never in a stock UA.
|
|
1700
|
+
{
|
|
1701
|
+
vendor: "grok",
|
|
1702
|
+
displayName: "xAI Grok",
|
|
1703
|
+
uaPatterns: [/\bGrokBot\//i, /\bxAI-Grok\//i, /\bGrok-DeepSearch\//i],
|
|
1704
|
+
agentCardPatterns: [/\bx\.ai\b/i, /grok\.com/i],
|
|
1705
|
+
apiKeyFormatPatterns: [/^xai-/i],
|
|
1706
|
+
wafLabelPatterns: [/\bgrok/i, /\bxai\b/i]
|
|
1707
|
+
},
|
|
1708
|
+
// Round 30.1: Meta AI's index and fetch crawlers. facebookexternalhit
|
|
1709
|
+
// (link previews) is deliberately NOT here — it stays a generic crawler.
|
|
1710
|
+
{
|
|
1711
|
+
vendor: "meta-ai",
|
|
1712
|
+
displayName: "Meta AI",
|
|
1713
|
+
uaPatterns: [/\bMeta-WebIndexer\b/i, /\bMeta-ExternalFetcher\b/i],
|
|
1714
|
+
agentCardPatterns: [/meta\.ai/i],
|
|
1715
|
+
wafLabelPatterns: [
|
|
1716
|
+
/\bmeta-webindexer\b/i,
|
|
1717
|
+
/\bmeta-externalfetcher\b/i,
|
|
1718
|
+
/\bmeta-externalagent\b/i
|
|
1719
|
+
]
|
|
1656
1720
|
},
|
|
1657
1721
|
// Agentic browsers — versioned-token patterns ONLY (a stock Chrome UA must
|
|
1658
1722
|
// never match). Distinct vendor keys (not 'chatgpt'/'perplexity'): the
|
|
@@ -1700,6 +1764,7 @@ function matchPlatformSignature(signatures, input) {
|
|
|
1700
1764
|
const apiKeyFormat = input.apiKeyFormat ?? "";
|
|
1701
1765
|
const ja4 = input.ja4 ?? "";
|
|
1702
1766
|
const asn = input.asn ?? "";
|
|
1767
|
+
const wafLabels = input.wafLabels ?? [];
|
|
1703
1768
|
const headerLines = [];
|
|
1704
1769
|
if (input.platformHeaders) {
|
|
1705
1770
|
for (const [name, value] of Object.entries(input.platformHeaders)) {
|
|
@@ -1713,7 +1778,8 @@ function matchPlatformSignature(signatures, input) {
|
|
|
1713
1778
|
const headerMatch = headerLines.length > 0 && sig.headerPatterns?.some((p) => headerLines.some((line) => p.test(line)));
|
|
1714
1779
|
const ja4Match = ja4.length > 0 && sig.ja4Patterns?.some((p) => p.test(ja4));
|
|
1715
1780
|
const asnMatch = asn.length > 0 && sig.asnList?.includes(asn);
|
|
1716
|
-
|
|
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) {
|
|
1717
1783
|
const uaBase = ua.split(/[\s/]/)[0]?.toLowerCase() ?? "";
|
|
1718
1784
|
const cardHost = (() => {
|
|
1719
1785
|
try {
|
|
@@ -1722,7 +1788,7 @@ function matchPlatformSignature(signatures, input) {
|
|
|
1722
1788
|
return "";
|
|
1723
1789
|
}
|
|
1724
1790
|
})();
|
|
1725
|
-
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";
|
|
1726
1792
|
return {
|
|
1727
1793
|
vendor: sig.vendor,
|
|
1728
1794
|
fingerprintKey: `${sig.vendor}:${keyBasis}`,
|