@astrasyncai/verification-gateway 4.2.1 → 4.4.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/README.md +45 -21
- package/dist/adapter-interface/interface.d.mts +2 -2
- package/dist/adapter-interface/interface.d.ts +2 -2
- package/dist/adapters/express.d.mts +2 -2
- package/dist/adapters/express.d.ts +2 -2
- package/dist/adapters/express.js +145 -21
- package/dist/adapters/express.js.map +1 -1
- package/dist/adapters/express.mjs +145 -21
- package/dist/adapters/express.mjs.map +1 -1
- package/dist/adapters/mcp.d.mts +38 -30
- package/dist/adapters/mcp.d.ts +38 -30
- package/dist/adapters/mcp.js +72 -16
- package/dist/adapters/mcp.js.map +1 -1
- package/dist/adapters/mcp.mjs +72 -16
- package/dist/adapters/mcp.mjs.map +1 -1
- package/dist/adapters/nextjs.d.mts +2 -2
- package/dist/adapters/nextjs.d.ts +2 -2
- package/dist/adapters/nextjs.js +141 -19
- package/dist/adapters/nextjs.js.map +1 -1
- package/dist/adapters/nextjs.mjs +141 -19
- package/dist/adapters/nextjs.mjs.map +1 -1
- package/dist/adapters/sdk.d.mts +2 -2
- package/dist/adapters/sdk.d.ts +2 -2
- package/dist/adapters/sdk.js +24 -6
- package/dist/adapters/sdk.js.map +1 -1
- package/dist/adapters/sdk.mjs +24 -6
- package/dist/adapters/sdk.mjs.map +1 -1
- package/dist/agent/index.d.mts +2 -2
- package/dist/agent/index.d.ts +2 -2
- package/dist/agent/index.js +24 -3
- package/dist/agent/index.js.map +1 -1
- package/dist/agent/index.mjs +24 -3
- package/dist/agent/index.mjs.map +1 -1
- package/dist/bin/astrasync-claude-hook.js +22 -4
- package/dist/bin/astrasync-codex-hook.js +22 -4
- package/dist/bin/astrasync-guard.js +26 -8
- package/dist/bin/astrasync.js +76 -23
- package/dist/browser/background.js +22 -4
- package/dist/browser/background.js.map +1 -1
- package/dist/browser/background.mjs +22 -4
- package/dist/browser/background.mjs.map +1 -1
- package/dist/browser/browser-adapter.d.mts +2 -2
- package/dist/browser/browser-adapter.d.ts +2 -2
- package/dist/claude-code/claude-code-adapter.d.mts +2 -2
- package/dist/claude-code/claude-code-adapter.d.ts +2 -2
- package/dist/cli/index.d.mts +2 -2
- package/dist/cli/index.d.ts +2 -2
- package/dist/cli/index.js +23 -2
- package/dist/cli/index.js.map +1 -1
- package/dist/cli/index.mjs +23 -2
- package/dist/cli/index.mjs.map +1 -1
- package/dist/codex/index.d.mts +2 -2
- package/dist/codex/index.d.ts +2 -2
- package/dist/codex/index.js +22 -4
- package/dist/codex/index.js.map +1 -1
- package/dist/codex/index.mjs +22 -4
- package/dist/codex/index.mjs.map +1 -1
- package/dist/cursor/cursor-adapter.d.mts +2 -2
- package/dist/cursor/cursor-adapter.d.ts +2 -2
- package/dist/cursor/extension.d.mts +2 -2
- package/dist/cursor/extension.d.ts +2 -2
- package/dist/cursor/extension.js +22 -4
- package/dist/cursor/extension.js.map +1 -1
- package/dist/cursor/extension.mjs +22 -4
- package/dist/cursor/extension.mjs.map +1 -1
- package/dist/edge-config.d.mts +1 -1
- package/dist/edge-config.d.ts +1 -1
- package/dist/edge-config.js +24 -1
- package/dist/edge-config.js.map +1 -1
- package/dist/edge-config.mjs +22 -1
- package/dist/edge-config.mjs.map +1 -1
- package/dist/edge-core/index.d.mts +1 -1
- package/dist/edge-core/index.d.ts +1 -1
- package/dist/edge-core/index.js +121 -16
- package/dist/edge-core/index.js.map +1 -1
- package/dist/edge-core/index.mjs +121 -16
- package/dist/edge-core/index.mjs.map +1 -1
- package/dist/{express-D_4hTn5Z.d.mts → express-CR6F3njD.d.mts} +1 -1
- package/dist/{express-BVd1_3FE.d.ts → express-DaqL11tx.d.ts} +1 -1
- package/dist/gateway/gateway.d.mts +2 -2
- package/dist/gateway/gateway.d.ts +2 -2
- package/dist/gateway/gateway.js +22 -4
- package/dist/gateway/gateway.js.map +1 -1
- package/dist/gateway/gateway.mjs +22 -4
- package/dist/gateway/gateway.mjs.map +1 -1
- package/dist/git-trigger/git-hooks.d.mts +2 -2
- package/dist/git-trigger/git-hooks.d.ts +2 -2
- package/dist/{index-BqHKlLOU.d.ts → index-B5Ts1WtM.d.ts} +1 -1
- package/dist/{index-T1aBoUcc.d.ts → index-BfIxCYIZ.d.ts} +1 -1
- package/dist/{index-BTeQ9fgV.d.mts → index-Cub7lK-T.d.mts} +1 -1
- package/dist/{index-DQb5-_1X.d.mts → index-CwAh7Tln.d.mts} +1 -1
- package/dist/index.d.mts +58 -9
- package/dist/index.d.ts +58 -9
- package/dist/index.js +218 -54
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +214 -54
- package/dist/index.mjs.map +1 -1
- package/dist/local-evaluator/evaluator.d.mts +2 -2
- package/dist/local-evaluator/evaluator.d.ts +2 -2
- package/dist/metadata-capture.d.mts +35 -5
- package/dist/metadata-capture.d.ts +35 -5
- package/dist/metadata-capture.js +44 -6
- package/dist/metadata-capture.js.map +1 -1
- package/dist/metadata-capture.mjs +43 -6
- package/dist/metadata-capture.mjs.map +1 -1
- package/dist/{nextjs-w7RTbP1P.d.ts → nextjs-DL6uE1ye.d.ts} +1 -1
- package/dist/{nextjs-WyeVr2Kp.d.mts → nextjs-DlX6xwbU.d.mts} +1 -1
- package/dist/platform-signatures.d.mts +18 -1
- package/dist/platform-signatures.d.ts +18 -1
- package/dist/platform-signatures.js +35 -2
- package/dist/platform-signatures.js.map +1 -1
- package/dist/platform-signatures.mjs +35 -2
- package/dist/platform-signatures.mjs.map +1 -1
- package/dist/registration/index.js +25 -4
- package/dist/registration/index.js.map +1 -1
- package/dist/registration/index.mjs +25 -4
- package/dist/registration/index.mjs.map +1 -1
- package/dist/{sdk-CbTNIkAa.d.mts → sdk-Bbh9B_dw.d.mts} +1 -1
- package/dist/{sdk-QeX0Z8Ho.d.ts → sdk-C6SASmsh.d.ts} +1 -1
- package/dist/transport/index.d.mts +2 -2
- package/dist/transport/index.d.ts +2 -2
- package/dist/transport/index.js +22 -1
- package/dist/transport/index.js.map +1 -1
- package/dist/transport/index.mjs +22 -1
- package/dist/transport/index.mjs.map +1 -1
- package/dist/{types-r850cOt0.d.mts → types-C0zfSXMB.d.mts} +22 -0
- package/dist/{types-DqfPU5Bl.d.mts → types-C7Rb-w0d.d.mts} +1 -1
- package/dist/{types-sMxBT-nM.d.ts → types-DwSfO7Sb.d.ts} +22 -0
- package/dist/{types-BLUx92FJ.d.ts → types-nIh3HtuA.d.ts} +1 -1
- package/dist/ui/index.d.mts +1 -1
- package/dist/ui/index.d.ts +1 -1
- package/dist/verify.d.mts +1 -1
- package/dist/verify.d.ts +1 -1
- package/dist/verify.js +29 -11
- package/dist/verify.js.map +1 -1
- package/dist/verify.mjs +29 -11
- package/dist/verify.mjs.map +1 -1
- package/package.json +1 -1
package/dist/adapters/mcp.mjs
CHANGED
|
@@ -1,3 +1,24 @@
|
|
|
1
|
+
// src/version.ts
|
|
2
|
+
var SDK_VERSION = "4.4.0";
|
|
3
|
+
|
|
4
|
+
// src/http.ts
|
|
5
|
+
var SDK_USER_AGENT = `astrasync-sdk/${SDK_VERSION}`;
|
|
6
|
+
function withUserAgent(initHeaders) {
|
|
7
|
+
if (!initHeaders) return { "user-agent": SDK_USER_AGENT };
|
|
8
|
+
if (initHeaders instanceof Headers) {
|
|
9
|
+
const copy = new Headers(initHeaders);
|
|
10
|
+
if (!copy.has("user-agent")) copy.set("user-agent", SDK_USER_AGENT);
|
|
11
|
+
return copy;
|
|
12
|
+
}
|
|
13
|
+
if (Array.isArray(initHeaders)) {
|
|
14
|
+
const has2 = initHeaders.some(([name]) => name.toLowerCase() === "user-agent");
|
|
15
|
+
return has2 ? initHeaders : [...initHeaders, ["user-agent", SDK_USER_AGENT]];
|
|
16
|
+
}
|
|
17
|
+
const has = Object.keys(initHeaders).some((name) => name.toLowerCase() === "user-agent");
|
|
18
|
+
return has ? initHeaders : { "user-agent": SDK_USER_AGENT, ...initHeaders };
|
|
19
|
+
}
|
|
20
|
+
var sdkFetch = (input, init) => fetch(input, { ...init, headers: withUserAgent(init?.headers) });
|
|
21
|
+
|
|
1
22
|
// src/access-levels.ts
|
|
2
23
|
function getTrustLevel(score) {
|
|
3
24
|
if (score >= 80) return "PLATINUM";
|
|
@@ -6,9 +27,6 @@ function getTrustLevel(score) {
|
|
|
6
27
|
return "BRONZE";
|
|
7
28
|
}
|
|
8
29
|
|
|
9
|
-
// src/version.ts
|
|
10
|
-
var SDK_VERSION = "4.1.0";
|
|
11
|
-
|
|
12
30
|
// src/well-known.ts
|
|
13
31
|
var CACHE_TTL_MS = 60 * 60 * 1e3;
|
|
14
32
|
var cache = /* @__PURE__ */ new Map();
|
|
@@ -19,7 +37,7 @@ function wellKnownUrl(apiBaseUrl) {
|
|
|
19
37
|
}
|
|
20
38
|
async function fetchWellKnown(apiBaseUrl) {
|
|
21
39
|
const url = wellKnownUrl(apiBaseUrl);
|
|
22
|
-
const response = await
|
|
40
|
+
const response = await sdkFetch(url, {
|
|
23
41
|
method: "GET",
|
|
24
42
|
headers: { Accept: "application/json" },
|
|
25
43
|
signal: AbortSignal.timeout(5e3)
|
|
@@ -89,7 +107,7 @@ async function performInitCheck(apiBaseUrl, debug, strictInit, apiKey) {
|
|
|
89
107
|
initCheckPerformed = true;
|
|
90
108
|
try {
|
|
91
109
|
const probeUrl = `${apiBaseUrl}/agents/verify-access`;
|
|
92
|
-
const response = await
|
|
110
|
+
const response = await sdkFetch(probeUrl, { method: "HEAD" });
|
|
93
111
|
const contentType = response.headers.get("content-type") ?? "";
|
|
94
112
|
if (contentType.startsWith("text/html")) {
|
|
95
113
|
const message = `[VerificationGateway] apiBaseUrl '${apiBaseUrl}' returned HTML (content-type: ${contentType}). This usually means apiBaseUrl is pointing at a marketing site instead of the API. Expected: 'https://astrasync.ai/api' (prod) or 'https://staging.astrasync.ai/api' (staging).`;
|
|
@@ -103,7 +121,7 @@ async function performInitCheck(apiBaseUrl, debug, strictInit, apiKey) {
|
|
|
103
121
|
);
|
|
104
122
|
}
|
|
105
123
|
if (apiKey) {
|
|
106
|
-
const selfCheck = await
|
|
124
|
+
const selfCheck = await sdkFetch(`${apiBaseUrl}/agents/verify-access/self-check`, {
|
|
107
125
|
headers: { Authorization: `Bearer ${apiKey}` }
|
|
108
126
|
});
|
|
109
127
|
if (selfCheck.status === 401) {
|
|
@@ -350,7 +368,7 @@ async function callVerifyAccessAPI(config, request) {
|
|
|
350
368
|
headers["X-API-Key"] = config.apiKey;
|
|
351
369
|
}
|
|
352
370
|
try {
|
|
353
|
-
const response = await
|
|
371
|
+
const response = await sdkFetch(`${config.apiBaseUrl}/agents/verify-access`, {
|
|
354
372
|
method: "POST",
|
|
355
373
|
headers,
|
|
356
374
|
body: JSON.stringify(body),
|
|
@@ -593,7 +611,7 @@ async function recordDecision(config, sessionId, decision, reason) {
|
|
|
593
611
|
headers["Authorization"] = `Bearer ${config.apiKey}`;
|
|
594
612
|
headers["X-API-Key"] = config.apiKey;
|
|
595
613
|
}
|
|
596
|
-
await
|
|
614
|
+
await sdkFetch(`${config.apiBaseUrl}/agents/verify-access/${sessionId}/decision`, {
|
|
597
615
|
method: "POST",
|
|
598
616
|
headers,
|
|
599
617
|
body: JSON.stringify({ decision, reason })
|
|
@@ -611,7 +629,9 @@ var SECRET_HEADER_NAMES = /* @__PURE__ */ new Set([
|
|
|
611
629
|
"x-astrasync-signature",
|
|
612
630
|
"x-astrasync-secret",
|
|
613
631
|
"x-hub-signature",
|
|
614
|
-
"x-hub-signature-256"
|
|
632
|
+
"x-hub-signature-256",
|
|
633
|
+
// Short-lived verify dedupe token — must never persist in stored metadata.
|
|
634
|
+
"x-astra-verified-hop"
|
|
615
635
|
]);
|
|
616
636
|
var SECRET_HEADER_PREFIXES = ["x-astrasync-", "kya-", "kya_"];
|
|
617
637
|
var CREDENTIAL_HEADER_NAMES = /* @__PURE__ */ new Set([
|
|
@@ -636,7 +656,13 @@ var PLATFORM_HEADER_NAMES = /* @__PURE__ */ new Set([
|
|
|
636
656
|
"x-agent-card-url",
|
|
637
657
|
"x-agent-provider"
|
|
638
658
|
]);
|
|
639
|
-
var PLATFORM_HEADER_PREFIXES = [
|
|
659
|
+
var PLATFORM_HEADER_PREFIXES = [
|
|
660
|
+
"x-goog-",
|
|
661
|
+
"x-stainless-",
|
|
662
|
+
"x-anthropic-",
|
|
663
|
+
"x-openai-",
|
|
664
|
+
"sec-ch-"
|
|
665
|
+
];
|
|
640
666
|
var KEY_FORMAT_PREFIXES = [
|
|
641
667
|
"sk-ant-api03",
|
|
642
668
|
"sk-ant-api",
|
|
@@ -708,6 +734,7 @@ function sanitizeHeaders(raw) {
|
|
|
708
734
|
const headers = {};
|
|
709
735
|
const platformHeaders = {};
|
|
710
736
|
let apiKeyFormat;
|
|
737
|
+
let cookieCount;
|
|
711
738
|
let totalBytes = 0;
|
|
712
739
|
let count = 0;
|
|
713
740
|
if (!raw) return { headers };
|
|
@@ -722,6 +749,9 @@ function sanitizeHeaders(raw) {
|
|
|
722
749
|
if (fmt && !apiKeyFormat) apiKeyFormat = fmt;
|
|
723
750
|
continue;
|
|
724
751
|
}
|
|
752
|
+
if (name === "cookie") {
|
|
753
|
+
cookieCount = joined.split(";").filter((s) => s.trim().length > 0).length;
|
|
754
|
+
}
|
|
725
755
|
if (isSecretHeader(name)) continue;
|
|
726
756
|
let value = joined;
|
|
727
757
|
if (byteLength(value) > MAX_HEADER_VALUE_BYTES) {
|
|
@@ -737,6 +767,7 @@ function sanitizeHeaders(raw) {
|
|
|
737
767
|
const result = { headers };
|
|
738
768
|
if (apiKeyFormat) result.apiKeyFormat = apiKeyFormat;
|
|
739
769
|
if (Object.keys(platformHeaders).length > 0) result.platformHeaders = platformHeaders;
|
|
770
|
+
if (cookieCount !== void 0) result.cookieCount = cookieCount;
|
|
740
771
|
return result;
|
|
741
772
|
}
|
|
742
773
|
var CONNECTION_HEADER_SOURCES = [
|
|
@@ -746,16 +777,28 @@ var CONNECTION_HEADER_SOURCES = [
|
|
|
746
777
|
["cf-ipcountry", "x-vercel-ip-country", "cloudfront-viewer-country", "fastly-geo-country"]
|
|
747
778
|
],
|
|
748
779
|
["region", ["x-vercel-ip-country-region", "cloudfront-viewer-country-region"]],
|
|
780
|
+
["countryRegionName", ["cloudfront-viewer-country-region-name"]],
|
|
749
781
|
["city", ["x-vercel-ip-city", "cloudfront-viewer-city"]],
|
|
782
|
+
["latitude", ["x-vercel-ip-latitude", "cloudfront-viewer-latitude"]],
|
|
783
|
+
["longitude", ["x-vercel-ip-longitude", "cloudfront-viewer-longitude"]],
|
|
784
|
+
["postalCode", ["x-vercel-ip-postal-code", "cloudfront-viewer-postal-code"]],
|
|
750
785
|
["asn", ["cloudfront-viewer-asn"]],
|
|
751
786
|
["tlsVersion", ["cloudfront-viewer-tls"]],
|
|
752
787
|
["httpVersion", ["cloudfront-viewer-http-version"]],
|
|
788
|
+
["timeZone", ["x-vercel-ip-timezone", "cloudfront-viewer-time-zone"]],
|
|
789
|
+
["metroCode", ["cloudfront-viewer-metro-code"]],
|
|
753
790
|
// TLS fingerprints can only be computed where TLS terminates. When a CDN
|
|
754
791
|
// terminates TLS in front of the merchant, its fingerprint headers ARE the
|
|
755
792
|
// connection-layer truth — normalising them here is the permanent design.
|
|
756
|
-
|
|
757
|
-
|
|
793
|
+
// CloudFront delivers JA3/JA4 only via an origin request policy and only
|
|
794
|
+
// for HTTPS viewer connections.
|
|
795
|
+
["tlsFingerprint", ["cf-ja3-hash", "cloudfront-viewer-ja3-fingerprint"]],
|
|
796
|
+
["ja4", ["cf-ja4", "cloudfront-viewer-ja4-fingerprint"]],
|
|
797
|
+
// Header-structure fingerprint: browser/SDK-distinctive header ordering.
|
|
798
|
+
["headerOrder", ["cloudfront-viewer-header-order"]],
|
|
799
|
+
["headerCount", ["cloudfront-viewer-header-count"]]
|
|
758
800
|
];
|
|
801
|
+
var MAX_CONNECTION_VALUE_CHARS = 256;
|
|
759
802
|
function deriveConnectionFromHeaders(headers) {
|
|
760
803
|
if (!headers) return void 0;
|
|
761
804
|
const lower = {};
|
|
@@ -768,20 +811,30 @@ function deriveConnectionFromHeaders(headers) {
|
|
|
768
811
|
for (const source of sources) {
|
|
769
812
|
const value = lower[source]?.trim();
|
|
770
813
|
if (value) {
|
|
771
|
-
connection[key] = value;
|
|
814
|
+
connection[key] = value.slice(0, MAX_CONNECTION_VALUE_CHARS);
|
|
772
815
|
break;
|
|
773
816
|
}
|
|
774
817
|
}
|
|
775
818
|
}
|
|
819
|
+
{
|
|
820
|
+
const addr = lower["cloudfront-viewer-address"]?.trim();
|
|
821
|
+
const portMatch = addr?.match(/:(\d+)$/);
|
|
822
|
+
if (portMatch) connection.sourcePort = portMatch[1];
|
|
823
|
+
if (!connection.ip && addr) connection.ip = addr.replace(/:\d+$/, "");
|
|
824
|
+
}
|
|
776
825
|
if (!connection.ip) {
|
|
777
826
|
const xff = lower["x-forwarded-for"];
|
|
778
827
|
const client = xff?.split(",")[0]?.trim();
|
|
779
828
|
if (client) connection.ip = client;
|
|
780
829
|
}
|
|
830
|
+
if (!connection.tlsCipher) {
|
|
831
|
+
const cipher = connection.tlsVersion?.split(":")[1];
|
|
832
|
+
if (cipher) connection.tlsCipher = cipher;
|
|
833
|
+
}
|
|
781
834
|
return Object.keys(connection).length > 0 ? connection : void 0;
|
|
782
835
|
}
|
|
783
836
|
function buildSdkObservedMetadata(rawHeaders) {
|
|
784
|
-
const { headers, apiKeyFormat, platformHeaders } = sanitizeHeaders(rawHeaders);
|
|
837
|
+
const { headers, apiKeyFormat, platformHeaders, cookieCount } = sanitizeHeaders(rawHeaders);
|
|
785
838
|
const flat = {};
|
|
786
839
|
if (rawHeaders) {
|
|
787
840
|
for (const name of Object.keys(rawHeaders)) {
|
|
@@ -796,6 +849,7 @@ function buildSdkObservedMetadata(rawHeaders) {
|
|
|
796
849
|
...apiKeyFormat && { apiKeyFormat },
|
|
797
850
|
...platformHeaders && { platformHeaders },
|
|
798
851
|
...connection && { connection },
|
|
852
|
+
...cookieCount !== void 0 && { cookieCount },
|
|
799
853
|
schemaVersion: CAPTURE_SCHEMA_VERSION
|
|
800
854
|
};
|
|
801
855
|
}
|
|
@@ -827,7 +881,7 @@ function resolvePollUrl(config, pollUrl) {
|
|
|
827
881
|
async function pollStepUpStatus(config, approval) {
|
|
828
882
|
if (!approval.pollUrl) return null;
|
|
829
883
|
try {
|
|
830
|
-
const res = await
|
|
884
|
+
const res = await sdkFetch(resolvePollUrl(config, approval.pollUrl), {
|
|
831
885
|
method: "GET",
|
|
832
886
|
signal: AbortSignal.timeout(POLL_REQUEST_TIMEOUT_MS)
|
|
833
887
|
});
|
|
@@ -871,7 +925,7 @@ async function awaitStepUpApproval(config, approval) {
|
|
|
871
925
|
return "timeout";
|
|
872
926
|
}
|
|
873
927
|
|
|
874
|
-
// src/
|
|
928
|
+
// src/verified-hop.ts
|
|
875
929
|
var MCP_VERIFIED_HOP_HEADER = "X-Astra-Verified-Hop";
|
|
876
930
|
var MCP_VERIFIED_HOP_MAX_AGE_MS = 6e4;
|
|
877
931
|
function serializeVerifiedHop(marker) {
|
|
@@ -898,6 +952,8 @@ function isVerifiedHopValidFor(marker, expectedAstraId, opts = {}) {
|
|
|
898
952
|
const now = opts.now ?? Date.now();
|
|
899
953
|
return now - marker.checkedAt <= maxAge && now >= marker.checkedAt;
|
|
900
954
|
}
|
|
955
|
+
|
|
956
|
+
// src/transport/mcp-server.ts
|
|
901
957
|
function parseMcpJsonRpc(body) {
|
|
902
958
|
if (!body || typeof body !== "object" || Array.isArray(body)) return null;
|
|
903
959
|
const obj = body;
|