@astrasyncai/verification-gateway 4.6.0 → 5.0.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/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 +6 -33
- package/dist/adapters/express.js.map +1 -1
- package/dist/adapters/express.mjs +6 -33
- package/dist/adapters/express.mjs.map +1 -1
- package/dist/adapters/mcp.d.mts +2 -2
- package/dist/adapters/mcp.d.ts +2 -2
- package/dist/adapters/mcp.js +23 -65
- package/dist/adapters/mcp.js.map +1 -1
- package/dist/adapters/mcp.mjs +22 -64
- 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 +4 -30
- package/dist/adapters/nextjs.js.map +1 -1
- package/dist/adapters/nextjs.mjs +4 -30
- 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 +3 -124
- package/dist/adapters/sdk.js.map +1 -1
- package/dist/adapters/sdk.mjs +3 -122
- 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 +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 +4 -29
- package/dist/bin/astrasync-codex-hook.js +4 -29
- package/dist/bin/astrasync-guard.js +4 -29
- package/dist/bin/astrasync.js +9 -34
- package/dist/browser/background.js +4 -29
- package/dist/browser/background.js.map +1 -1
- package/dist/browser/background.mjs +4 -29
- 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 +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.d.mts +2 -2
- package/dist/codex/index.d.ts +2 -2
- package/dist/codex/index.js +4 -29
- package/dist/codex/index.js.map +1 -1
- package/dist/codex/index.mjs +4 -29
- 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 +4 -29
- package/dist/cursor/extension.js.map +1 -1
- package/dist/cursor/extension.mjs +4 -29
- 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 +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 +1 -3
- package/dist/edge-core/index.d.ts +1 -3
- package/dist/edge-core/index.js +6 -33
- package/dist/edge-core/index.js.map +1 -1
- package/dist/edge-core/index.mjs +6 -33
- package/dist/edge-core/index.mjs.map +1 -1
- package/dist/{express-D-8Ks2Uo.d.ts → express-B5lWuemA.d.ts} +1 -1
- package/dist/{express-DBtPKXOL.d.mts → express-Dm-snUuY.d.mts} +1 -1
- package/dist/gateway/gateway.d.mts +2 -2
- package/dist/gateway/gateway.d.ts +2 -2
- package/dist/gateway/gateway.js +4 -29
- package/dist/gateway/gateway.js.map +1 -1
- package/dist/gateway/gateway.mjs +4 -29
- 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-kGCGWd5x.d.mts → index-B5k_vUmK.d.mts} +1 -1
- package/dist/{index-CUfmJ1Dq.d.mts → index-BOzM6xUq.d.mts} +1 -1
- package/dist/{index-BND3kQev.d.ts → index-dRfxUdFA.d.ts} +1 -1
- package/dist/{index-DlZORQsb.d.ts → index-y8xToocF.d.ts} +1 -1
- package/dist/index.d.mts +10 -10
- package/dist/index.d.ts +10 -10
- package/dist/index.js +25 -217
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +25 -210
- 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/local-evaluator/evaluator.js.map +1 -1
- package/dist/local-evaluator/evaluator.mjs.map +1 -1
- package/dist/{mcp-ZRN4kY3b.d.mts → mcp-DgsyQiQq.d.mts} +53 -52
- package/dist/{mcp-DToTlwIn.d.ts → mcp-OosmAcKf.d.ts} +53 -52
- package/dist/{nextjs-C0KASOy_.d.mts → nextjs-B1sBdEav.d.mts} +1 -1
- package/dist/{nextjs-lwNvWYWT.d.ts → nextjs-DoRmhV_Z.d.ts} +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/sdk-B83N3xKc.d.mts +142 -0
- package/dist/sdk-H_9BTNBS.d.ts +142 -0
- package/dist/transport/index.d.mts +2 -2
- package/dist/transport/index.d.ts +2 -2
- 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/{types-CGPU7HLi.d.ts → types-BK2POWNc.d.ts} +15 -50
- package/dist/{types-Cx9hTpKI.d.mts → types-CJjZvPr9.d.mts} +15 -50
- package/dist/{types-DhhJxKIC.d.ts → types-CXf3q4kZ.d.ts} +1 -3
- package/dist/{types-CfSJLS4i.d.mts → types-DQmop7ZW.d.mts} +1 -3
- package/dist/ui/index.d.mts +2 -17
- package/dist/ui/index.d.ts +2 -17
- package/dist/ui/index.js +1 -43
- package/dist/ui/index.js.map +1 -1
- package/dist/ui/index.mjs +1 -42
- package/dist/ui/index.mjs.map +1 -1
- package/dist/verify.d.mts +3 -4
- package/dist/verify.d.ts +3 -4
- package/dist/verify.js +3 -28
- package/dist/verify.js.map +1 -1
- package/dist/verify.mjs +3 -28
- package/dist/verify.mjs.map +1 -1
- package/package.json +1 -1
- package/dist/sdk-B4aodEwj.d.ts +0 -215
- package/dist/sdk-B9dSwum7.d.mts +0 -215
package/dist/adapters/mcp.mjs
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
// src/version.ts
|
|
2
|
-
var SDK_VERSION = "
|
|
2
|
+
var SDK_VERSION = "5.0.0";
|
|
3
3
|
|
|
4
4
|
// src/http.ts
|
|
5
5
|
var SDK_USER_AGENT = `astrasync-sdk/${SDK_VERSION}`;
|
|
@@ -19,7 +19,7 @@ function withUserAgent(initHeaders) {
|
|
|
19
19
|
}
|
|
20
20
|
var sdkFetch = (input, init) => fetch(input, { ...init, headers: withUserAgent(init?.headers) });
|
|
21
21
|
|
|
22
|
-
// src/
|
|
22
|
+
// src/trust-levels.ts
|
|
23
23
|
function getTrustLevel(score) {
|
|
24
24
|
if (score >= 80) return "PLATINUM";
|
|
25
25
|
if (score >= 60) return "GOLD";
|
|
@@ -89,11 +89,6 @@ function getCachedWellKnownUrls(apiBaseUrl) {
|
|
|
89
89
|
// src/verify.ts
|
|
90
90
|
var DEFAULT_CONFIG = {
|
|
91
91
|
apiBaseUrl: "https://astrasync.ai/api",
|
|
92
|
-
// v2.3.9 (defect #30): default for unconfigured callers is `'none'` (no
|
|
93
|
-
// access). Pre-rename this defaulted to `'guidance'`, which combined with
|
|
94
|
-
// a route gated at `'guidance'` to silently let unverified traffic
|
|
95
|
-
// through (`hasMinimumAccess('guidance', 'guidance') === true`).
|
|
96
|
-
defaultAccessLevel: "none",
|
|
97
92
|
// minTrustScore + minTrustScoreForFull deprecated in v2.3.0 — server decides.
|
|
98
93
|
// cacheTtl deliberately unset. When undefined, cacheResult applies the 60s
|
|
99
94
|
// default; the caller's explicit value is honoured for cacheable results.
|
|
@@ -288,13 +283,6 @@ function createGuidanceResponse(_config, reason, options = {}) {
|
|
|
288
283
|
// policy is not evaluated (we never reached the gate).
|
|
289
284
|
identityVerified: false,
|
|
290
285
|
policyAllowed: false,
|
|
291
|
-
// v2.3.9 (defect #30): denials grant `'none'`, NEVER a positive band.
|
|
292
|
-
// Adapters additionally short-circuit on `!identityVerified ||
|
|
293
|
-
// !policyAllowed` before the gate check, but the access level still has
|
|
294
|
-
// to be honest at the data layer so downstream consumers (SDK adapters
|
|
295
|
-
// in other languages, custom integrations) inherit the correct
|
|
296
|
-
// semantics.
|
|
297
|
-
accessLevel: "none",
|
|
298
286
|
guidance,
|
|
299
287
|
denialReasons: reason ? [reason] : ["No valid agent credentials provided"],
|
|
300
288
|
// Round-10 (#47, O5): on API-error fallback, surface a typed failure so
|
|
@@ -388,7 +376,6 @@ async function callVerifyAccessAPI(config, request) {
|
|
|
388
376
|
attemptId: typeof data?.attemptId === "string" ? data.attemptId : void 0,
|
|
389
377
|
access: {
|
|
390
378
|
allowed: false,
|
|
391
|
-
accessLevel: "none",
|
|
392
379
|
reason: "endpoint_deactivated",
|
|
393
380
|
failures: [
|
|
394
381
|
{
|
|
@@ -451,7 +438,7 @@ async function verify(config, request, options) {
|
|
|
451
438
|
if (!deprecationWarningShown && (config.minTrustScore !== void 0 || config.minTrustScoreForFull !== void 0)) {
|
|
452
439
|
deprecationWarningShown = true;
|
|
453
440
|
console.warn(
|
|
454
|
-
"[VerificationGateway] minTrustScore / minTrustScoreForFull are deprecated in v2.3.0 and have no effect. Server is now the single source of truth for access
|
|
441
|
+
"[VerificationGateway] minTrustScore / minTrustScoreForFull are deprecated in v2.3.0 and have no effect. Server is now the single source of truth for access decisions (verified ID + runtime challenge + PDLSS + trust score). To gate access to an endpoint, configure the endpoint's trust_score_requirement server-side."
|
|
455
442
|
);
|
|
456
443
|
}
|
|
457
444
|
if (mergedConfig.cacheTtl !== 0 && !options?.bypassCache) {
|
|
@@ -497,14 +484,6 @@ async function verify(config, request, options) {
|
|
|
497
484
|
const result2 = {
|
|
498
485
|
identityVerified: idVerifiedFromBackend,
|
|
499
486
|
policyAllowed: false,
|
|
500
|
-
// v2.3.9 (defect #30): denials grant `'none'`, NEVER a positive band.
|
|
501
|
-
// Pre-rename this hardcoded `'guidance'`, which conflated with the
|
|
502
|
-
// colocated `guidance: {...}` help-payload object below and let
|
|
503
|
-
// denied requests pass any route gated at `'guidance'` because
|
|
504
|
-
// `hasMinimumAccess('guidance', 'guidance') === true`. Adapters now
|
|
505
|
-
// ALSO short-circuit on `!identityVerified || !policyAllowed` before
|
|
506
|
-
// the gate check — belt-and-braces.
|
|
507
|
-
accessLevel: "none",
|
|
508
487
|
// 3.6.0: the server now emits top-level denialReasons on every deny
|
|
509
488
|
// path — prefer it verbatim; the failure-message reconstruction remains
|
|
510
489
|
// as the fallback for older backends.
|
|
@@ -553,7 +532,6 @@ async function verify(config, request, options) {
|
|
|
553
532
|
trustScore: apiResponse.organization.trustScore
|
|
554
533
|
} : void 0;
|
|
555
534
|
const verificationContext = apiResponse.verificationContext;
|
|
556
|
-
const accessLevel = apiResponse.access?.accessLevel ?? "standard";
|
|
557
535
|
const result = {
|
|
558
536
|
// 4.5.0 (probe F1): read idVerified from verificationContext with the
|
|
559
537
|
// SAME absent⇒false default as the deny branch. The previous `!== false`
|
|
@@ -565,7 +543,6 @@ async function verify(config, request, options) {
|
|
|
565
543
|
// this load-bearing must never be defaulted on.
|
|
566
544
|
identityVerified: apiResponse.verificationContext?.idVerified === true,
|
|
567
545
|
policyAllowed: true,
|
|
568
|
-
accessLevel,
|
|
569
546
|
agent,
|
|
570
547
|
developer,
|
|
571
548
|
organization,
|
|
@@ -592,7 +569,6 @@ async function verify(config, request, options) {
|
|
|
592
569
|
};
|
|
593
570
|
if (result.recommendation === "deny") {
|
|
594
571
|
result.policyAllowed = false;
|
|
595
|
-
result.accessLevel = "none";
|
|
596
572
|
result.denialReasons = serverDenialReasons ?? result.recommendationReasons ?? ["Access denied by AstraSync recommendation"];
|
|
597
573
|
result.guidance = result.runtimeChallenge ? {
|
|
598
574
|
message: `Verification failed: ${result.runtimeChallenge.reason || "runtime challenge failed"}`,
|
|
@@ -1051,18 +1027,13 @@ function mcpToPdlss(parsed, requestPath, headerPurpose, headerAction, toolGate)
|
|
|
1051
1027
|
}
|
|
1052
1028
|
return { purpose, action, resource, purposeSource, actionSource };
|
|
1053
1029
|
}
|
|
1054
|
-
function
|
|
1055
|
-
if (parsed.isInitialize || parsed.method === "notifications/initialized") return
|
|
1056
|
-
if (parsed.isIntrospection) return
|
|
1057
|
-
|
|
1058
|
-
if (parsed.isToolCall) return "standard";
|
|
1059
|
-
return "standard";
|
|
1030
|
+
function mcpDefaultEnforced(parsed) {
|
|
1031
|
+
if (parsed.isInitialize || parsed.method === "notifications/initialized") return false;
|
|
1032
|
+
if (parsed.isIntrospection) return false;
|
|
1033
|
+
return true;
|
|
1060
1034
|
}
|
|
1061
1035
|
|
|
1062
1036
|
// src/adapters/mcp.ts
|
|
1063
|
-
function normalizeToolGate(gate) {
|
|
1064
|
-
return typeof gate === "string" ? { minAccessLevel: gate } : gate;
|
|
1065
|
-
}
|
|
1066
1037
|
function readSingleHeader(value) {
|
|
1067
1038
|
if (typeof value === "string") return value;
|
|
1068
1039
|
if (Array.isArray(value)) return value[0];
|
|
@@ -1115,7 +1086,6 @@ function defaultMcpDenied(result, req, res) {
|
|
|
1115
1086
|
code: !result.identityVerified ? -32e3 : -32001,
|
|
1116
1087
|
message: result.denialReasons?.[0] ?? "Access denied",
|
|
1117
1088
|
data: {
|
|
1118
|
-
accessLevel: result.accessLevel,
|
|
1119
1089
|
guidance: result.guidance,
|
|
1120
1090
|
// Round-10: aggregated per-dimension detail + correlation handle.
|
|
1121
1091
|
failures: result.failures,
|
|
@@ -1128,20 +1098,19 @@ function defaultMcpDenied(result, req, res) {
|
|
|
1128
1098
|
}
|
|
1129
1099
|
});
|
|
1130
1100
|
}
|
|
1131
|
-
function
|
|
1101
|
+
function resolveGate(parsed, opts) {
|
|
1132
1102
|
if (!parsed.toolName) {
|
|
1133
|
-
|
|
1134
|
-
|
|
1103
|
+
const methodGate = opts.methodGates?.[parsed.method];
|
|
1104
|
+
if (methodGate !== void 0) {
|
|
1105
|
+
return methodGate === "observe" ? { enforce: false, source: "methodGate" } : { enforce: true, config: methodGate, source: "methodGate" };
|
|
1135
1106
|
}
|
|
1136
|
-
return {
|
|
1107
|
+
return { enforce: false, source: "discovery_default" };
|
|
1137
1108
|
}
|
|
1138
|
-
|
|
1139
|
-
|
|
1140
|
-
|
|
1141
|
-
source: "toolGate"
|
|
1142
|
-
};
|
|
1109
|
+
const toolGate = opts.toolGates?.[parsed.toolName];
|
|
1110
|
+
if (toolGate !== void 0) {
|
|
1111
|
+
return toolGate === "observe" ? { enforce: false, source: "toolGate" } : { enforce: true, config: toolGate, source: "toolGate" };
|
|
1143
1112
|
}
|
|
1144
|
-
return {
|
|
1113
|
+
return { enforce: mcpDefaultEnforced(parsed), source: "tier" };
|
|
1145
1114
|
}
|
|
1146
1115
|
function createMcpMiddleware(options) {
|
|
1147
1116
|
const {
|
|
@@ -1161,15 +1130,6 @@ function createMcpMiddleware(options) {
|
|
|
1161
1130
|
prefetchWellKnown(config.apiBaseUrl).catch(() => {
|
|
1162
1131
|
});
|
|
1163
1132
|
}
|
|
1164
|
-
if (toolGates) {
|
|
1165
|
-
for (const [toolName, gate] of Object.entries(toolGates)) {
|
|
1166
|
-
if (typeof gate === "string") {
|
|
1167
|
-
console.warn(
|
|
1168
|
-
`[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: '...' }.`
|
|
1169
|
-
);
|
|
1170
|
-
}
|
|
1171
|
-
}
|
|
1172
|
-
}
|
|
1173
1133
|
return async (req, res, next) => {
|
|
1174
1134
|
try {
|
|
1175
1135
|
if (skip) return next();
|
|
@@ -1218,7 +1178,7 @@ function createMcpMiddleware(options) {
|
|
|
1218
1178
|
return next();
|
|
1219
1179
|
}
|
|
1220
1180
|
}
|
|
1221
|
-
const
|
|
1181
|
+
const gateDecision = resolveGate(parsed, {
|
|
1222
1182
|
toolGates,
|
|
1223
1183
|
methodGates
|
|
1224
1184
|
});
|
|
@@ -1227,16 +1187,15 @@ function createMcpMiddleware(options) {
|
|
|
1227
1187
|
req.query
|
|
1228
1188
|
);
|
|
1229
1189
|
if (effectiveAstraId) credentials.astraId = effectiveAstraId;
|
|
1230
|
-
const shouldEnforce =
|
|
1231
|
-
if (
|
|
1190
|
+
const shouldEnforce = gateDecision.enforce;
|
|
1191
|
+
if (!shouldEnforce && (!config.evaluateAlwaysIfCredentialed || !credentials.astraId)) {
|
|
1232
1192
|
if (config.setPassThroughHeader) {
|
|
1233
1193
|
res.setHeader("X-Astra-Gateway-Mode", "unenforced");
|
|
1234
|
-
res.setHeader("X-Astra-Gateway-Reason", "mcp-
|
|
1194
|
+
res.setHeader("X-Astra-Gateway-Reason", "mcp-observe");
|
|
1235
1195
|
}
|
|
1236
1196
|
return next();
|
|
1237
1197
|
}
|
|
1238
|
-
const
|
|
1239
|
-
const gate = rawGate ? normalizeToolGate(rawGate) : void 0;
|
|
1198
|
+
const gate = gateDecision.config;
|
|
1240
1199
|
const headerPurpose = readSingleHeader(req.headers["x-astra-purpose"]);
|
|
1241
1200
|
const headerAction = readSingleHeader(req.headers["x-astra-action"]);
|
|
1242
1201
|
const pdlss = mcpToPdlss(
|
|
@@ -1372,7 +1331,6 @@ function createMcpMiddleware(options) {
|
|
|
1372
1331
|
const result = {
|
|
1373
1332
|
identityVerified: false,
|
|
1374
1333
|
policyAllowed: false,
|
|
1375
|
-
accessLevel: "none",
|
|
1376
1334
|
denialReasons: [`MCP middleware internal error: ${errorClass}`],
|
|
1377
1335
|
failures: [
|
|
1378
1336
|
{
|
|
@@ -1402,7 +1360,7 @@ export {
|
|
|
1402
1360
|
MCP_VERIFIED_HOP_HEADER,
|
|
1403
1361
|
createMcpMiddleware,
|
|
1404
1362
|
isVerifiedHopValidFor,
|
|
1405
|
-
|
|
1363
|
+
mcpDefaultEnforced,
|
|
1406
1364
|
mcpToPdlss,
|
|
1407
1365
|
parseMcpJsonRpc,
|
|
1408
1366
|
parseVerifiedHop,
|