@astrasyncai/verification-gateway 3.9.0 → 3.10.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 (104) hide show
  1. package/dist/adapter-interface/interface.d.mts +3 -2
  2. package/dist/adapter-interface/interface.d.ts +3 -2
  3. package/dist/adapters/express.d.mts +3 -2
  4. package/dist/adapters/express.d.ts +3 -2
  5. package/dist/adapters/express.js +151 -2
  6. package/dist/adapters/express.js.map +1 -1
  7. package/dist/adapters/express.mjs +151 -2
  8. package/dist/adapters/express.mjs.map +1 -1
  9. package/dist/adapters/mcp.d.mts +2 -1
  10. package/dist/adapters/mcp.d.ts +2 -1
  11. package/dist/adapters/mcp.js +1 -1
  12. package/dist/adapters/mcp.js.map +1 -1
  13. package/dist/adapters/mcp.mjs +1 -1
  14. package/dist/adapters/mcp.mjs.map +1 -1
  15. package/dist/adapters/nextjs.d.mts +3 -2
  16. package/dist/adapters/nextjs.d.ts +3 -2
  17. package/dist/adapters/nextjs.js +151 -2
  18. package/dist/adapters/nextjs.js.map +1 -1
  19. package/dist/adapters/nextjs.mjs +151 -2
  20. package/dist/adapters/nextjs.mjs.map +1 -1
  21. package/dist/adapters/sdk.d.mts +3 -2
  22. package/dist/adapters/sdk.d.ts +3 -2
  23. package/dist/adapters/sdk.js +1 -1
  24. package/dist/adapters/sdk.js.map +1 -1
  25. package/dist/adapters/sdk.mjs +1 -1
  26. package/dist/adapters/sdk.mjs.map +1 -1
  27. package/dist/agent/index.d.mts +3 -2
  28. package/dist/agent/index.d.ts +3 -2
  29. package/dist/bin/astrasync-claude-hook.js +4 -1
  30. package/dist/bin/astrasync-guard.js +4 -1
  31. package/dist/bin/astrasync.js +13 -1
  32. package/dist/browser/background.js +4 -1
  33. package/dist/browser/background.js.map +1 -1
  34. package/dist/browser/background.mjs +4 -1
  35. package/dist/browser/background.mjs.map +1 -1
  36. package/dist/browser/browser-adapter.d.mts +3 -2
  37. package/dist/browser/browser-adapter.d.ts +3 -2
  38. package/dist/claude-code/claude-code-adapter.d.mts +3 -2
  39. package/dist/claude-code/claude-code-adapter.d.ts +3 -2
  40. package/dist/cli/index.d.mts +3 -2
  41. package/dist/cli/index.d.ts +3 -2
  42. package/dist/cursor/cursor-adapter.d.mts +3 -2
  43. package/dist/cursor/cursor-adapter.d.ts +3 -2
  44. package/dist/cursor/extension.d.mts +3 -2
  45. package/dist/cursor/extension.d.ts +3 -2
  46. package/dist/cursor/extension.js +4 -1
  47. package/dist/cursor/extension.js.map +1 -1
  48. package/dist/cursor/extension.mjs +4 -1
  49. package/dist/cursor/extension.mjs.map +1 -1
  50. package/dist/edge-config.d.mts +2 -1
  51. package/dist/edge-config.d.ts +2 -1
  52. package/dist/{express-sGXhDdd0.d.ts → express-ClNtDhhc.d.ts} +1 -1
  53. package/dist/{express-DXUyvv7t.d.mts → express-DCXa1oqj.d.mts} +1 -1
  54. package/dist/gateway/gateway.d.mts +3 -2
  55. package/dist/gateway/gateway.d.ts +3 -2
  56. package/dist/gateway/gateway.js +4 -1
  57. package/dist/gateway/gateway.js.map +1 -1
  58. package/dist/gateway/gateway.mjs +4 -1
  59. package/dist/gateway/gateway.mjs.map +1 -1
  60. package/dist/git-trigger/git-hooks.d.mts +3 -2
  61. package/dist/git-trigger/git-hooks.d.ts +3 -2
  62. package/dist/{index-Dalih3EB.d.mts → index-BrNKDmiR.d.mts} +1 -1
  63. package/dist/{index-C61VL_OW.d.ts → index-CfHurO1P.d.ts} +1 -1
  64. package/dist/{index-CMg-vjEK.d.ts → index-D2ztkumS.d.ts} +1 -1
  65. package/dist/{index-DmmdehNu.d.mts → index-Dr_XiN65.d.mts} +1 -1
  66. package/dist/index.d.mts +10 -9
  67. package/dist/index.d.ts +10 -9
  68. package/dist/index.js +218 -11
  69. package/dist/index.js.map +1 -1
  70. package/dist/index.mjs +211 -11
  71. package/dist/index.mjs.map +1 -1
  72. package/dist/local-evaluator/evaluator.d.mts +3 -2
  73. package/dist/local-evaluator/evaluator.d.ts +3 -2
  74. package/dist/metadata-capture.d.mts +87 -0
  75. package/dist/metadata-capture.d.ts +87 -0
  76. package/dist/metadata-capture.js +184 -0
  77. package/dist/metadata-capture.js.map +1 -0
  78. package/dist/metadata-capture.mjs +154 -0
  79. package/dist/metadata-capture.mjs.map +1 -0
  80. package/dist/{nextjs-DwUW-Nm1.d.ts → nextjs-CEBVBsdi.d.ts} +1 -1
  81. package/dist/{nextjs-F_2pbPIA.d.mts → nextjs-DcQIk6Zj.d.mts} +1 -1
  82. package/dist/platform-signatures.d.mts +60 -10
  83. package/dist/platform-signatures.d.ts +60 -10
  84. package/dist/platform-signatures.js +37 -10
  85. package/dist/platform-signatures.js.map +1 -1
  86. package/dist/platform-signatures.mjs +35 -9
  87. package/dist/platform-signatures.mjs.map +1 -1
  88. package/dist/{sdk-Clob2-0A.d.mts → sdk-CZkbSOeO.d.mts} +1 -1
  89. package/dist/{sdk-CfHANs4A.d.ts → sdk-H0JCLW2y.d.ts} +1 -1
  90. package/dist/transport/index.d.mts +3 -2
  91. package/dist/transport/index.d.ts +3 -2
  92. package/dist/{types-ACMsV07B.d.mts → types-9tns4wyl.d.ts} +12 -0
  93. package/dist/{types-BtqUvK8v.d.mts → types-D0lCtFQ7.d.mts} +1 -1
  94. package/dist/{types-DmSDgPpG.d.ts → types-YbiXYKx1.d.ts} +1 -1
  95. package/dist/{types-ACMsV07B.d.ts → types-sy3tq8lp.d.mts} +12 -0
  96. package/dist/ui/index.d.mts +2 -1
  97. package/dist/ui/index.d.ts +2 -1
  98. package/dist/verify.d.mts +8 -1
  99. package/dist/verify.d.ts +8 -1
  100. package/dist/verify.js +1 -1
  101. package/dist/verify.js.map +1 -1
  102. package/dist/verify.mjs +1 -1
  103. package/dist/verify.mjs.map +1 -1
  104. package/package.json +6 -1
package/dist/index.mjs CHANGED
@@ -126,7 +126,7 @@ function getCapabilities(accessLevel) {
126
126
  }
127
127
 
128
128
  // src/version.ts
129
- var SDK_VERSION = "3.9.0";
129
+ var SDK_VERSION = "3.10.0";
130
130
 
131
131
  // src/well-known.ts
132
132
  var CACHE_TTL_MS = 60 * 60 * 1e3;
@@ -1023,6 +1023,152 @@ function performCounterpartyPreCheck(routeConfig, astraCreds, purpose) {
1023
1023
  return failures;
1024
1024
  }
1025
1025
 
1026
+ // src/metadata-capture.ts
1027
+ var SECRET_HEADER_NAMES = /* @__PURE__ */ new Set([
1028
+ "cookie",
1029
+ "set-cookie",
1030
+ "x-csrf-token",
1031
+ "proxy-authorization",
1032
+ "x-astrasync-signature",
1033
+ "x-astrasync-secret",
1034
+ "x-hub-signature",
1035
+ "x-hub-signature-256"
1036
+ ]);
1037
+ var SECRET_HEADER_PREFIXES = ["x-astrasync-", "kya-", "kya_"];
1038
+ var CREDENTIAL_HEADER_NAMES = /* @__PURE__ */ new Set([
1039
+ "authorization",
1040
+ "x-api-key",
1041
+ "x-goog-api-key",
1042
+ "api-key"
1043
+ ]);
1044
+ function isSignatureHeader(name) {
1045
+ return name === "signature" || name.endsWith("-signature") || name.endsWith("-signature-256");
1046
+ }
1047
+ var PLATFORM_HEADER_NAMES = /* @__PURE__ */ new Set([
1048
+ "openai-organization",
1049
+ "openai-project",
1050
+ "openai-version",
1051
+ "openai-processing-ms",
1052
+ "anthropic-version",
1053
+ "anthropic-beta",
1054
+ "x-goog-user-project",
1055
+ "x-goog-api-client",
1056
+ "user-agent",
1057
+ "x-agent-card-url",
1058
+ "x-agent-provider"
1059
+ ]);
1060
+ var PLATFORM_HEADER_PREFIXES = ["x-goog-", "x-stainless-", "x-anthropic-", "x-openai-"];
1061
+ var KEY_FORMAT_PREFIXES = [
1062
+ "sk-ant-api03",
1063
+ "sk-ant-api",
1064
+ "sk-ant",
1065
+ "sk-proj",
1066
+ "sk-svcacct",
1067
+ "sk-or-v1",
1068
+ "sk-or",
1069
+ "sk-lf",
1070
+ "sk-",
1071
+ "gsk_",
1072
+ "aiza",
1073
+ "ya29",
1074
+ "ghp_",
1075
+ "gho_",
1076
+ "github_pat_",
1077
+ "xai-",
1078
+ "pplx-",
1079
+ "r8_",
1080
+ "hf_",
1081
+ "astra-",
1082
+ "astrae-"
1083
+ ];
1084
+ var MAX_HEADERS = 64;
1085
+ var MAX_HEADER_VALUE_BYTES = 1024;
1086
+ var MAX_TOTAL_BYTES = 16 * 1024;
1087
+ function byteLength(s) {
1088
+ let bytes = 0;
1089
+ for (let i = 0; i < s.length; i++) {
1090
+ const code = s.charCodeAt(i);
1091
+ if (code < 128) bytes += 1;
1092
+ else if (code < 2048) bytes += 2;
1093
+ else if (code >= 55296 && code <= 56319) {
1094
+ bytes += 4;
1095
+ i++;
1096
+ } else bytes += 3;
1097
+ }
1098
+ return bytes;
1099
+ }
1100
+ function extractApiKeyFormat(rawValue) {
1101
+ if (!rawValue) return void 0;
1102
+ let value = rawValue.trim();
1103
+ const spaceIdx = value.indexOf(" ");
1104
+ if (spaceIdx > 0) {
1105
+ const scheme = value.slice(0, spaceIdx).toLowerCase();
1106
+ if (scheme === "bearer" || scheme === "basic" || scheme === "token") {
1107
+ value = value.slice(spaceIdx + 1).trim();
1108
+ }
1109
+ }
1110
+ const lower = value.toLowerCase();
1111
+ for (const prefix of KEY_FORMAT_PREFIXES) {
1112
+ if (lower.startsWith(prefix)) {
1113
+ return prefix;
1114
+ }
1115
+ }
1116
+ return void 0;
1117
+ }
1118
+ function isSecretHeader(name) {
1119
+ if (SECRET_HEADER_NAMES.has(name)) return true;
1120
+ if (SECRET_HEADER_PREFIXES.some((p) => name.startsWith(p))) return true;
1121
+ if (isSignatureHeader(name)) return true;
1122
+ return false;
1123
+ }
1124
+ function isPlatformHeader(name) {
1125
+ if (PLATFORM_HEADER_NAMES.has(name)) return true;
1126
+ return PLATFORM_HEADER_PREFIXES.some((p) => name.startsWith(p));
1127
+ }
1128
+ function sanitizeHeaders(raw) {
1129
+ const headers = {};
1130
+ const platformHeaders = {};
1131
+ let apiKeyFormat;
1132
+ let totalBytes = 0;
1133
+ let count = 0;
1134
+ if (!raw) return { headers };
1135
+ for (const rawName of Object.keys(raw)) {
1136
+ if (count >= MAX_HEADERS) break;
1137
+ const name = rawName.toLowerCase();
1138
+ const rawValue = raw[rawName];
1139
+ if (rawValue === void 0) continue;
1140
+ const joined = Array.isArray(rawValue) ? rawValue.join(", ") : String(rawValue);
1141
+ if (CREDENTIAL_HEADER_NAMES.has(name)) {
1142
+ const fmt = extractApiKeyFormat(joined);
1143
+ if (fmt && !apiKeyFormat) apiKeyFormat = fmt;
1144
+ continue;
1145
+ }
1146
+ if (isSecretHeader(name)) continue;
1147
+ let value = joined;
1148
+ if (byteLength(value) > MAX_HEADER_VALUE_BYTES) {
1149
+ value = value.slice(0, MAX_HEADER_VALUE_BYTES);
1150
+ }
1151
+ const entryBytes = byteLength(name) + byteLength(value);
1152
+ if (totalBytes + entryBytes > MAX_TOTAL_BYTES) continue;
1153
+ totalBytes += entryBytes;
1154
+ count++;
1155
+ headers[name] = value;
1156
+ if (isPlatformHeader(name)) platformHeaders[name] = value;
1157
+ }
1158
+ const result = { headers };
1159
+ if (apiKeyFormat) result.apiKeyFormat = apiKeyFormat;
1160
+ if (Object.keys(platformHeaders).length > 0) result.platformHeaders = platformHeaders;
1161
+ return result;
1162
+ }
1163
+ function extractPlatformHeaders(sanitized) {
1164
+ const out = {};
1165
+ if (!sanitized) return out;
1166
+ for (const name of Object.keys(sanitized)) {
1167
+ if (isPlatformHeader(name.toLowerCase())) out[name.toLowerCase()] = sanitized[name];
1168
+ }
1169
+ return out;
1170
+ }
1171
+
1026
1172
  // src/adapters/express.ts
1027
1173
  function defaultExtractCredentials(req) {
1028
1174
  return extractCredentials(
@@ -1289,7 +1435,18 @@ function createMiddleware(options) {
1289
1435
  referer: req.headers.referer,
1290
1436
  host: req.headers.host,
1291
1437
  forwardedFor: forwardedForStr,
1292
- agentCardUrl
1438
+ agentCardUrl,
1439
+ // Workstream D — capture EVERY inbound header (SDK-only merchants
1440
+ // have no edge to do it upstream). Local string work, secrets
1441
+ // stripped; out of the verify cache key so it doesn't defeat caching.
1442
+ observedMetadata: (() => {
1443
+ const { headers, apiKeyFormat, platformHeaders } = sanitizeHeaders(req.headers);
1444
+ return {
1445
+ headers,
1446
+ ...apiKeyFormat && { apiKeyFormat },
1447
+ ...platformHeaders && { platformHeaders }
1448
+ };
1449
+ })()
1293
1450
  }
1294
1451
  };
1295
1452
  let result = await verify(config, verificationRequest);
@@ -1769,7 +1926,18 @@ function createMiddleware2(options) {
1769
1926
  referer: request.headers.get("referer") || void 0,
1770
1927
  host: request.headers.get("host") || void 0,
1771
1928
  forwardedFor,
1772
- agentCardUrl: request.headers.get("x-astrasync-agent-card") || void 0
1929
+ agentCardUrl: request.headers.get("x-astrasync-agent-card") || void 0,
1930
+ // Workstream D — full sanitised header capture (Web Headers → plain map).
1931
+ observedMetadata: (() => {
1932
+ const { headers, apiKeyFormat, platformHeaders } = sanitizeHeaders(
1933
+ Object.fromEntries(request.headers.entries())
1934
+ );
1935
+ return {
1936
+ headers,
1937
+ ...apiKeyFormat && { apiKeyFormat },
1938
+ ...platformHeaders && { platformHeaders }
1939
+ };
1940
+ })()
1773
1941
  }
1774
1942
  };
1775
1943
  let result = await verify(config, verificationRequest);
@@ -5802,19 +5970,25 @@ var PLATFORM_AGENT_SIGNATURES = [
5802
5970
  vendor: "claude",
5803
5971
  displayName: "Anthropic Claude",
5804
5972
  uaPatterns: [/claude/i, /anthropic/i],
5805
- agentCardPatterns: [/anthropic\.com/i, /claude\.ai/i]
5973
+ agentCardPatterns: [/anthropic\.com/i, /claude\.ai/i],
5974
+ apiKeyFormatPatterns: [/^sk-ant/i],
5975
+ headerPatterns: [/^anthropic-version/i, /^anthropic-beta/i, /^x-anthropic-/i]
5806
5976
  },
5807
5977
  {
5808
5978
  vendor: "chatgpt",
5809
5979
  displayName: "OpenAI ChatGPT",
5810
5980
  uaPatterns: [/chatgpt/i, /openai/i, /gpt-?\d/i],
5811
- agentCardPatterns: [/openai\.com/i, /chatgpt\.com/i]
5981
+ agentCardPatterns: [/openai\.com/i, /chatgpt\.com/i],
5982
+ apiKeyFormatPatterns: [/^sk-proj/i, /^sk-svcacct/i],
5983
+ headerPatterns: [/^openai-organization/i, /^openai-project/i, /^openai-version/i]
5812
5984
  },
5813
5985
  {
5814
5986
  vendor: "gemini",
5815
5987
  displayName: "Google Gemini",
5816
5988
  uaPatterns: [/gemini/i, /google-gemini/i, /bard/i],
5817
- agentCardPatterns: [/gemini\.google\.com/i, /ai\.google\.dev/i]
5989
+ agentCardPatterns: [/gemini\.google\.com/i, /ai\.google\.dev/i],
5990
+ apiKeyFormatPatterns: [/^aiza/i],
5991
+ headerPatterns: [/^x-goog-user-project/i, /^x-goog-api-client/i]
5818
5992
  },
5819
5993
  {
5820
5994
  vendor: "cursor",
@@ -5827,15 +6001,31 @@ var PLATFORM_AGENT_SIGNATURES = [
5827
6001
  displayName: "Block Goose",
5828
6002
  uaPatterns: [/goose/i, /block-goose/i],
5829
6003
  agentCardPatterns: [/block\.xyz\/goose/i, /goose\.tools/i]
6004
+ },
6005
+ {
6006
+ vendor: "perplexity",
6007
+ displayName: "Perplexity",
6008
+ uaPatterns: [/perplexity/i],
6009
+ agentCardPatterns: [/perplexity\.ai/i],
6010
+ apiKeyFormatPatterns: [/^pplx-/i]
5830
6011
  }
5831
6012
  ];
5832
- function detectPlatformFingerprint(input) {
6013
+ function matchPlatformSignature(signatures, input) {
5833
6014
  const ua = input.userAgent ?? "";
5834
6015
  const cardUrl = input.agentCardUrl ?? "";
5835
- for (const sig of PLATFORM_AGENT_SIGNATURES) {
6016
+ const apiKeyFormat = input.apiKeyFormat ?? "";
6017
+ const headerLines = [];
6018
+ if (input.platformHeaders) {
6019
+ for (const [name, value] of Object.entries(input.platformHeaders)) {
6020
+ headerLines.push(name, `${name}: ${value}`);
6021
+ }
6022
+ }
6023
+ for (const sig of signatures) {
5836
6024
  const uaMatch = sig.uaPatterns?.some((p) => p.test(ua));
5837
6025
  const cardMatch = sig.agentCardPatterns?.some((p) => p.test(cardUrl));
5838
- if (uaMatch || cardMatch) {
6026
+ const keyMatch = apiKeyFormat.length > 0 && sig.apiKeyFormatPatterns?.some((p) => p.test(apiKeyFormat));
6027
+ const headerMatch = headerLines.length > 0 && sig.headerPatterns?.some((p) => headerLines.some((line) => p.test(line)));
6028
+ if (uaMatch || cardMatch || keyMatch || headerMatch) {
5839
6029
  const uaBase = ua.split(/[\s/]/)[0]?.toLowerCase() ?? "";
5840
6030
  const cardHost = (() => {
5841
6031
  try {
@@ -5844,16 +6034,19 @@ function detectPlatformFingerprint(input) {
5844
6034
  return "";
5845
6035
  }
5846
6036
  })();
5847
- const fingerprintKey = `${sig.vendor}:${uaBase || cardHost || "unknown"}`;
6037
+ const keyBasis = uaBase || cardHost || apiKeyFormat || "unknown";
5848
6038
  return {
5849
6039
  vendor: sig.vendor,
5850
- fingerprintKey,
6040
+ fingerprintKey: `${sig.vendor}:${keyBasis}`,
5851
6041
  displayName: sig.displayName
5852
6042
  };
5853
6043
  }
5854
6044
  }
5855
6045
  return void 0;
5856
6046
  }
6047
+ function detectPlatformFingerprint(input) {
6048
+ return matchPlatformSignature(PLATFORM_AGENT_SIGNATURES, input);
6049
+ }
5857
6050
  export {
5858
6051
  ACCESS_LEVEL_DESCRIPTIONS,
5859
6052
  ACCESS_LEVEL_HIERARCHY,
@@ -5865,6 +6058,9 @@ export {
5865
6058
  DEFAULT_EDGE_CONFIG,
5866
6059
  DEFAULT_TRUST_THRESHOLDS,
5867
6060
  KYDRequiredError,
6061
+ MAX_HEADERS,
6062
+ MAX_HEADER_VALUE_BYTES,
6063
+ MAX_TOTAL_BYTES,
5868
6064
  PLATFORM_AGENT_SIGNATURES,
5869
6065
  RegistrationDeniedError,
5870
6066
  RegistrationExpiredError,
@@ -5882,8 +6078,10 @@ export {
5882
6078
  detectPlatformFingerprint,
5883
6079
  determineAccessLevel,
5884
6080
  express_exports as express,
6081
+ extractApiKeyFormat,
5885
6082
  extractCredentials,
5886
6083
  extractMcpCredentials,
6084
+ extractPlatformHeaders,
5887
6085
  fetchEdgeConfig,
5888
6086
  fetchRoutes,
5889
6087
  getAccessLevelForScore,
@@ -5896,12 +6094,14 @@ export {
5896
6094
  hasMinimumAccess,
5897
6095
  isEdgeConfig,
5898
6096
  matchEdgePathRule,
6097
+ matchPlatformSignature,
5899
6098
  nextjs_exports as nextjs,
5900
6099
  pollStepUpStatus,
5901
6100
  prefetchWellKnown,
5902
6101
  quickVerify,
5903
6102
  recordDecision2 as recordDecision,
5904
6103
  reportUnregisteredAttempt,
6104
+ sanitizeHeaders,
5905
6105
  sdk_exports as sdk,
5906
6106
  setMcpMeta,
5907
6107
  transport_exports as transport,