@astrasyncai/verification-gateway 4.2.1 → 4.4.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 (138) 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 +145 -21
  7. package/dist/adapters/express.js.map +1 -1
  8. package/dist/adapters/express.mjs +145 -21
  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 +72 -16
  13. package/dist/adapters/mcp.js.map +1 -1
  14. package/dist/adapters/mcp.mjs +72 -16
  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 +141 -19
  19. package/dist/adapters/nextjs.js.map +1 -1
  20. package/dist/adapters/nextjs.mjs +141 -19
  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 +24 -6
  25. package/dist/adapters/sdk.js.map +1 -1
  26. package/dist/adapters/sdk.mjs +24 -6
  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 +24 -3
  31. package/dist/agent/index.js.map +1 -1
  32. package/dist/agent/index.mjs +24 -3
  33. package/dist/agent/index.mjs.map +1 -1
  34. package/dist/bin/astrasync-claude-hook.js +22 -4
  35. package/dist/bin/astrasync-codex-hook.js +22 -4
  36. package/dist/bin/astrasync-guard.js +26 -8
  37. package/dist/bin/astrasync.js +76 -23
  38. package/dist/browser/background.js +22 -4
  39. package/dist/browser/background.js.map +1 -1
  40. package/dist/browser/background.mjs +22 -4
  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 +23 -2
  49. package/dist/cli/index.js.map +1 -1
  50. package/dist/cli/index.mjs +23 -2
  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 +22 -4
  55. package/dist/codex/index.js.map +1 -1
  56. package/dist/codex/index.mjs +22 -4
  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 +22 -4
  63. package/dist/cursor/extension.js.map +1 -1
  64. package/dist/cursor/extension.mjs +22 -4
  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 +24 -1
  69. package/dist/edge-config.js.map +1 -1
  70. package/dist/edge-config.mjs +22 -1
  71. package/dist/edge-config.mjs.map +1 -1
  72. package/dist/edge-core/index.d.mts +1 -1
  73. package/dist/edge-core/index.d.ts +1 -1
  74. package/dist/edge-core/index.js +121 -16
  75. package/dist/edge-core/index.js.map +1 -1
  76. package/dist/edge-core/index.mjs +121 -16
  77. package/dist/edge-core/index.mjs.map +1 -1
  78. package/dist/{express-D_4hTn5Z.d.mts → express-CR6F3njD.d.mts} +1 -1
  79. package/dist/{express-BVd1_3FE.d.ts → express-DaqL11tx.d.ts} +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 +22 -4
  83. package/dist/gateway/gateway.js.map +1 -1
  84. package/dist/gateway/gateway.mjs +22 -4
  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-BqHKlLOU.d.ts → index-B5Ts1WtM.d.ts} +1 -1
  89. package/dist/{index-T1aBoUcc.d.ts → index-BfIxCYIZ.d.ts} +1 -1
  90. package/dist/{index-BTeQ9fgV.d.mts → index-Cub7lK-T.d.mts} +1 -1
  91. package/dist/{index-DQb5-_1X.d.mts → index-CwAh7Tln.d.mts} +1 -1
  92. package/dist/index.d.mts +58 -9
  93. package/dist/index.d.ts +58 -9
  94. package/dist/index.js +218 -54
  95. package/dist/index.js.map +1 -1
  96. package/dist/index.mjs +214 -54
  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/metadata-capture.d.mts +35 -5
  101. package/dist/metadata-capture.d.ts +35 -5
  102. package/dist/metadata-capture.js +44 -6
  103. package/dist/metadata-capture.js.map +1 -1
  104. package/dist/metadata-capture.mjs +43 -6
  105. package/dist/metadata-capture.mjs.map +1 -1
  106. package/dist/{nextjs-w7RTbP1P.d.ts → nextjs-DL6uE1ye.d.ts} +1 -1
  107. package/dist/{nextjs-WyeVr2Kp.d.mts → nextjs-DlX6xwbU.d.mts} +1 -1
  108. package/dist/platform-signatures.d.mts +18 -1
  109. package/dist/platform-signatures.d.ts +18 -1
  110. package/dist/platform-signatures.js +35 -2
  111. package/dist/platform-signatures.js.map +1 -1
  112. package/dist/platform-signatures.mjs +35 -2
  113. package/dist/platform-signatures.mjs.map +1 -1
  114. package/dist/registration/index.js +25 -4
  115. package/dist/registration/index.js.map +1 -1
  116. package/dist/registration/index.mjs +25 -4
  117. package/dist/registration/index.mjs.map +1 -1
  118. package/dist/{sdk-CbTNIkAa.d.mts → sdk-Bbh9B_dw.d.mts} +1 -1
  119. package/dist/{sdk-QeX0Z8Ho.d.ts → sdk-C6SASmsh.d.ts} +1 -1
  120. package/dist/transport/index.d.mts +2 -2
  121. package/dist/transport/index.d.ts +2 -2
  122. package/dist/transport/index.js +22 -1
  123. package/dist/transport/index.js.map +1 -1
  124. package/dist/transport/index.mjs +22 -1
  125. package/dist/transport/index.mjs.map +1 -1
  126. package/dist/{types-r850cOt0.d.mts → types-C0zfSXMB.d.mts} +22 -0
  127. package/dist/{types-DqfPU5Bl.d.mts → types-C7Rb-w0d.d.mts} +1 -1
  128. package/dist/{types-sMxBT-nM.d.ts → types-DwSfO7Sb.d.ts} +22 -0
  129. package/dist/{types-BLUx92FJ.d.ts → types-nIh3HtuA.d.ts} +1 -1
  130. package/dist/ui/index.d.mts +1 -1
  131. package/dist/ui/index.d.ts +1 -1
  132. package/dist/verify.d.mts +1 -1
  133. package/dist/verify.d.ts +1 -1
  134. package/dist/verify.js +29 -11
  135. package/dist/verify.js.map +1 -1
  136. package/dist/verify.mjs +29 -11
  137. package/dist/verify.mjs.map +1 -1
  138. package/package.json +1 -1
@@ -1,3 +1,24 @@
1
+ // src/version.ts
2
+ var SDK_VERSION = "4.4.0";
3
+
4
+ // src/http.ts
5
+ var SDK_USER_AGENT = `astrasync-sdk/${SDK_VERSION}`;
6
+ function withUserAgent(initHeaders) {
7
+ if (!initHeaders) return { "user-agent": SDK_USER_AGENT };
8
+ if (initHeaders instanceof Headers) {
9
+ const copy = new Headers(initHeaders);
10
+ if (!copy.has("user-agent")) copy.set("user-agent", SDK_USER_AGENT);
11
+ return copy;
12
+ }
13
+ if (Array.isArray(initHeaders)) {
14
+ const has2 = initHeaders.some(([name]) => name.toLowerCase() === "user-agent");
15
+ return has2 ? initHeaders : [...initHeaders, ["user-agent", SDK_USER_AGENT]];
16
+ }
17
+ const has = Object.keys(initHeaders).some((name) => name.toLowerCase() === "user-agent");
18
+ return has ? initHeaders : { "user-agent": SDK_USER_AGENT, ...initHeaders };
19
+ }
20
+ var sdkFetch = (input, init) => fetch(input, { ...init, headers: withUserAgent(init?.headers) });
21
+
1
22
  // src/access-levels.ts
2
23
  function getTrustLevel(score) {
3
24
  if (score >= 80) return "PLATINUM";
@@ -6,9 +27,6 @@ function getTrustLevel(score) {
6
27
  return "BRONZE";
7
28
  }
8
29
 
9
- // src/version.ts
10
- var SDK_VERSION = "4.1.0";
11
-
12
30
  // src/well-known.ts
13
31
  var CACHE_TTL_MS = 60 * 60 * 1e3;
14
32
  var cache = /* @__PURE__ */ new Map();
@@ -19,7 +37,7 @@ function wellKnownUrl(apiBaseUrl) {
19
37
  }
20
38
  async function fetchWellKnown(apiBaseUrl) {
21
39
  const url = wellKnownUrl(apiBaseUrl);
22
- const response = await fetch(url, {
40
+ const response = await sdkFetch(url, {
23
41
  method: "GET",
24
42
  headers: { Accept: "application/json" },
25
43
  signal: AbortSignal.timeout(5e3)
@@ -89,7 +107,7 @@ async function performInitCheck(apiBaseUrl, debug, strictInit, apiKey) {
89
107
  initCheckPerformed = true;
90
108
  try {
91
109
  const probeUrl = `${apiBaseUrl}/agents/verify-access`;
92
- const response = await fetch(probeUrl, { method: "HEAD" });
110
+ const response = await sdkFetch(probeUrl, { method: "HEAD" });
93
111
  const contentType = response.headers.get("content-type") ?? "";
94
112
  if (contentType.startsWith("text/html")) {
95
113
  const message = `[VerificationGateway] apiBaseUrl '${apiBaseUrl}' returned HTML (content-type: ${contentType}). This usually means apiBaseUrl is pointing at a marketing site instead of the API. Expected: 'https://astrasync.ai/api' (prod) or 'https://staging.astrasync.ai/api' (staging).`;
@@ -103,7 +121,7 @@ async function performInitCheck(apiBaseUrl, debug, strictInit, apiKey) {
103
121
  );
104
122
  }
105
123
  if (apiKey) {
106
- const selfCheck = await fetch(`${apiBaseUrl}/agents/verify-access/self-check`, {
124
+ const selfCheck = await sdkFetch(`${apiBaseUrl}/agents/verify-access/self-check`, {
107
125
  headers: { Authorization: `Bearer ${apiKey}` }
108
126
  });
109
127
  if (selfCheck.status === 401) {
@@ -350,7 +368,7 @@ async function callVerifyAccessAPI(config, request) {
350
368
  headers["X-API-Key"] = config.apiKey;
351
369
  }
352
370
  try {
353
- const response = await fetch(`${config.apiBaseUrl}/agents/verify-access`, {
371
+ const response = await sdkFetch(`${config.apiBaseUrl}/agents/verify-access`, {
354
372
  method: "POST",
355
373
  headers,
356
374
  body: JSON.stringify(body),
@@ -593,7 +611,7 @@ async function recordDecision(config, sessionId, decision, reason) {
593
611
  headers["Authorization"] = `Bearer ${config.apiKey}`;
594
612
  headers["X-API-Key"] = config.apiKey;
595
613
  }
596
- await fetch(`${config.apiBaseUrl}/agents/verify-access/${sessionId}/decision`, {
614
+ await sdkFetch(`${config.apiBaseUrl}/agents/verify-access/${sessionId}/decision`, {
597
615
  method: "POST",
598
616
  headers,
599
617
  body: JSON.stringify({ decision, reason })
@@ -611,7 +629,9 @@ var SECRET_HEADER_NAMES = /* @__PURE__ */ new Set([
611
629
  "x-astrasync-signature",
612
630
  "x-astrasync-secret",
613
631
  "x-hub-signature",
614
- "x-hub-signature-256"
632
+ "x-hub-signature-256",
633
+ // Short-lived verify dedupe token — must never persist in stored metadata.
634
+ "x-astra-verified-hop"
615
635
  ]);
616
636
  var SECRET_HEADER_PREFIXES = ["x-astrasync-", "kya-", "kya_"];
617
637
  var CREDENTIAL_HEADER_NAMES = /* @__PURE__ */ new Set([
@@ -636,7 +656,13 @@ var PLATFORM_HEADER_NAMES = /* @__PURE__ */ new Set([
636
656
  "x-agent-card-url",
637
657
  "x-agent-provider"
638
658
  ]);
639
- var PLATFORM_HEADER_PREFIXES = ["x-goog-", "x-stainless-", "x-anthropic-", "x-openai-"];
659
+ var PLATFORM_HEADER_PREFIXES = [
660
+ "x-goog-",
661
+ "x-stainless-",
662
+ "x-anthropic-",
663
+ "x-openai-",
664
+ "sec-ch-"
665
+ ];
640
666
  var KEY_FORMAT_PREFIXES = [
641
667
  "sk-ant-api03",
642
668
  "sk-ant-api",
@@ -708,6 +734,7 @@ function sanitizeHeaders(raw) {
708
734
  const headers = {};
709
735
  const platformHeaders = {};
710
736
  let apiKeyFormat;
737
+ let cookieCount;
711
738
  let totalBytes = 0;
712
739
  let count = 0;
713
740
  if (!raw) return { headers };
@@ -722,6 +749,9 @@ function sanitizeHeaders(raw) {
722
749
  if (fmt && !apiKeyFormat) apiKeyFormat = fmt;
723
750
  continue;
724
751
  }
752
+ if (name === "cookie") {
753
+ cookieCount = joined.split(";").filter((s) => s.trim().length > 0).length;
754
+ }
725
755
  if (isSecretHeader(name)) continue;
726
756
  let value = joined;
727
757
  if (byteLength(value) > MAX_HEADER_VALUE_BYTES) {
@@ -737,6 +767,7 @@ function sanitizeHeaders(raw) {
737
767
  const result = { headers };
738
768
  if (apiKeyFormat) result.apiKeyFormat = apiKeyFormat;
739
769
  if (Object.keys(platformHeaders).length > 0) result.platformHeaders = platformHeaders;
770
+ if (cookieCount !== void 0) result.cookieCount = cookieCount;
740
771
  return result;
741
772
  }
742
773
  var CONNECTION_HEADER_SOURCES = [
@@ -746,16 +777,28 @@ var CONNECTION_HEADER_SOURCES = [
746
777
  ["cf-ipcountry", "x-vercel-ip-country", "cloudfront-viewer-country", "fastly-geo-country"]
747
778
  ],
748
779
  ["region", ["x-vercel-ip-country-region", "cloudfront-viewer-country-region"]],
780
+ ["countryRegionName", ["cloudfront-viewer-country-region-name"]],
749
781
  ["city", ["x-vercel-ip-city", "cloudfront-viewer-city"]],
782
+ ["latitude", ["x-vercel-ip-latitude", "cloudfront-viewer-latitude"]],
783
+ ["longitude", ["x-vercel-ip-longitude", "cloudfront-viewer-longitude"]],
784
+ ["postalCode", ["x-vercel-ip-postal-code", "cloudfront-viewer-postal-code"]],
750
785
  ["asn", ["cloudfront-viewer-asn"]],
751
786
  ["tlsVersion", ["cloudfront-viewer-tls"]],
752
787
  ["httpVersion", ["cloudfront-viewer-http-version"]],
788
+ ["timeZone", ["x-vercel-ip-timezone", "cloudfront-viewer-time-zone"]],
789
+ ["metroCode", ["cloudfront-viewer-metro-code"]],
753
790
  // TLS fingerprints can only be computed where TLS terminates. When a CDN
754
791
  // terminates TLS in front of the merchant, its fingerprint headers ARE the
755
792
  // connection-layer truth — normalising them here is the permanent design.
756
- ["tlsFingerprint", ["cf-ja3-hash"]],
757
- ["ja4", ["cf-ja4"]]
793
+ // CloudFront delivers JA3/JA4 only via an origin request policy and only
794
+ // for HTTPS viewer connections.
795
+ ["tlsFingerprint", ["cf-ja3-hash", "cloudfront-viewer-ja3-fingerprint"]],
796
+ ["ja4", ["cf-ja4", "cloudfront-viewer-ja4-fingerprint"]],
797
+ // Header-structure fingerprint: browser/SDK-distinctive header ordering.
798
+ ["headerOrder", ["cloudfront-viewer-header-order"]],
799
+ ["headerCount", ["cloudfront-viewer-header-count"]]
758
800
  ];
801
+ var MAX_CONNECTION_VALUE_CHARS = 256;
759
802
  function deriveConnectionFromHeaders(headers) {
760
803
  if (!headers) return void 0;
761
804
  const lower = {};
@@ -768,20 +811,30 @@ function deriveConnectionFromHeaders(headers) {
768
811
  for (const source of sources) {
769
812
  const value = lower[source]?.trim();
770
813
  if (value) {
771
- connection[key] = value;
814
+ connection[key] = value.slice(0, MAX_CONNECTION_VALUE_CHARS);
772
815
  break;
773
816
  }
774
817
  }
775
818
  }
819
+ {
820
+ const addr = lower["cloudfront-viewer-address"]?.trim();
821
+ const portMatch = addr?.match(/:(\d+)$/);
822
+ if (portMatch) connection.sourcePort = portMatch[1];
823
+ if (!connection.ip && addr) connection.ip = addr.replace(/:\d+$/, "");
824
+ }
776
825
  if (!connection.ip) {
777
826
  const xff = lower["x-forwarded-for"];
778
827
  const client = xff?.split(",")[0]?.trim();
779
828
  if (client) connection.ip = client;
780
829
  }
830
+ if (!connection.tlsCipher) {
831
+ const cipher = connection.tlsVersion?.split(":")[1];
832
+ if (cipher) connection.tlsCipher = cipher;
833
+ }
781
834
  return Object.keys(connection).length > 0 ? connection : void 0;
782
835
  }
783
836
  function buildSdkObservedMetadata(rawHeaders) {
784
- const { headers, apiKeyFormat, platformHeaders } = sanitizeHeaders(rawHeaders);
837
+ const { headers, apiKeyFormat, platformHeaders, cookieCount } = sanitizeHeaders(rawHeaders);
785
838
  const flat = {};
786
839
  if (rawHeaders) {
787
840
  for (const name of Object.keys(rawHeaders)) {
@@ -796,6 +849,7 @@ function buildSdkObservedMetadata(rawHeaders) {
796
849
  ...apiKeyFormat && { apiKeyFormat },
797
850
  ...platformHeaders && { platformHeaders },
798
851
  ...connection && { connection },
852
+ ...cookieCount !== void 0 && { cookieCount },
799
853
  schemaVersion: CAPTURE_SCHEMA_VERSION
800
854
  };
801
855
  }
@@ -827,7 +881,7 @@ function resolvePollUrl(config, pollUrl) {
827
881
  async function pollStepUpStatus(config, approval) {
828
882
  if (!approval.pollUrl) return null;
829
883
  try {
830
- const res = await fetch(resolvePollUrl(config, approval.pollUrl), {
884
+ const res = await sdkFetch(resolvePollUrl(config, approval.pollUrl), {
831
885
  method: "GET",
832
886
  signal: AbortSignal.timeout(POLL_REQUEST_TIMEOUT_MS)
833
887
  });
@@ -871,7 +925,7 @@ async function awaitStepUpApproval(config, approval) {
871
925
  return "timeout";
872
926
  }
873
927
 
874
- // src/transport/mcp-server.ts
928
+ // src/verified-hop.ts
875
929
  var MCP_VERIFIED_HOP_HEADER = "X-Astra-Verified-Hop";
876
930
  var MCP_VERIFIED_HOP_MAX_AGE_MS = 6e4;
877
931
  function serializeVerifiedHop(marker) {
@@ -898,6 +952,8 @@ function isVerifiedHopValidFor(marker, expectedAstraId, opts = {}) {
898
952
  const now = opts.now ?? Date.now();
899
953
  return now - marker.checkedAt <= maxAge && now >= marker.checkedAt;
900
954
  }
955
+
956
+ // src/transport/mcp-server.ts
901
957
  function parseMcpJsonRpc(body) {
902
958
  if (!body || typeof body !== "object" || Array.isArray(body)) return null;
903
959
  const obj = body;