@astrasyncai/verification-gateway 4.0.0 → 4.2.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 +106 -29
- 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 +398 -15
- package/dist/adapters/express.js.map +1 -1
- package/dist/adapters/express.mjs +398 -15
- package/dist/adapters/express.mjs.map +1 -1
- package/dist/adapters/http-pdlss.d.mts +3 -3
- package/dist/adapters/http-pdlss.d.ts +3 -3
- package/dist/adapters/http-pdlss.js.map +1 -1
- package/dist/adapters/http-pdlss.mjs.map +1 -1
- package/dist/adapters/mcp.d.mts +56 -36
- package/dist/adapters/mcp.d.ts +56 -36
- package/dist/adapters/mcp.js +220 -3
- package/dist/adapters/mcp.js.map +1 -1
- package/dist/adapters/mcp.mjs +220 -3
- 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 +433 -18
- package/dist/adapters/nextjs.js.map +1 -1
- package/dist/adapters/nextjs.mjs +433 -18
- 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 +2 -2
- package/dist/adapters/sdk.js.map +1 -1
- package/dist/adapters/sdk.mjs +2 -2
- 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.map +1 -1
- package/dist/agent/index.mjs.map +1 -1
- package/dist/bin/astrasync-claude-hook.js +13 -13
- package/dist/bin/astrasync-codex-hook.js +13 -13
- package/dist/bin/astrasync-guard.js +100 -13
- package/dist/bin/astrasync.js +168 -27
- package/dist/browser/background.js +13 -13
- package/dist/browser/background.js.map +1 -1
- package/dist/browser/background.mjs +13 -13
- 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/codex/index.d.mts +3 -3
- package/dist/codex/index.d.ts +3 -3
- package/dist/codex/index.js +24 -13
- package/dist/codex/index.js.map +1 -1
- package/dist/codex/index.mjs +24 -13
- 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 +13 -13
- package/dist/cursor/extension.js.map +1 -1
- package/dist/cursor/extension.mjs +13 -13
- package/dist/cursor/extension.mjs.map +1 -1
- package/dist/edge-config.d.mts +22 -7
- package/dist/edge-config.d.ts +22 -7
- package/dist/edge-config.js.map +1 -1
- package/dist/edge-config.mjs.map +1 -1
- package/dist/edge-core/index.d.mts +425 -0
- package/dist/edge-core/index.d.ts +425 -0
- package/dist/edge-core/index.js +1482 -0
- package/dist/edge-core/index.js.map +1 -0
- package/dist/edge-core/index.mjs +1437 -0
- package/dist/edge-core/index.mjs.map +1 -0
- package/dist/{express-BZajRs4i.d.mts → express-BVd1_3FE.d.ts} +9 -7
- package/dist/{express-CjCUB1k7.d.ts → express-D_4hTn5Z.d.mts} +9 -7
- package/dist/gateway/gateway.d.mts +2 -2
- package/dist/gateway/gateway.d.ts +2 -2
- package/dist/gateway/gateway.js +13 -13
- package/dist/gateway/gateway.js.map +1 -1
- package/dist/gateway/gateway.mjs +13 -13
- 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-adgKhujR.d.ts → index-B0YHu_SP.d.ts} +30 -27
- package/dist/{index-B0cyMZDL.d.mts → index-BPEBlOsE.d.mts} +30 -27
- package/dist/{index-BRYteOqO.d.mts → index-DQb5-_1X.d.mts} +1 -1
- package/dist/{index-BZQdVqNw.d.ts → index-T1aBoUcc.d.ts} +1 -1
- package/dist/index.d.mts +11 -11
- package/dist/index.d.ts +11 -11
- package/dist/index.js +477 -265
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +474 -265
- 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 +63 -4
- package/dist/metadata-capture.d.ts +63 -4
- package/dist/metadata-capture.js +67 -0
- package/dist/metadata-capture.js.map +1 -1
- package/dist/metadata-capture.mjs +64 -0
- package/dist/metadata-capture.mjs.map +1 -1
- package/dist/{nextjs-DeUTnOBd.d.mts → nextjs-WyeVr2Kp.d.mts} +3 -3
- package/dist/{nextjs-D_iFf5k-.d.ts → nextjs-w7RTbP1P.d.ts} +3 -3
- package/dist/platform-signatures.d.mts +5 -6
- package/dist/platform-signatures.d.ts +5 -6
- package/dist/platform-signatures.js.map +1 -1
- package/dist/platform-signatures.mjs.map +1 -1
- package/dist/registration/index.d.mts +10 -11
- package/dist/registration/index.d.ts +10 -11
- package/dist/registration/index.js.map +1 -1
- package/dist/registration/index.mjs.map +1 -1
- package/dist/{sdk-BM3mwEAq.d.ts → sdk-CbTNIkAa.d.mts} +4 -4
- package/dist/{sdk-_il1Q41f.d.mts → sdk-QeX0Z8Ho.d.ts} +4 -4
- package/dist/transport/index.d.mts +2 -2
- package/dist/transport/index.d.ts +2 -2
- package/dist/transport/index.js.map +1 -1
- package/dist/transport/index.mjs.map +1 -1
- package/dist/{types-CHKCgDFC.d.ts → types-BLUx92FJ.d.ts} +1 -1
- package/dist/{types-DfnP7JiM.d.mts → types-DqfPU5Bl.d.mts} +1 -1
- package/dist/{types-BcDf9Kk0.d.mts → types-r850cOt0.d.mts} +106 -88
- package/dist/{types-fTQD448H.d.ts → types-sMxBT-nM.d.ts} +106 -88
- package/dist/ui/index.d.mts +11 -7
- package/dist/ui/index.d.ts +11 -7
- package/dist/ui/index.js +13 -9
- package/dist/ui/index.js.map +1 -1
- package/dist/ui/index.mjs +10 -8
- package/dist/ui/index.mjs.map +1 -1
- package/dist/verify.d.mts +8 -7
- package/dist/verify.d.ts +8 -7
- 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 +8 -2
package/dist/adapters/mcp.js
CHANGED
|
@@ -40,7 +40,7 @@ function getTrustLevel(score) {
|
|
|
40
40
|
}
|
|
41
41
|
|
|
42
42
|
// src/version.ts
|
|
43
|
-
var SDK_VERSION = "4.
|
|
43
|
+
var SDK_VERSION = "4.1.0";
|
|
44
44
|
|
|
45
45
|
// src/well-known.ts
|
|
46
46
|
var CACHE_TTL_MS = 60 * 60 * 1e3;
|
|
@@ -634,6 +634,205 @@ async function recordDecision(config, sessionId, decision, reason) {
|
|
|
634
634
|
});
|
|
635
635
|
}
|
|
636
636
|
|
|
637
|
+
// src/metadata-capture.ts
|
|
638
|
+
var CAPTURE_SCHEMA_VERSION = 1;
|
|
639
|
+
var SECRET_HEADER_NAMES = /* @__PURE__ */ new Set([
|
|
640
|
+
"cookie",
|
|
641
|
+
"set-cookie",
|
|
642
|
+
"x-csrf-token",
|
|
643
|
+
"proxy-authorization",
|
|
644
|
+
"x-astrasync-signature",
|
|
645
|
+
"x-astrasync-secret",
|
|
646
|
+
"x-hub-signature",
|
|
647
|
+
"x-hub-signature-256"
|
|
648
|
+
]);
|
|
649
|
+
var SECRET_HEADER_PREFIXES = ["x-astrasync-", "kya-", "kya_"];
|
|
650
|
+
var CREDENTIAL_HEADER_NAMES = /* @__PURE__ */ new Set([
|
|
651
|
+
"authorization",
|
|
652
|
+
"x-api-key",
|
|
653
|
+
"x-goog-api-key",
|
|
654
|
+
"api-key"
|
|
655
|
+
]);
|
|
656
|
+
function isSignatureHeader(name) {
|
|
657
|
+
return name === "signature" || name.endsWith("-signature") || name.endsWith("-signature-256");
|
|
658
|
+
}
|
|
659
|
+
var PLATFORM_HEADER_NAMES = /* @__PURE__ */ new Set([
|
|
660
|
+
"openai-organization",
|
|
661
|
+
"openai-project",
|
|
662
|
+
"openai-version",
|
|
663
|
+
"openai-processing-ms",
|
|
664
|
+
"anthropic-version",
|
|
665
|
+
"anthropic-beta",
|
|
666
|
+
"x-goog-user-project",
|
|
667
|
+
"x-goog-api-client",
|
|
668
|
+
"user-agent",
|
|
669
|
+
"x-agent-card-url",
|
|
670
|
+
"x-agent-provider"
|
|
671
|
+
]);
|
|
672
|
+
var PLATFORM_HEADER_PREFIXES = ["x-goog-", "x-stainless-", "x-anthropic-", "x-openai-"];
|
|
673
|
+
var KEY_FORMAT_PREFIXES = [
|
|
674
|
+
"sk-ant-api03",
|
|
675
|
+
"sk-ant-api",
|
|
676
|
+
"sk-ant",
|
|
677
|
+
"sk-proj",
|
|
678
|
+
"sk-svcacct",
|
|
679
|
+
"sk-or-v1",
|
|
680
|
+
"sk-or",
|
|
681
|
+
"sk-lf",
|
|
682
|
+
"sk-",
|
|
683
|
+
"gsk_",
|
|
684
|
+
"aiza",
|
|
685
|
+
"ya29",
|
|
686
|
+
"ghp_",
|
|
687
|
+
"gho_",
|
|
688
|
+
"github_pat_",
|
|
689
|
+
"xai-",
|
|
690
|
+
"pplx-",
|
|
691
|
+
"r8_",
|
|
692
|
+
"hf_",
|
|
693
|
+
"astra-",
|
|
694
|
+
"astrae-"
|
|
695
|
+
];
|
|
696
|
+
var MAX_HEADERS = 64;
|
|
697
|
+
var MAX_HEADER_VALUE_BYTES = 1024;
|
|
698
|
+
var MAX_TOTAL_BYTES = 16 * 1024;
|
|
699
|
+
function byteLength(s) {
|
|
700
|
+
let bytes = 0;
|
|
701
|
+
for (let i = 0; i < s.length; i++) {
|
|
702
|
+
const code = s.charCodeAt(i);
|
|
703
|
+
if (code < 128) bytes += 1;
|
|
704
|
+
else if (code < 2048) bytes += 2;
|
|
705
|
+
else if (code >= 55296 && code <= 56319) {
|
|
706
|
+
bytes += 4;
|
|
707
|
+
i++;
|
|
708
|
+
} else bytes += 3;
|
|
709
|
+
}
|
|
710
|
+
return bytes;
|
|
711
|
+
}
|
|
712
|
+
function extractApiKeyFormat(rawValue) {
|
|
713
|
+
if (!rawValue) return void 0;
|
|
714
|
+
let value = rawValue.trim();
|
|
715
|
+
const spaceIdx = value.indexOf(" ");
|
|
716
|
+
if (spaceIdx > 0) {
|
|
717
|
+
const scheme = value.slice(0, spaceIdx).toLowerCase();
|
|
718
|
+
if (scheme === "bearer" || scheme === "basic" || scheme === "token") {
|
|
719
|
+
value = value.slice(spaceIdx + 1).trim();
|
|
720
|
+
}
|
|
721
|
+
}
|
|
722
|
+
const lower = value.toLowerCase();
|
|
723
|
+
for (const prefix of KEY_FORMAT_PREFIXES) {
|
|
724
|
+
if (lower.startsWith(prefix)) {
|
|
725
|
+
return prefix;
|
|
726
|
+
}
|
|
727
|
+
}
|
|
728
|
+
return void 0;
|
|
729
|
+
}
|
|
730
|
+
function isSecretHeader(name) {
|
|
731
|
+
if (SECRET_HEADER_NAMES.has(name)) return true;
|
|
732
|
+
if (SECRET_HEADER_PREFIXES.some((p) => name.startsWith(p))) return true;
|
|
733
|
+
if (isSignatureHeader(name)) return true;
|
|
734
|
+
return false;
|
|
735
|
+
}
|
|
736
|
+
function isPlatformHeader(name) {
|
|
737
|
+
if (PLATFORM_HEADER_NAMES.has(name)) return true;
|
|
738
|
+
return PLATFORM_HEADER_PREFIXES.some((p) => name.startsWith(p));
|
|
739
|
+
}
|
|
740
|
+
function sanitizeHeaders(raw) {
|
|
741
|
+
const headers = {};
|
|
742
|
+
const platformHeaders = {};
|
|
743
|
+
let apiKeyFormat;
|
|
744
|
+
let totalBytes = 0;
|
|
745
|
+
let count = 0;
|
|
746
|
+
if (!raw) return { headers };
|
|
747
|
+
for (const rawName of Object.keys(raw)) {
|
|
748
|
+
if (count >= MAX_HEADERS) break;
|
|
749
|
+
const name = rawName.toLowerCase();
|
|
750
|
+
const rawValue = raw[rawName];
|
|
751
|
+
if (rawValue === void 0) continue;
|
|
752
|
+
const joined = Array.isArray(rawValue) ? rawValue.join(", ") : String(rawValue);
|
|
753
|
+
if (CREDENTIAL_HEADER_NAMES.has(name)) {
|
|
754
|
+
const fmt = extractApiKeyFormat(joined);
|
|
755
|
+
if (fmt && !apiKeyFormat) apiKeyFormat = fmt;
|
|
756
|
+
continue;
|
|
757
|
+
}
|
|
758
|
+
if (isSecretHeader(name)) continue;
|
|
759
|
+
let value = joined;
|
|
760
|
+
if (byteLength(value) > MAX_HEADER_VALUE_BYTES) {
|
|
761
|
+
value = value.slice(0, MAX_HEADER_VALUE_BYTES);
|
|
762
|
+
}
|
|
763
|
+
const entryBytes = byteLength(name) + byteLength(value);
|
|
764
|
+
if (totalBytes + entryBytes > MAX_TOTAL_BYTES) continue;
|
|
765
|
+
totalBytes += entryBytes;
|
|
766
|
+
count++;
|
|
767
|
+
headers[name] = value;
|
|
768
|
+
if (isPlatformHeader(name)) platformHeaders[name] = value;
|
|
769
|
+
}
|
|
770
|
+
const result = { headers };
|
|
771
|
+
if (apiKeyFormat) result.apiKeyFormat = apiKeyFormat;
|
|
772
|
+
if (Object.keys(platformHeaders).length > 0) result.platformHeaders = platformHeaders;
|
|
773
|
+
return result;
|
|
774
|
+
}
|
|
775
|
+
var CONNECTION_HEADER_SOURCES = [
|
|
776
|
+
["ip", ["cf-connecting-ip", "fastly-client-ip", "true-client-ip", "x-real-ip"]],
|
|
777
|
+
[
|
|
778
|
+
"country",
|
|
779
|
+
["cf-ipcountry", "x-vercel-ip-country", "cloudfront-viewer-country", "fastly-geo-country"]
|
|
780
|
+
],
|
|
781
|
+
["region", ["x-vercel-ip-country-region", "cloudfront-viewer-country-region"]],
|
|
782
|
+
["city", ["x-vercel-ip-city", "cloudfront-viewer-city"]],
|
|
783
|
+
["asn", ["cloudfront-viewer-asn"]],
|
|
784
|
+
["tlsVersion", ["cloudfront-viewer-tls"]],
|
|
785
|
+
["httpVersion", ["cloudfront-viewer-http-version"]],
|
|
786
|
+
// TLS fingerprints can only be computed where TLS terminates. When a CDN
|
|
787
|
+
// terminates TLS in front of the merchant, its fingerprint headers ARE the
|
|
788
|
+
// connection-layer truth — normalising them here is the permanent design.
|
|
789
|
+
["tlsFingerprint", ["cf-ja3-hash"]],
|
|
790
|
+
["ja4", ["cf-ja4"]]
|
|
791
|
+
];
|
|
792
|
+
function deriveConnectionFromHeaders(headers) {
|
|
793
|
+
if (!headers) return void 0;
|
|
794
|
+
const lower = {};
|
|
795
|
+
for (const name of Object.keys(headers)) {
|
|
796
|
+
const value = headers[name];
|
|
797
|
+
if (typeof value === "string" && value.length > 0) lower[name.toLowerCase()] = value;
|
|
798
|
+
}
|
|
799
|
+
const connection = {};
|
|
800
|
+
for (const [key, sources] of CONNECTION_HEADER_SOURCES) {
|
|
801
|
+
for (const source of sources) {
|
|
802
|
+
const value = lower[source]?.trim();
|
|
803
|
+
if (value) {
|
|
804
|
+
connection[key] = value;
|
|
805
|
+
break;
|
|
806
|
+
}
|
|
807
|
+
}
|
|
808
|
+
}
|
|
809
|
+
if (!connection.ip) {
|
|
810
|
+
const xff = lower["x-forwarded-for"];
|
|
811
|
+
const client = xff?.split(",")[0]?.trim();
|
|
812
|
+
if (client) connection.ip = client;
|
|
813
|
+
}
|
|
814
|
+
return Object.keys(connection).length > 0 ? connection : void 0;
|
|
815
|
+
}
|
|
816
|
+
function buildSdkObservedMetadata(rawHeaders) {
|
|
817
|
+
const { headers, apiKeyFormat, platformHeaders } = sanitizeHeaders(rawHeaders);
|
|
818
|
+
const flat = {};
|
|
819
|
+
if (rawHeaders) {
|
|
820
|
+
for (const name of Object.keys(rawHeaders)) {
|
|
821
|
+
const value = rawHeaders[name];
|
|
822
|
+
if (value === void 0) continue;
|
|
823
|
+
flat[name.toLowerCase()] = Array.isArray(value) ? value.join(", ") : String(value);
|
|
824
|
+
}
|
|
825
|
+
}
|
|
826
|
+
const connection = deriveConnectionFromHeaders(flat);
|
|
827
|
+
return {
|
|
828
|
+
headers,
|
|
829
|
+
...apiKeyFormat && { apiKeyFormat },
|
|
830
|
+
...platformHeaders && { platformHeaders },
|
|
831
|
+
...connection && { connection },
|
|
832
|
+
schemaVersion: CAPTURE_SCHEMA_VERSION
|
|
833
|
+
};
|
|
834
|
+
}
|
|
835
|
+
|
|
637
836
|
// src/adapters/approval-gate.ts
|
|
638
837
|
var APPROVAL_REASON = "Transaction is above the autonomous limit and requires human approval. The agent owner can approve or deny this transaction in the AstraSync dashboard.";
|
|
639
838
|
function requiresHumanApproval(result) {
|
|
@@ -812,8 +1011,11 @@ function mcpToPdlss(parsed, requestPath, headerPurpose, headerAction, toolGate)
|
|
|
812
1011
|
} else if (parsed.actionFromBody && parsed.actionSourceFromBody) {
|
|
813
1012
|
action = parsed.actionFromBody;
|
|
814
1013
|
actionSource = parsed.actionSourceFromBody;
|
|
1014
|
+
} else if (parsed.method === "tools/call") {
|
|
1015
|
+
action = void 0;
|
|
1016
|
+
actionSource = void 0;
|
|
815
1017
|
} else {
|
|
816
|
-
action = parsed.toolName ?
|
|
1018
|
+
action = parsed.toolName ? `${parsed.method}:${parsed.toolName}` : parsed.method;
|
|
817
1019
|
actionSource = "transport_layer";
|
|
818
1020
|
}
|
|
819
1021
|
return { purpose, action, resource, purposeSource, actionSource };
|
|
@@ -928,6 +1130,15 @@ function createMcpMiddleware(options) {
|
|
|
928
1130
|
prefetchWellKnown(config.apiBaseUrl).catch(() => {
|
|
929
1131
|
});
|
|
930
1132
|
}
|
|
1133
|
+
if (toolGates) {
|
|
1134
|
+
for (const [toolName, gate] of Object.entries(toolGates)) {
|
|
1135
|
+
if (typeof gate === "string") {
|
|
1136
|
+
console.warn(
|
|
1137
|
+
`[VerificationGateway/MCP] toolGates['${toolName}'] uses the bare-string shorthand ('${gate}'). Gated tools need a PDLSS purpose (else PDLSS_PURPOSE_REQUIRED 400) and evaluate purpose-only without a declared action. Use the object form instead: { minAccessLevel: '${gate}', purpose: '...', action: '...' }.`
|
|
1138
|
+
);
|
|
1139
|
+
}
|
|
1140
|
+
}
|
|
1141
|
+
}
|
|
931
1142
|
return async (req, res, next) => {
|
|
932
1143
|
try {
|
|
933
1144
|
if (skip) return next();
|
|
@@ -1047,7 +1258,13 @@ function createMcpMiddleware(options) {
|
|
|
1047
1258
|
callerMetadata: {
|
|
1048
1259
|
sourceIp: req.ip,
|
|
1049
1260
|
userAgent: req.headers["user-agent"],
|
|
1050
|
-
host: req.headers.host
|
|
1261
|
+
host: req.headers.host,
|
|
1262
|
+
// Capture EVERY inbound header (parity with the express adapter —
|
|
1263
|
+
// MCP-only merchants have no edge to do it upstream) plus the
|
|
1264
|
+
// CDN-derived connection block. Local string work, secrets
|
|
1265
|
+
// stripped; out of the verify cache key so it doesn't defeat
|
|
1266
|
+
// caching.
|
|
1267
|
+
observedMetadata: buildSdkObservedMetadata(req.headers)
|
|
1051
1268
|
}
|
|
1052
1269
|
};
|
|
1053
1270
|
let result = await verify(config, verificationRequest);
|