@astrasyncai/verification-gateway 4.5.1 → 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.
Files changed (140) hide show
  1. package/README.md +1 -1
  2. package/dist/adapter-interface/interface.d.mts +2 -2
  3. package/dist/adapter-interface/interface.d.ts +2 -2
  4. package/dist/adapters/express.d.mts +2 -2
  5. package/dist/adapters/express.d.ts +2 -2
  6. package/dist/adapters/express.js +11 -33
  7. package/dist/adapters/express.js.map +1 -1
  8. package/dist/adapters/express.mjs +11 -33
  9. package/dist/adapters/express.mjs.map +1 -1
  10. package/dist/adapters/mcp.d.mts +2 -2
  11. package/dist/adapters/mcp.d.ts +2 -2
  12. package/dist/adapters/mcp.js +28 -65
  13. package/dist/adapters/mcp.js.map +1 -1
  14. package/dist/adapters/mcp.mjs +27 -64
  15. package/dist/adapters/mcp.mjs.map +1 -1
  16. package/dist/adapters/nextjs.d.mts +2 -2
  17. package/dist/adapters/nextjs.d.ts +2 -2
  18. package/dist/adapters/nextjs.js +9 -30
  19. package/dist/adapters/nextjs.js.map +1 -1
  20. package/dist/adapters/nextjs.mjs +9 -30
  21. package/dist/adapters/nextjs.mjs.map +1 -1
  22. package/dist/adapters/sdk.d.mts +2 -2
  23. package/dist/adapters/sdk.d.ts +2 -2
  24. package/dist/adapters/sdk.js +8 -124
  25. package/dist/adapters/sdk.js.map +1 -1
  26. package/dist/adapters/sdk.mjs +8 -122
  27. package/dist/adapters/sdk.mjs.map +1 -1
  28. package/dist/agent/index.d.mts +2 -2
  29. package/dist/agent/index.d.ts +2 -2
  30. package/dist/agent/index.js +1 -1
  31. package/dist/agent/index.js.map +1 -1
  32. package/dist/agent/index.mjs +1 -1
  33. package/dist/agent/index.mjs.map +1 -1
  34. package/dist/bin/astrasync-claude-hook.js +63 -41
  35. package/dist/bin/astrasync-codex-hook.js +63 -41
  36. package/dist/bin/astrasync-guard.js +63 -41
  37. package/dist/bin/astrasync.js +75 -48
  38. package/dist/browser/background.js +63 -41
  39. package/dist/browser/background.js.map +1 -1
  40. package/dist/browser/background.mjs +63 -41
  41. package/dist/browser/background.mjs.map +1 -1
  42. package/dist/browser/browser-adapter.d.mts +2 -2
  43. package/dist/browser/browser-adapter.d.ts +2 -2
  44. package/dist/claude-code/claude-code-adapter.d.mts +2 -2
  45. package/dist/claude-code/claude-code-adapter.d.ts +2 -2
  46. package/dist/cli/index.d.mts +2 -2
  47. package/dist/cli/index.d.ts +2 -2
  48. package/dist/cli/index.js +33 -6
  49. package/dist/cli/index.js.map +1 -1
  50. package/dist/cli/index.mjs +33 -6
  51. package/dist/cli/index.mjs.map +1 -1
  52. package/dist/codex/index.d.mts +2 -2
  53. package/dist/codex/index.d.ts +2 -2
  54. package/dist/codex/index.js +63 -41
  55. package/dist/codex/index.js.map +1 -1
  56. package/dist/codex/index.mjs +63 -41
  57. package/dist/codex/index.mjs.map +1 -1
  58. package/dist/cursor/cursor-adapter.d.mts +2 -2
  59. package/dist/cursor/cursor-adapter.d.ts +2 -2
  60. package/dist/cursor/extension.d.mts +2 -2
  61. package/dist/cursor/extension.d.ts +2 -2
  62. package/dist/cursor/extension.js +63 -41
  63. package/dist/cursor/extension.js.map +1 -1
  64. package/dist/cursor/extension.mjs +63 -41
  65. package/dist/cursor/extension.mjs.map +1 -1
  66. package/dist/edge-config.d.mts +1 -1
  67. package/dist/edge-config.d.ts +1 -1
  68. package/dist/edge-config.js +1 -1
  69. package/dist/edge-config.js.map +1 -1
  70. package/dist/edge-config.mjs +1 -1
  71. package/dist/edge-config.mjs.map +1 -1
  72. package/dist/edge-core/index.d.mts +1 -3
  73. package/dist/edge-core/index.d.ts +1 -3
  74. package/dist/edge-core/index.js +11 -33
  75. package/dist/edge-core/index.js.map +1 -1
  76. package/dist/edge-core/index.mjs +11 -33
  77. package/dist/edge-core/index.mjs.map +1 -1
  78. package/dist/{express-DaqL11tx.d.ts → express-B5lWuemA.d.ts} +1 -1
  79. package/dist/{express-CR6F3njD.d.mts → express-Dm-snUuY.d.mts} +1 -1
  80. package/dist/gateway/gateway.d.mts +2 -2
  81. package/dist/gateway/gateway.d.ts +2 -2
  82. package/dist/gateway/gateway.js +63 -41
  83. package/dist/gateway/gateway.js.map +1 -1
  84. package/dist/gateway/gateway.mjs +63 -41
  85. package/dist/gateway/gateway.mjs.map +1 -1
  86. package/dist/git-trigger/git-hooks.d.mts +2 -2
  87. package/dist/git-trigger/git-hooks.d.ts +2 -2
  88. package/dist/{index-Cub7lK-T.d.mts → index-B5k_vUmK.d.mts} +1 -1
  89. package/dist/{index-BfIxCYIZ.d.ts → index-BOzM6xUq.d.mts} +1 -2
  90. package/dist/{index-CwAh7Tln.d.mts → index-dRfxUdFA.d.ts} +1 -2
  91. package/dist/{index-B5Ts1WtM.d.ts → index-y8xToocF.d.ts} +1 -1
  92. package/dist/index.d.mts +10 -10
  93. package/dist/index.d.ts +10 -10
  94. package/dist/index.js +30 -217
  95. package/dist/index.js.map +1 -1
  96. package/dist/index.mjs +30 -210
  97. package/dist/index.mjs.map +1 -1
  98. package/dist/local-evaluator/evaluator.d.mts +2 -2
  99. package/dist/local-evaluator/evaluator.d.ts +2 -2
  100. package/dist/local-evaluator/evaluator.js +22 -7
  101. package/dist/local-evaluator/evaluator.js.map +1 -1
  102. package/dist/local-evaluator/evaluator.mjs +22 -7
  103. package/dist/local-evaluator/evaluator.mjs.map +1 -1
  104. package/dist/{mcp-BgBJu4Jl.d.mts → mcp-DgsyQiQq.d.mts} +53 -52
  105. package/dist/{mcp--DgKOwfu.d.ts → mcp-OosmAcKf.d.ts} +53 -52
  106. package/dist/{nextjs-DlX6xwbU.d.mts → nextjs-B1sBdEav.d.mts} +1 -1
  107. package/dist/{nextjs-DL6uE1ye.d.ts → nextjs-DoRmhV_Z.d.ts} +1 -1
  108. package/dist/registration/index.d.mts +5 -1
  109. package/dist/registration/index.d.ts +5 -1
  110. package/dist/registration/index.js +1 -1
  111. package/dist/registration/index.js.map +1 -1
  112. package/dist/registration/index.mjs +1 -1
  113. package/dist/registration/index.mjs.map +1 -1
  114. package/dist/sdk-B83N3xKc.d.mts +142 -0
  115. package/dist/sdk-H_9BTNBS.d.ts +142 -0
  116. package/dist/transport/index.d.mts +2 -2
  117. package/dist/transport/index.d.ts +2 -2
  118. package/dist/transport/index.js +1 -1
  119. package/dist/transport/index.js.map +1 -1
  120. package/dist/transport/index.mjs +1 -1
  121. package/dist/transport/index.mjs.map +1 -1
  122. package/dist/{types-DwSfO7Sb.d.ts → types-BK2POWNc.d.ts} +23 -50
  123. package/dist/{types-C0zfSXMB.d.mts → types-CJjZvPr9.d.mts} +23 -50
  124. package/dist/{types-C7Rb-w0d.d.mts → types-CXf3q4kZ.d.ts} +14 -3
  125. package/dist/{types-nIh3HtuA.d.ts → types-DQmop7ZW.d.mts} +14 -3
  126. package/dist/ui/index.d.mts +2 -17
  127. package/dist/ui/index.d.ts +2 -17
  128. package/dist/ui/index.js +1 -43
  129. package/dist/ui/index.js.map +1 -1
  130. package/dist/ui/index.mjs +1 -42
  131. package/dist/ui/index.mjs.map +1 -1
  132. package/dist/verify.d.mts +3 -4
  133. package/dist/verify.d.ts +3 -4
  134. package/dist/verify.js +8 -28
  135. package/dist/verify.js.map +1 -1
  136. package/dist/verify.mjs +8 -28
  137. package/dist/verify.mjs.map +1 -1
  138. package/package.json +1 -1
  139. package/dist/sdk-Bbh9B_dw.d.mts +0 -215
  140. package/dist/sdk-C6SASmsh.d.ts +0 -215
@@ -1,4 +1,4 @@
1
1
  import 'express';
2
- import '../types-C0zfSXMB.mjs';
3
- export { M as MCP_VERIFIED_HOP_HEADER, b as McpMiddlewareOptions, P as ParsedMcpRequest, T as ToolGateConfig, c as createMcpMiddleware, i as isVerifiedHopValidFor, m as mcpRiskTier, d as mcpToPdlss, p as parseMcpJsonRpc, e as parseVerifiedHop, s as serializeVerifiedHop } from '../mcp-BgBJu4Jl.mjs';
2
+ import '../types-CJjZvPr9.mjs';
3
+ export { M as MCP_VERIFIED_HOP_HEADER, b as McpMiddlewareOptions, P as ParsedMcpRequest, T as ToolGate, c as ToolGateConfig, d as createMcpMiddleware, i as isVerifiedHopValidFor, m as mcpDefaultEnforced, e as mcpToPdlss, p as parseMcpJsonRpc, f as parseVerifiedHop, s as serializeVerifiedHop } from '../mcp-DgsyQiQq.mjs';
4
4
  import '../metadata-capture.mjs';
@@ -1,4 +1,4 @@
1
1
  import 'express';
2
- import '../types-DwSfO7Sb.js';
3
- export { M as MCP_VERIFIED_HOP_HEADER, b as McpMiddlewareOptions, P as ParsedMcpRequest, T as ToolGateConfig, c as createMcpMiddleware, i as isVerifiedHopValidFor, m as mcpRiskTier, d as mcpToPdlss, p as parseMcpJsonRpc, e as parseVerifiedHop, s as serializeVerifiedHop } from '../mcp--DgKOwfu.js';
2
+ import '../types-BK2POWNc.js';
3
+ export { M as MCP_VERIFIED_HOP_HEADER, b as McpMiddlewareOptions, P as ParsedMcpRequest, T as ToolGate, c as ToolGateConfig, d as createMcpMiddleware, i as isVerifiedHopValidFor, m as mcpDefaultEnforced, e as mcpToPdlss, p as parseMcpJsonRpc, f as parseVerifiedHop, s as serializeVerifiedHop } from '../mcp-OosmAcKf.js';
4
4
  import '../metadata-capture.js';
@@ -23,7 +23,7 @@ __export(mcp_exports, {
23
23
  MCP_VERIFIED_HOP_HEADER: () => MCP_VERIFIED_HOP_HEADER,
24
24
  createMcpMiddleware: () => createMcpMiddleware,
25
25
  isVerifiedHopValidFor: () => isVerifiedHopValidFor,
26
- mcpRiskTier: () => mcpRiskTier,
26
+ mcpDefaultEnforced: () => mcpDefaultEnforced,
27
27
  mcpToPdlss: () => mcpToPdlss,
28
28
  parseMcpJsonRpc: () => parseMcpJsonRpc,
29
29
  parseVerifiedHop: () => parseVerifiedHop,
@@ -32,7 +32,7 @@ __export(mcp_exports, {
32
32
  module.exports = __toCommonJS(mcp_exports);
33
33
 
34
34
  // src/version.ts
35
- var SDK_VERSION = "4.5.1";
35
+ var SDK_VERSION = "5.0.0";
36
36
 
37
37
  // src/http.ts
38
38
  var SDK_USER_AGENT = `astrasync-sdk/${SDK_VERSION}`;
@@ -52,7 +52,7 @@ function withUserAgent(initHeaders) {
52
52
  }
53
53
  var sdkFetch = (input, init) => fetch(input, { ...init, headers: withUserAgent(init?.headers) });
54
54
 
55
- // src/access-levels.ts
55
+ // src/trust-levels.ts
56
56
  function getTrustLevel(score) {
57
57
  if (score >= 80) return "PLATINUM";
58
58
  if (score >= 60) return "GOLD";
@@ -122,11 +122,6 @@ function getCachedWellKnownUrls(apiBaseUrl) {
122
122
  // src/verify.ts
123
123
  var DEFAULT_CONFIG = {
124
124
  apiBaseUrl: "https://astrasync.ai/api",
125
- // v2.3.9 (defect #30): default for unconfigured callers is `'none'` (no
126
- // access). Pre-rename this defaulted to `'guidance'`, which combined with
127
- // a route gated at `'guidance'` to silently let unverified traffic
128
- // through (`hasMinimumAccess('guidance', 'guidance') === true`).
129
- defaultAccessLevel: "none",
130
125
  // minTrustScore + minTrustScoreForFull deprecated in v2.3.0 — server decides.
131
126
  // cacheTtl deliberately unset. When undefined, cacheResult applies the 60s
132
127
  // default; the caller's explicit value is honoured for cacheable results.
@@ -321,13 +316,6 @@ function createGuidanceResponse(_config, reason, options = {}) {
321
316
  // policy is not evaluated (we never reached the gate).
322
317
  identityVerified: false,
323
318
  policyAllowed: false,
324
- // v2.3.9 (defect #30): denials grant `'none'`, NEVER a positive band.
325
- // Adapters additionally short-circuit on `!identityVerified ||
326
- // !policyAllowed` before the gate check, but the access level still has
327
- // to be honest at the data layer so downstream consumers (SDK adapters
328
- // in other languages, custom integrations) inherit the correct
329
- // semantics.
330
- accessLevel: "none",
331
319
  guidance,
332
320
  denialReasons: reason ? [reason] : ["No valid agent credentials provided"],
333
321
  // Round-10 (#47, O5): on API-error fallback, surface a typed failure so
@@ -350,6 +338,11 @@ function createGuidanceResponse(_config, reason, options = {}) {
350
338
  // 4.0.0: typed marker so adapters render the misconfig envelope (503 +
351
339
  // MERCHANT_VERIFICATION_MISCONFIGURED) without string-matching.
352
340
  ...isMisconfig && { misconfigured: true },
341
+ // 4.6.0: a transient api_error is retryable — mark it so consumers surface
342
+ // "temporarily unavailable, retry" (recommendation 'error') instead of
343
+ // coercing the absent recommendation to a policy 'deny'. Misconfig is
344
+ // deterministic and intentionally NOT marked retryable.
345
+ ...isApiError && { retryable: true },
353
346
  correlationId: options.correlationId,
354
347
  attemptId: options.attemptId,
355
348
  verifiedAt: /* @__PURE__ */ new Date()
@@ -416,7 +409,6 @@ async function callVerifyAccessAPI(config, request) {
416
409
  attemptId: typeof data?.attemptId === "string" ? data.attemptId : void 0,
417
410
  access: {
418
411
  allowed: false,
419
- accessLevel: "none",
420
412
  reason: "endpoint_deactivated",
421
413
  failures: [
422
414
  {
@@ -479,7 +471,7 @@ async function verify(config, request, options) {
479
471
  if (!deprecationWarningShown && (config.minTrustScore !== void 0 || config.minTrustScoreForFull !== void 0)) {
480
472
  deprecationWarningShown = true;
481
473
  console.warn(
482
- "[VerificationGateway] minTrustScore / minTrustScoreForFull are deprecated in v2.3.0 and have no effect. Server is now the single source of truth for access-level decisions (the SDK reads access.accessLevel from the verify-access response). To gate access to an endpoint, configure the endpoint's trust_score_requirement server-side."
474
+ "[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."
483
475
  );
484
476
  }
485
477
  if (mergedConfig.cacheTtl !== 0 && !options?.bypassCache) {
@@ -525,14 +517,6 @@ async function verify(config, request, options) {
525
517
  const result2 = {
526
518
  identityVerified: idVerifiedFromBackend,
527
519
  policyAllowed: false,
528
- // v2.3.9 (defect #30): denials grant `'none'`, NEVER a positive band.
529
- // Pre-rename this hardcoded `'guidance'`, which conflated with the
530
- // colocated `guidance: {...}` help-payload object below and let
531
- // denied requests pass any route gated at `'guidance'` because
532
- // `hasMinimumAccess('guidance', 'guidance') === true`. Adapters now
533
- // ALSO short-circuit on `!identityVerified || !policyAllowed` before
534
- // the gate check — belt-and-braces.
535
- accessLevel: "none",
536
520
  // 3.6.0: the server now emits top-level denialReasons on every deny
537
521
  // path — prefer it verbatim; the failure-message reconstruction remains
538
522
  // as the fallback for older backends.
@@ -581,7 +565,6 @@ async function verify(config, request, options) {
581
565
  trustScore: apiResponse.organization.trustScore
582
566
  } : void 0;
583
567
  const verificationContext = apiResponse.verificationContext;
584
- const accessLevel = apiResponse.access?.accessLevel ?? "standard";
585
568
  const result = {
586
569
  // 4.5.0 (probe F1): read idVerified from verificationContext with the
587
570
  // SAME absent⇒false default as the deny branch. The previous `!== false`
@@ -593,7 +576,6 @@ async function verify(config, request, options) {
593
576
  // this load-bearing must never be defaulted on.
594
577
  identityVerified: apiResponse.verificationContext?.idVerified === true,
595
578
  policyAllowed: true,
596
- accessLevel,
597
579
  agent,
598
580
  developer,
599
581
  organization,
@@ -620,7 +602,6 @@ async function verify(config, request, options) {
620
602
  };
621
603
  if (result.recommendation === "deny") {
622
604
  result.policyAllowed = false;
623
- result.accessLevel = "none";
624
605
  result.denialReasons = serverDenialReasons ?? result.recommendationReasons ?? ["Access denied by AstraSync recommendation"];
625
606
  result.guidance = result.runtimeChallenge ? {
626
607
  message: `Verification failed: ${result.runtimeChallenge.reason || "runtime challenge failed"}`,
@@ -1079,18 +1060,13 @@ function mcpToPdlss(parsed, requestPath, headerPurpose, headerAction, toolGate)
1079
1060
  }
1080
1061
  return { purpose, action, resource, purposeSource, actionSource };
1081
1062
  }
1082
- function mcpRiskTier(parsed) {
1083
- if (parsed.isInitialize || parsed.method === "notifications/initialized") return "none";
1084
- if (parsed.isIntrospection) return "none";
1085
- if (parsed.method === "resources/read") return "read-only";
1086
- if (parsed.isToolCall) return "standard";
1087
- return "standard";
1063
+ function mcpDefaultEnforced(parsed) {
1064
+ if (parsed.isInitialize || parsed.method === "notifications/initialized") return false;
1065
+ if (parsed.isIntrospection) return false;
1066
+ return true;
1088
1067
  }
1089
1068
 
1090
1069
  // src/adapters/mcp.ts
1091
- function normalizeToolGate(gate) {
1092
- return typeof gate === "string" ? { minAccessLevel: gate } : gate;
1093
- }
1094
1070
  function readSingleHeader(value) {
1095
1071
  if (typeof value === "string") return value;
1096
1072
  if (Array.isArray(value)) return value[0];
@@ -1143,7 +1119,6 @@ function defaultMcpDenied(result, req, res) {
1143
1119
  code: !result.identityVerified ? -32e3 : -32001,
1144
1120
  message: result.denialReasons?.[0] ?? "Access denied",
1145
1121
  data: {
1146
- accessLevel: result.accessLevel,
1147
1122
  guidance: result.guidance,
1148
1123
  // Round-10: aggregated per-dimension detail + correlation handle.
1149
1124
  failures: result.failures,
@@ -1156,20 +1131,19 @@ function defaultMcpDenied(result, req, res) {
1156
1131
  }
1157
1132
  });
1158
1133
  }
1159
- function resolveMinAccessLevel(parsed, opts) {
1134
+ function resolveGate(parsed, opts) {
1160
1135
  if (!parsed.toolName) {
1161
- if (opts.methodGates && opts.methodGates[parsed.method] !== void 0) {
1162
- return { level: opts.methodGates[parsed.method], source: "methodGate" };
1136
+ const methodGate = opts.methodGates?.[parsed.method];
1137
+ if (methodGate !== void 0) {
1138
+ return methodGate === "observe" ? { enforce: false, source: "methodGate" } : { enforce: true, config: methodGate, source: "methodGate" };
1163
1139
  }
1164
- return { level: "none", source: "discovery_default" };
1140
+ return { enforce: false, source: "discovery_default" };
1165
1141
  }
1166
- if (opts.toolGates && opts.toolGates[parsed.toolName] !== void 0) {
1167
- return {
1168
- level: normalizeToolGate(opts.toolGates[parsed.toolName]).minAccessLevel,
1169
- source: "toolGate"
1170
- };
1142
+ const toolGate = opts.toolGates?.[parsed.toolName];
1143
+ if (toolGate !== void 0) {
1144
+ return toolGate === "observe" ? { enforce: false, source: "toolGate" } : { enforce: true, config: toolGate, source: "toolGate" };
1171
1145
  }
1172
- return { level: mcpRiskTier(parsed), source: "tier" };
1146
+ return { enforce: mcpDefaultEnforced(parsed), source: "tier" };
1173
1147
  }
1174
1148
  function createMcpMiddleware(options) {
1175
1149
  const {
@@ -1189,15 +1163,6 @@ function createMcpMiddleware(options) {
1189
1163
  prefetchWellKnown(config.apiBaseUrl).catch(() => {
1190
1164
  });
1191
1165
  }
1192
- if (toolGates) {
1193
- for (const [toolName, gate] of Object.entries(toolGates)) {
1194
- if (typeof gate === "string") {
1195
- console.warn(
1196
- `[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: '...' }.`
1197
- );
1198
- }
1199
- }
1200
- }
1201
1166
  return async (req, res, next) => {
1202
1167
  try {
1203
1168
  if (skip) return next();
@@ -1246,7 +1211,7 @@ function createMcpMiddleware(options) {
1246
1211
  return next();
1247
1212
  }
1248
1213
  }
1249
- const { level: minAccessLevel } = resolveMinAccessLevel(parsed, {
1214
+ const gateDecision = resolveGate(parsed, {
1250
1215
  toolGates,
1251
1216
  methodGates
1252
1217
  });
@@ -1255,16 +1220,15 @@ function createMcpMiddleware(options) {
1255
1220
  req.query
1256
1221
  );
1257
1222
  if (effectiveAstraId) credentials.astraId = effectiveAstraId;
1258
- const shouldEnforce = minAccessLevel !== "none";
1259
- if (minAccessLevel === "none" && (!config.evaluateAlwaysIfCredentialed || !credentials.astraId)) {
1223
+ const shouldEnforce = gateDecision.enforce;
1224
+ if (!shouldEnforce && (!config.evaluateAlwaysIfCredentialed || !credentials.astraId)) {
1260
1225
  if (config.setPassThroughHeader) {
1261
1226
  res.setHeader("X-Astra-Gateway-Mode", "unenforced");
1262
- res.setHeader("X-Astra-Gateway-Reason", "mcp-tier-none");
1227
+ res.setHeader("X-Astra-Gateway-Reason", "mcp-observe");
1263
1228
  }
1264
1229
  return next();
1265
1230
  }
1266
- const rawGate = parsed.toolName && toolGates?.[parsed.toolName];
1267
- const gate = rawGate ? normalizeToolGate(rawGate) : void 0;
1231
+ const gate = gateDecision.config;
1268
1232
  const headerPurpose = readSingleHeader(req.headers["x-astra-purpose"]);
1269
1233
  const headerAction = readSingleHeader(req.headers["x-astra-action"]);
1270
1234
  const pdlss = mcpToPdlss(
@@ -1400,7 +1364,6 @@ function createMcpMiddleware(options) {
1400
1364
  const result = {
1401
1365
  identityVerified: false,
1402
1366
  policyAllowed: false,
1403
- accessLevel: "none",
1404
1367
  denialReasons: [`MCP middleware internal error: ${errorClass}`],
1405
1368
  failures: [
1406
1369
  {
@@ -1431,7 +1394,7 @@ function createMcpMiddleware(options) {
1431
1394
  MCP_VERIFIED_HOP_HEADER,
1432
1395
  createMcpMiddleware,
1433
1396
  isVerifiedHopValidFor,
1434
- mcpRiskTier,
1397
+ mcpDefaultEnforced,
1435
1398
  mcpToPdlss,
1436
1399
  parseMcpJsonRpc,
1437
1400
  parseVerifiedHop,