@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.
Files changed (135) hide show
  1. package/dist/adapter-interface/interface.d.mts +2 -2
  2. package/dist/adapter-interface/interface.d.ts +2 -2
  3. package/dist/adapters/express.d.mts +2 -2
  4. package/dist/adapters/express.d.ts +2 -2
  5. package/dist/adapters/express.js +6 -33
  6. package/dist/adapters/express.js.map +1 -1
  7. package/dist/adapters/express.mjs +6 -33
  8. package/dist/adapters/express.mjs.map +1 -1
  9. package/dist/adapters/mcp.d.mts +2 -2
  10. package/dist/adapters/mcp.d.ts +2 -2
  11. package/dist/adapters/mcp.js +23 -65
  12. package/dist/adapters/mcp.js.map +1 -1
  13. package/dist/adapters/mcp.mjs +22 -64
  14. package/dist/adapters/mcp.mjs.map +1 -1
  15. package/dist/adapters/nextjs.d.mts +2 -2
  16. package/dist/adapters/nextjs.d.ts +2 -2
  17. package/dist/adapters/nextjs.js +4 -30
  18. package/dist/adapters/nextjs.js.map +1 -1
  19. package/dist/adapters/nextjs.mjs +4 -30
  20. package/dist/adapters/nextjs.mjs.map +1 -1
  21. package/dist/adapters/sdk.d.mts +2 -2
  22. package/dist/adapters/sdk.d.ts +2 -2
  23. package/dist/adapters/sdk.js +3 -124
  24. package/dist/adapters/sdk.js.map +1 -1
  25. package/dist/adapters/sdk.mjs +3 -122
  26. package/dist/adapters/sdk.mjs.map +1 -1
  27. package/dist/agent/index.d.mts +2 -2
  28. package/dist/agent/index.d.ts +2 -2
  29. package/dist/agent/index.js +1 -1
  30. package/dist/agent/index.js.map +1 -1
  31. package/dist/agent/index.mjs +1 -1
  32. package/dist/agent/index.mjs.map +1 -1
  33. package/dist/bin/astrasync-claude-hook.js +4 -29
  34. package/dist/bin/astrasync-codex-hook.js +4 -29
  35. package/dist/bin/astrasync-guard.js +4 -29
  36. package/dist/bin/astrasync.js +9 -34
  37. package/dist/browser/background.js +4 -29
  38. package/dist/browser/background.js.map +1 -1
  39. package/dist/browser/background.mjs +4 -29
  40. package/dist/browser/background.mjs.map +1 -1
  41. package/dist/browser/browser-adapter.d.mts +2 -2
  42. package/dist/browser/browser-adapter.d.ts +2 -2
  43. package/dist/claude-code/claude-code-adapter.d.mts +2 -2
  44. package/dist/claude-code/claude-code-adapter.d.ts +2 -2
  45. package/dist/cli/index.d.mts +2 -2
  46. package/dist/cli/index.d.ts +2 -2
  47. package/dist/cli/index.js +1 -1
  48. package/dist/cli/index.js.map +1 -1
  49. package/dist/cli/index.mjs +1 -1
  50. package/dist/cli/index.mjs.map +1 -1
  51. package/dist/codex/index.d.mts +2 -2
  52. package/dist/codex/index.d.ts +2 -2
  53. package/dist/codex/index.js +4 -29
  54. package/dist/codex/index.js.map +1 -1
  55. package/dist/codex/index.mjs +4 -29
  56. package/dist/codex/index.mjs.map +1 -1
  57. package/dist/cursor/cursor-adapter.d.mts +2 -2
  58. package/dist/cursor/cursor-adapter.d.ts +2 -2
  59. package/dist/cursor/extension.d.mts +2 -2
  60. package/dist/cursor/extension.d.ts +2 -2
  61. package/dist/cursor/extension.js +4 -29
  62. package/dist/cursor/extension.js.map +1 -1
  63. package/dist/cursor/extension.mjs +4 -29
  64. package/dist/cursor/extension.mjs.map +1 -1
  65. package/dist/edge-config.d.mts +1 -1
  66. package/dist/edge-config.d.ts +1 -1
  67. package/dist/edge-config.js +1 -1
  68. package/dist/edge-config.js.map +1 -1
  69. package/dist/edge-config.mjs +1 -1
  70. package/dist/edge-config.mjs.map +1 -1
  71. package/dist/edge-core/index.d.mts +1 -3
  72. package/dist/edge-core/index.d.ts +1 -3
  73. package/dist/edge-core/index.js +6 -33
  74. package/dist/edge-core/index.js.map +1 -1
  75. package/dist/edge-core/index.mjs +6 -33
  76. package/dist/edge-core/index.mjs.map +1 -1
  77. package/dist/{express-D-8Ks2Uo.d.ts → express-B5lWuemA.d.ts} +1 -1
  78. package/dist/{express-DBtPKXOL.d.mts → express-Dm-snUuY.d.mts} +1 -1
  79. package/dist/gateway/gateway.d.mts +2 -2
  80. package/dist/gateway/gateway.d.ts +2 -2
  81. package/dist/gateway/gateway.js +4 -29
  82. package/dist/gateway/gateway.js.map +1 -1
  83. package/dist/gateway/gateway.mjs +4 -29
  84. package/dist/gateway/gateway.mjs.map +1 -1
  85. package/dist/git-trigger/git-hooks.d.mts +2 -2
  86. package/dist/git-trigger/git-hooks.d.ts +2 -2
  87. package/dist/{index-kGCGWd5x.d.mts → index-B5k_vUmK.d.mts} +1 -1
  88. package/dist/{index-CUfmJ1Dq.d.mts → index-BOzM6xUq.d.mts} +1 -1
  89. package/dist/{index-BND3kQev.d.ts → index-dRfxUdFA.d.ts} +1 -1
  90. package/dist/{index-DlZORQsb.d.ts → index-y8xToocF.d.ts} +1 -1
  91. package/dist/index.d.mts +10 -10
  92. package/dist/index.d.ts +10 -10
  93. package/dist/index.js +25 -217
  94. package/dist/index.js.map +1 -1
  95. package/dist/index.mjs +25 -210
  96. package/dist/index.mjs.map +1 -1
  97. package/dist/local-evaluator/evaluator.d.mts +2 -2
  98. package/dist/local-evaluator/evaluator.d.ts +2 -2
  99. package/dist/local-evaluator/evaluator.js.map +1 -1
  100. package/dist/local-evaluator/evaluator.mjs.map +1 -1
  101. package/dist/{mcp-ZRN4kY3b.d.mts → mcp-DgsyQiQq.d.mts} +53 -52
  102. package/dist/{mcp-DToTlwIn.d.ts → mcp-OosmAcKf.d.ts} +53 -52
  103. package/dist/{nextjs-C0KASOy_.d.mts → nextjs-B1sBdEav.d.mts} +1 -1
  104. package/dist/{nextjs-lwNvWYWT.d.ts → nextjs-DoRmhV_Z.d.ts} +1 -1
  105. package/dist/registration/index.js +1 -1
  106. package/dist/registration/index.js.map +1 -1
  107. package/dist/registration/index.mjs +1 -1
  108. package/dist/registration/index.mjs.map +1 -1
  109. package/dist/sdk-B83N3xKc.d.mts +142 -0
  110. package/dist/sdk-H_9BTNBS.d.ts +142 -0
  111. package/dist/transport/index.d.mts +2 -2
  112. package/dist/transport/index.d.ts +2 -2
  113. package/dist/transport/index.js +1 -1
  114. package/dist/transport/index.js.map +1 -1
  115. package/dist/transport/index.mjs +1 -1
  116. package/dist/transport/index.mjs.map +1 -1
  117. package/dist/{types-CGPU7HLi.d.ts → types-BK2POWNc.d.ts} +15 -50
  118. package/dist/{types-Cx9hTpKI.d.mts → types-CJjZvPr9.d.mts} +15 -50
  119. package/dist/{types-DhhJxKIC.d.ts → types-CXf3q4kZ.d.ts} +1 -3
  120. package/dist/{types-CfSJLS4i.d.mts → types-DQmop7ZW.d.mts} +1 -3
  121. package/dist/ui/index.d.mts +2 -17
  122. package/dist/ui/index.d.ts +2 -17
  123. package/dist/ui/index.js +1 -43
  124. package/dist/ui/index.js.map +1 -1
  125. package/dist/ui/index.mjs +1 -42
  126. package/dist/ui/index.mjs.map +1 -1
  127. package/dist/verify.d.mts +3 -4
  128. package/dist/verify.d.ts +3 -4
  129. package/dist/verify.js +3 -28
  130. package/dist/verify.js.map +1 -1
  131. package/dist/verify.mjs +3 -28
  132. package/dist/verify.mjs.map +1 -1
  133. package/package.json +1 -1
  134. package/dist/sdk-B4aodEwj.d.ts +0 -215
  135. package/dist/sdk-B9dSwum7.d.mts +0 -215
@@ -1,5 +1,5 @@
1
1
  // src/version.ts
2
- var SDK_VERSION = "4.6.0";
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/access-levels.ts
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-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."
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 mcpRiskTier(parsed) {
1055
- if (parsed.isInitialize || parsed.method === "notifications/initialized") return "none";
1056
- if (parsed.isIntrospection) return "none";
1057
- if (parsed.method === "resources/read") return "read-only";
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 resolveMinAccessLevel(parsed, opts) {
1101
+ function resolveGate(parsed, opts) {
1132
1102
  if (!parsed.toolName) {
1133
- if (opts.methodGates && opts.methodGates[parsed.method] !== void 0) {
1134
- return { level: opts.methodGates[parsed.method], source: "methodGate" };
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 { level: "none", source: "discovery_default" };
1107
+ return { enforce: false, source: "discovery_default" };
1137
1108
  }
1138
- if (opts.toolGates && opts.toolGates[parsed.toolName] !== void 0) {
1139
- return {
1140
- level: normalizeToolGate(opts.toolGates[parsed.toolName]).minAccessLevel,
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 { level: mcpRiskTier(parsed), source: "tier" };
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 { level: minAccessLevel } = resolveMinAccessLevel(parsed, {
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 = minAccessLevel !== "none";
1231
- if (minAccessLevel === "none" && (!config.evaluateAlwaysIfCredentialed || !credentials.astraId)) {
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-tier-none");
1194
+ res.setHeader("X-Astra-Gateway-Reason", "mcp-observe");
1235
1195
  }
1236
1196
  return next();
1237
1197
  }
1238
- const rawGate = parsed.toolName && toolGates?.[parsed.toolName];
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
- mcpRiskTier,
1363
+ mcpDefaultEnforced,
1406
1364
  mcpToPdlss,
1407
1365
  parseMcpJsonRpc,
1408
1366
  parseVerifiedHop,