@astrasyncai/verification-gateway 4.2.0 → 4.3.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 (112) hide show
  1. package/README.md +45 -21
  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 +56 -4
  7. package/dist/adapters/express.js.map +1 -1
  8. package/dist/adapters/express.mjs +56 -4
  9. package/dist/adapters/express.mjs.map +1 -1
  10. package/dist/adapters/mcp.d.mts +38 -30
  11. package/dist/adapters/mcp.d.ts +38 -30
  12. package/dist/adapters/mcp.js +22 -5
  13. package/dist/adapters/mcp.js.map +1 -1
  14. package/dist/adapters/mcp.mjs +22 -5
  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 +54 -4
  19. package/dist/adapters/nextjs.js.map +1 -1
  20. package/dist/adapters/nextjs.mjs +54 -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/agent/index.d.mts +2 -2
  25. package/dist/agent/index.d.ts +2 -2
  26. package/dist/agent/index.js +2 -2
  27. package/dist/agent/index.js.map +1 -1
  28. package/dist/agent/index.mjs +2 -2
  29. package/dist/agent/index.mjs.map +1 -1
  30. package/dist/bin/astrasync-claude-hook.js +2 -2
  31. package/dist/bin/astrasync-codex-hook.js +2 -2
  32. package/dist/bin/astrasync-guard.js +2 -2
  33. package/dist/bin/astrasync.js +14 -4
  34. package/dist/browser/background.js +2 -2
  35. package/dist/browser/background.js.map +1 -1
  36. package/dist/browser/background.mjs +2 -2
  37. package/dist/browser/background.mjs.map +1 -1
  38. package/dist/browser/browser-adapter.d.mts +2 -2
  39. package/dist/browser/browser-adapter.d.ts +2 -2
  40. package/dist/claude-code/claude-code-adapter.d.mts +2 -2
  41. package/dist/claude-code/claude-code-adapter.d.ts +2 -2
  42. package/dist/cli/index.d.mts +2 -2
  43. package/dist/cli/index.d.ts +2 -2
  44. package/dist/codex/index.d.mts +2 -2
  45. package/dist/codex/index.d.ts +2 -2
  46. package/dist/codex/index.js +2 -2
  47. package/dist/codex/index.js.map +1 -1
  48. package/dist/codex/index.mjs +2 -2
  49. package/dist/codex/index.mjs.map +1 -1
  50. package/dist/cursor/cursor-adapter.d.mts +2 -2
  51. package/dist/cursor/cursor-adapter.d.ts +2 -2
  52. package/dist/cursor/extension.d.mts +2 -2
  53. package/dist/cursor/extension.d.ts +2 -2
  54. package/dist/cursor/extension.js +2 -2
  55. package/dist/cursor/extension.js.map +1 -1
  56. package/dist/cursor/extension.mjs +2 -2
  57. package/dist/cursor/extension.mjs.map +1 -1
  58. package/dist/edge-config.d.mts +1 -1
  59. package/dist/edge-config.d.ts +1 -1
  60. package/dist/edge-core/index.d.mts +1 -1
  61. package/dist/edge-core/index.d.ts +1 -1
  62. package/dist/edge-core/index.js +25 -5
  63. package/dist/edge-core/index.js.map +1 -1
  64. package/dist/edge-core/index.mjs +25 -5
  65. package/dist/edge-core/index.mjs.map +1 -1
  66. package/dist/{express-D_4hTn5Z.d.mts → express-CR6F3njD.d.mts} +1 -1
  67. package/dist/{express-BVd1_3FE.d.ts → express-DaqL11tx.d.ts} +1 -1
  68. package/dist/gateway/gateway.d.mts +2 -2
  69. package/dist/gateway/gateway.d.ts +2 -2
  70. package/dist/gateway/gateway.js +2 -2
  71. package/dist/gateway/gateway.js.map +1 -1
  72. package/dist/gateway/gateway.mjs +2 -2
  73. package/dist/gateway/gateway.mjs.map +1 -1
  74. package/dist/git-trigger/git-hooks.d.mts +2 -2
  75. package/dist/git-trigger/git-hooks.d.ts +2 -2
  76. package/dist/{index-B0YHu_SP.d.ts → index-B5Ts1WtM.d.ts} +3 -3
  77. package/dist/{index-T1aBoUcc.d.ts → index-BfIxCYIZ.d.ts} +1 -1
  78. package/dist/{index-BPEBlOsE.d.mts → index-Cub7lK-T.d.mts} +3 -3
  79. package/dist/{index-DQb5-_1X.d.mts → index-CwAh7Tln.d.mts} +1 -1
  80. package/dist/index.d.mts +7 -7
  81. package/dist/index.d.ts +7 -7
  82. package/dist/index.js +74 -35
  83. package/dist/index.js.map +1 -1
  84. package/dist/index.mjs +71 -32
  85. package/dist/index.mjs.map +1 -1
  86. package/dist/local-evaluator/evaluator.d.mts +2 -2
  87. package/dist/local-evaluator/evaluator.d.ts +2 -2
  88. package/dist/metadata-capture.d.mts +18 -5
  89. package/dist/metadata-capture.d.ts +18 -5
  90. package/dist/metadata-capture.js +21 -4
  91. package/dist/metadata-capture.js.map +1 -1
  92. package/dist/metadata-capture.mjs +20 -4
  93. package/dist/metadata-capture.mjs.map +1 -1
  94. package/dist/{nextjs-w7RTbP1P.d.ts → nextjs-DL6uE1ye.d.ts} +1 -1
  95. package/dist/{nextjs-WyeVr2Kp.d.mts → nextjs-DlX6xwbU.d.mts} +1 -1
  96. package/dist/{sdk-CbTNIkAa.d.mts → sdk-Bbh9B_dw.d.mts} +1 -1
  97. package/dist/{sdk-QeX0Z8Ho.d.ts → sdk-C6SASmsh.d.ts} +1 -1
  98. package/dist/transport/index.d.mts +2 -2
  99. package/dist/transport/index.d.ts +2 -2
  100. package/dist/transport/index.js +5 -5
  101. package/dist/transport/index.js.map +1 -1
  102. package/dist/transport/index.mjs +2 -2
  103. package/dist/transport/index.mjs.map +1 -1
  104. package/dist/{types-r850cOt0.d.mts → types-C0zfSXMB.d.mts} +22 -0
  105. package/dist/{types-DqfPU5Bl.d.mts → types-C7Rb-w0d.d.mts} +1 -1
  106. package/dist/{types-sMxBT-nM.d.ts → types-DwSfO7Sb.d.ts} +22 -0
  107. package/dist/{types-BLUx92FJ.d.ts → types-nIh3HtuA.d.ts} +1 -1
  108. package/dist/ui/index.d.mts +1 -1
  109. package/dist/ui/index.d.ts +1 -1
  110. package/dist/verify.d.mts +1 -1
  111. package/dist/verify.d.ts +1 -1
  112. package/package.json +2 -4
@@ -1,4 +1,4 @@
1
1
  import 'next/server';
2
- import '../types-r850cOt0.mjs';
3
- export { c as createMatcherConfig, a as createMiddleware } from '../nextjs-WyeVr2Kp.mjs';
2
+ import '../types-C0zfSXMB.mjs';
3
+ export { c as createMatcherConfig, a as createMiddleware } from '../nextjs-DlX6xwbU.mjs';
4
4
  import '../metadata-capture.mjs';
@@ -1,4 +1,4 @@
1
1
  import 'next/server';
2
- import '../types-sMxBT-nM.js';
3
- export { c as createMatcherConfig, a as createMiddleware } from '../nextjs-w7RTbP1P.js';
2
+ import '../types-DwSfO7Sb.js';
3
+ export { c as createMatcherConfig, a as createMiddleware } from '../nextjs-DL6uE1ye.js';
4
4
  import '../metadata-capture.js';
@@ -778,7 +778,9 @@ var SECRET_HEADER_NAMES = /* @__PURE__ */ new Set([
778
778
  "x-astrasync-signature",
779
779
  "x-astrasync-secret",
780
780
  "x-hub-signature",
781
- "x-hub-signature-256"
781
+ "x-hub-signature-256",
782
+ // Short-lived verify dedupe token — must never persist in stored metadata.
783
+ "x-astra-verified-hop"
782
784
  ]);
783
785
  var SECRET_HEADER_PREFIXES = ["x-astrasync-", "kya-", "kya_"];
784
786
  var CREDENTIAL_HEADER_NAMES = /* @__PURE__ */ new Set([
@@ -913,16 +915,25 @@ var CONNECTION_HEADER_SOURCES = [
913
915
  ["cf-ipcountry", "x-vercel-ip-country", "cloudfront-viewer-country", "fastly-geo-country"]
914
916
  ],
915
917
  ["region", ["x-vercel-ip-country-region", "cloudfront-viewer-country-region"]],
918
+ ["countryRegionName", ["cloudfront-viewer-country-region-name"]],
916
919
  ["city", ["x-vercel-ip-city", "cloudfront-viewer-city"]],
917
920
  ["asn", ["cloudfront-viewer-asn"]],
918
921
  ["tlsVersion", ["cloudfront-viewer-tls"]],
919
922
  ["httpVersion", ["cloudfront-viewer-http-version"]],
923
+ ["timeZone", ["x-vercel-ip-timezone", "cloudfront-viewer-time-zone"]],
924
+ ["metroCode", ["cloudfront-viewer-metro-code"]],
920
925
  // TLS fingerprints can only be computed where TLS terminates. When a CDN
921
926
  // terminates TLS in front of the merchant, its fingerprint headers ARE the
922
927
  // connection-layer truth — normalising them here is the permanent design.
923
- ["tlsFingerprint", ["cf-ja3-hash"]],
924
- ["ja4", ["cf-ja4"]]
928
+ // CloudFront delivers JA3/JA4 only via an origin request policy and only
929
+ // for HTTPS viewer connections.
930
+ ["tlsFingerprint", ["cf-ja3-hash", "cloudfront-viewer-ja3-fingerprint"]],
931
+ ["ja4", ["cf-ja4", "cloudfront-viewer-ja4-fingerprint"]],
932
+ // Header-structure fingerprint: browser/SDK-distinctive header ordering.
933
+ ["headerOrder", ["cloudfront-viewer-header-order"]],
934
+ ["headerCount", ["cloudfront-viewer-header-count"]]
925
935
  ];
936
+ var MAX_CONNECTION_VALUE_CHARS = 256;
926
937
  function deriveConnectionFromHeaders(headers) {
927
938
  if (!headers) return void 0;
928
939
  const lower = {};
@@ -935,11 +946,15 @@ function deriveConnectionFromHeaders(headers) {
935
946
  for (const source of sources) {
936
947
  const value = lower[source]?.trim();
937
948
  if (value) {
938
- connection[key] = value;
949
+ connection[key] = value.slice(0, MAX_CONNECTION_VALUE_CHARS);
939
950
  break;
940
951
  }
941
952
  }
942
953
  }
954
+ if (!connection.ip) {
955
+ const addr = lower["cloudfront-viewer-address"]?.trim();
956
+ if (addr) connection.ip = addr.replace(/:\d+$/, "");
957
+ }
943
958
  if (!connection.ip) {
944
959
  const xff = lower["x-forwarded-for"];
945
960
  const client = xff?.split(",")[0]?.trim();
@@ -1352,6 +1367,31 @@ function annotateApprovalRequired(result) {
1352
1367
  result.denialReasons = [APPROVAL_REASON, ...result.denialReasons ?? []];
1353
1368
  }
1354
1369
 
1370
+ // src/verified-hop.ts
1371
+ var MCP_VERIFIED_HOP_HEADER = "X-Astra-Verified-Hop";
1372
+ var MCP_VERIFIED_HOP_MAX_AGE_MS = 6e4;
1373
+ function parseVerifiedHop(value) {
1374
+ if (!value) return null;
1375
+ const parts = value.split(";");
1376
+ if (parts.length !== 3) return null;
1377
+ const [astraId, sessionId, checkedAtRaw] = parts;
1378
+ if (!astraId) return null;
1379
+ const checkedAt = Number(checkedAtRaw);
1380
+ if (!Number.isFinite(checkedAt) || checkedAt <= 0) return null;
1381
+ return {
1382
+ astraId,
1383
+ ...sessionId ? { sessionId } : {},
1384
+ checkedAt
1385
+ };
1386
+ }
1387
+ function isVerifiedHopValidFor(marker, expectedAstraId, opts = {}) {
1388
+ if (!marker) return false;
1389
+ if (marker.astraId !== expectedAstraId) return false;
1390
+ const maxAge = opts.maxAgeMs ?? MCP_VERIFIED_HOP_MAX_AGE_MS;
1391
+ const now = opts.now ?? Date.now();
1392
+ return now - marker.checkedAt <= maxAge && now >= marker.checkedAt;
1393
+ }
1394
+
1355
1395
  // src/adapters/nextjs.ts
1356
1396
  function escapeHtml(value) {
1357
1397
  return value.replace(/&/g, "&amp;").replace(/</g, "&lt;").replace(/>/g, "&gt;").replace(/"/g, "&quot;").replace(/'/g, "&#39;");
@@ -1590,6 +1630,8 @@ function createMiddleware(options) {
1590
1630
  enableRuntimeChallenge = true,
1591
1631
  routesRefreshMs = DEFAULT_ROUTES_REFRESH_MS,
1592
1632
  anonymousBeacon = true,
1633
+ trustVerifiedHop = false,
1634
+ verifiedHopMaxAgeMs,
1593
1635
  ...config
1594
1636
  } = options;
1595
1637
  const interstitialEnabled = showInterstitial ?? showCommerceShield ?? true;
@@ -1652,6 +1694,14 @@ function createMiddleware(options) {
1652
1694
  return NextResponse.next();
1653
1695
  }
1654
1696
  const credentials = extractCredentialsFromNextRequest(request);
1697
+ if (trustVerifiedHop && credentials.astraId) {
1698
+ const marker = parseVerifiedHop(request.headers.get(MCP_VERIFIED_HOP_HEADER) ?? void 0);
1699
+ if (isVerifiedHopValidFor(marker, credentials.astraId, {
1700
+ ...verifiedHopMaxAgeMs !== void 0 ? { maxAgeMs: verifiedHopMaxAgeMs } : {}
1701
+ })) {
1702
+ return NextResponse.next();
1703
+ }
1704
+ }
1655
1705
  const counterpartyUrl = config.counterpartyUrl || request.nextUrl.origin;
1656
1706
  const pdlssPair = resolveNextPdlss(request, routeConfig);
1657
1707
  const purpose = pdlssPair.purpose;