@astrasyncai/verification-gateway 2.4.0 → 2.4.2

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 (87) hide show
  1. package/README.md +137 -22
  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 +37 -7
  7. package/dist/adapters/express.js.map +1 -1
  8. package/dist/adapters/express.mjs +37 -7
  9. package/dist/adapters/express.mjs.map +1 -1
  10. package/dist/adapters/mcp.d.mts +1 -1
  11. package/dist/adapters/mcp.d.ts +1 -1
  12. package/dist/adapters/mcp.js +37 -7
  13. package/dist/adapters/mcp.js.map +1 -1
  14. package/dist/adapters/mcp.mjs +37 -7
  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 +30 -4
  19. package/dist/adapters/nextjs.js.map +1 -1
  20. package/dist/adapters/nextjs.mjs +30 -4
  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 +30 -4
  25. package/dist/adapters/sdk.js.map +1 -1
  26. package/dist/adapters/sdk.mjs +30 -4
  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/bin/astrasync.js +163 -4
  31. package/dist/browser/background.js +30 -4
  32. package/dist/browser/background.js.map +1 -1
  33. package/dist/browser/background.mjs +30 -4
  34. package/dist/browser/background.mjs.map +1 -1
  35. package/dist/browser/browser-adapter.d.mts +2 -2
  36. package/dist/browser/browser-adapter.d.ts +2 -2
  37. package/dist/cli/index.d.mts +2 -2
  38. package/dist/cli/index.d.ts +2 -2
  39. package/dist/cursor/cursor-adapter.d.mts +2 -2
  40. package/dist/cursor/cursor-adapter.d.ts +2 -2
  41. package/dist/cursor/extension.d.mts +2 -2
  42. package/dist/cursor/extension.d.ts +2 -2
  43. package/dist/cursor/extension.js +30 -4
  44. package/dist/cursor/extension.js.map +1 -1
  45. package/dist/cursor/extension.mjs +30 -4
  46. package/dist/cursor/extension.mjs.map +1 -1
  47. package/dist/{express-4Vau6x6X.d.mts → express-DneHiMhu.d.mts} +1 -1
  48. package/dist/{express-Nq-wWICa.d.ts → express-DsiaQRFt.d.ts} +1 -1
  49. package/dist/gateway/gateway.d.mts +2 -2
  50. package/dist/gateway/gateway.d.ts +2 -2
  51. package/dist/gateway/gateway.js +30 -4
  52. package/dist/gateway/gateway.js.map +1 -1
  53. package/dist/gateway/gateway.mjs +30 -4
  54. package/dist/gateway/gateway.mjs.map +1 -1
  55. package/dist/git-trigger/git-hooks.d.mts +2 -2
  56. package/dist/git-trigger/git-hooks.d.ts +2 -2
  57. package/dist/{index-DkyPV14Y.d.mts → index-C9yWlQ2Y.d.mts} +1 -1
  58. package/dist/{index-DiToN8gh.d.mts → index-DAGm-Sgf.d.mts} +1 -1
  59. package/dist/{index-B-EovXnY.d.ts → index-Dd4alF0l.d.ts} +1 -1
  60. package/dist/{index-CxwCN7AC.d.ts → index-NZiKvrtE.d.ts} +1 -1
  61. package/dist/index.d.mts +7 -7
  62. package/dist/index.d.ts +7 -7
  63. package/dist/index.js +37 -7
  64. package/dist/index.js.map +1 -1
  65. package/dist/index.mjs +37 -7
  66. package/dist/index.mjs.map +1 -1
  67. package/dist/local-evaluator/evaluator.d.mts +2 -2
  68. package/dist/local-evaluator/evaluator.d.ts +2 -2
  69. package/dist/{nextjs-DO_4crcp.d.ts → nextjs-B4WmoiVm.d.ts} +1 -1
  70. package/dist/{nextjs-BTR7Oix-.d.mts → nextjs-vUuVCaBP.d.mts} +1 -1
  71. package/dist/registration/index.d.mts +174 -7
  72. package/dist/registration/index.d.ts +174 -7
  73. package/dist/registration/index.js +171 -6
  74. package/dist/registration/index.js.map +1 -1
  75. package/dist/registration/index.mjs +167 -5
  76. package/dist/registration/index.mjs.map +1 -1
  77. package/dist/{sdk-TnHXD-Oh.d.ts → sdk-BvWp4q2q.d.ts} +1 -1
  78. package/dist/{sdk-DSLCyXIX.d.mts → sdk-Cixo6pTV.d.mts} +1 -1
  79. package/dist/transport/index.d.mts +2 -2
  80. package/dist/transport/index.d.ts +2 -2
  81. package/dist/{types-pU2O0BFq.d.mts → types-C_e1IZdU.d.mts} +1 -1
  82. package/dist/{types-BVp22KkN.d.mts → types-DLai3jly.d.mts} +16 -13
  83. package/dist/{types-BVp22KkN.d.ts → types-DLai3jly.d.ts} +16 -13
  84. package/dist/{types-DVCWReEN.d.ts → types-IUzu-A4u.d.ts} +1 -1
  85. package/dist/ui/index.d.mts +1 -1
  86. package/dist/ui/index.d.ts +1 -1
  87. package/package.json +1 -1
package/dist/index.mjs CHANGED
@@ -217,8 +217,18 @@ function extractCredentials(headers, query) {
217
217
  function hasCredentials(credentials) {
218
218
  return !!(credentials.astraId || credentials.apiKey || credentials.jwt);
219
219
  }
220
- function createGuidanceResponse(config, reason) {
221
- const guidance = {
220
+ function createGuidanceResponse(config, reason, options = {}) {
221
+ const source = options.source ?? "no_credentials";
222
+ const isApiError = source === "api_error";
223
+ const guidance = isApiError ? {
224
+ message: "Verification is temporarily unavailable. Retry with exponential backoff; if the issue persists, contact support with the correlationId.",
225
+ registrationUrl: `${config.apiBaseUrl.replace("/api", "")}/register`,
226
+ documentationUrl: `${config.apiBaseUrl.replace("/api", "")}/docs/agent-access`,
227
+ steps: [
228
+ "Retry the request with exponential backoff",
229
+ "If failures persist, share the correlationId with support"
230
+ ]
231
+ } : {
222
232
  message: "This service verifies AI agents before granting access. Please register your agent with AstraSync.",
223
233
  registrationUrl: `${config.apiBaseUrl.replace("/api", "")}/register`,
224
234
  documentationUrl: `${config.apiBaseUrl.replace("/api", "")}/docs/agent-access`,
@@ -239,6 +249,18 @@ function createGuidanceResponse(config, reason) {
239
249
  accessLevel: "none",
240
250
  guidance,
241
251
  denialReasons: reason ? [reason] : ["No valid agent credentials provided"],
252
+ // Round-10 (#47, O5): on API-error fallback, surface a typed failure so
253
+ // partners (and their custom onDenied handlers) can branch on
254
+ // dimension. Without this, the synthesised stub was indistinguishable
255
+ // from a real policy deny.
256
+ failures: isApiError ? [
257
+ {
258
+ dimension: "verify_access.api_error",
259
+ message: reason ?? "Verification temporarily unavailable",
260
+ guidance: guidance.message
261
+ }
262
+ ] : void 0,
263
+ correlationId: options.correlationId,
242
264
  verifiedAt: /* @__PURE__ */ new Date()
243
265
  };
244
266
  }
@@ -313,7 +335,8 @@ async function callVerifyAccessAPI(config, request) {
313
335
  if (!response.ok) {
314
336
  return {
315
337
  success: false,
316
- error: data.message || data.error || `API returned ${response.status}`
338
+ error: data.message || data.error || `API returned ${response.status}`,
339
+ correlationId: typeof data?.correlationId === "string" ? data.correlationId : void 0
317
340
  };
318
341
  }
319
342
  return data;
@@ -357,7 +380,10 @@ async function verify(config, request) {
357
380
  }
358
381
  const apiResponse = await callVerifyAccessAPI(mergedConfig, enrichedRequest);
359
382
  if (!apiResponse.success) {
360
- return createGuidanceResponse(mergedConfig, apiResponse.error);
383
+ return createGuidanceResponse(mergedConfig, apiResponse.error, {
384
+ source: "api_error",
385
+ correlationId: apiResponse.correlationId
386
+ });
361
387
  }
362
388
  if (!apiResponse.access?.allowed) {
363
389
  const aggregatedFailures = apiResponse.access?.failures;
@@ -689,13 +715,17 @@ function findRouteConfig(routes, path, method) {
689
715
  }
690
716
  function defaultOnDenied(result, _req, res) {
691
717
  const statusCode = result.verified ? 403 : 401;
718
+ res.setHeader("X-Astra-Gateway-Mode", "enforced");
692
719
  res.status(statusCode).json({
693
720
  success: false,
694
721
  error: {
695
722
  code: result.verified ? "INSUFFICIENT_ACCESS" : "UNAUTHORIZED",
696
723
  message: result.denialReasons?.[0] || "Access denied",
697
724
  accessLevel: result.accessLevel,
698
- guidance: result.guidance
725
+ guidance: result.guidance,
726
+ // Round-10: aggregated per-dimension detail + correlation handle.
727
+ failures: result.failures,
728
+ correlationId: result.correlationId
699
729
  }
700
730
  });
701
731
  }
@@ -760,7 +790,7 @@ function createMiddleware(options) {
760
790
  const routeConfig = findRouteConfig(cachedRoutes, req.path, req.method);
761
791
  if (!routeConfig) {
762
792
  if (config.setPassThroughHeader) {
763
- res.setHeader("X-Astra-Gateway-Mode", "pass-through");
793
+ res.setHeader("X-Astra-Gateway-Mode", "unenforced");
764
794
  res.setHeader(
765
795
  "X-Astra-Gateway-Reason",
766
796
  cachedRoutes.length === 0 ? "no-policy" : "no-match"
@@ -770,7 +800,7 @@ function createMiddleware(options) {
770
800
  }
771
801
  if (routeConfig.minAccessLevel === "none") {
772
802
  if (config.setPassThroughHeader) {
773
- res.setHeader("X-Astra-Gateway-Mode", "pass-through");
803
+ res.setHeader("X-Astra-Gateway-Mode", "unenforced");
774
804
  res.setHeader("X-Astra-Gateway-Reason", "route-none");
775
805
  }
776
806
  return next();