@astrasyncai/verification-gateway 3.8.0 → 3.9.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 (108) 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 +2 -1
  6. package/dist/adapters/express.js.map +1 -1
  7. package/dist/adapters/express.mjs +2 -1
  8. package/dist/adapters/express.mjs.map +1 -1
  9. package/dist/adapters/http-pdlss.d.mts +81 -0
  10. package/dist/adapters/http-pdlss.d.ts +81 -0
  11. package/dist/adapters/http-pdlss.js +117 -0
  12. package/dist/adapters/http-pdlss.js.map +1 -0
  13. package/dist/adapters/http-pdlss.mjs +87 -0
  14. package/dist/adapters/http-pdlss.mjs.map +1 -0
  15. package/dist/adapters/mcp.d.mts +1 -1
  16. package/dist/adapters/mcp.d.ts +1 -1
  17. package/dist/adapters/mcp.js +2 -1
  18. package/dist/adapters/mcp.js.map +1 -1
  19. package/dist/adapters/mcp.mjs +2 -1
  20. package/dist/adapters/mcp.mjs.map +1 -1
  21. package/dist/adapters/nextjs.d.mts +2 -2
  22. package/dist/adapters/nextjs.d.ts +2 -2
  23. package/dist/adapters/nextjs.js +2 -1
  24. package/dist/adapters/nextjs.js.map +1 -1
  25. package/dist/adapters/nextjs.mjs +2 -1
  26. package/dist/adapters/nextjs.mjs.map +1 -1
  27. package/dist/adapters/sdk.d.mts +2 -2
  28. package/dist/adapters/sdk.d.ts +2 -2
  29. package/dist/adapters/sdk.js +2 -1
  30. package/dist/adapters/sdk.js.map +1 -1
  31. package/dist/adapters/sdk.mjs +2 -1
  32. package/dist/adapters/sdk.mjs.map +1 -1
  33. package/dist/agent/index.d.mts +2 -2
  34. package/dist/agent/index.d.ts +2 -2
  35. package/dist/bin/astrasync-claude-hook.js +14 -1
  36. package/dist/bin/astrasync-guard.js +14 -1
  37. package/dist/bin/astrasync.js +31 -1
  38. package/dist/browser/background.js +14 -1
  39. package/dist/browser/background.js.map +1 -1
  40. package/dist/browser/background.mjs +14 -1
  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/cursor/cursor-adapter.d.mts +2 -2
  49. package/dist/cursor/cursor-adapter.d.ts +2 -2
  50. package/dist/cursor/extension.d.mts +2 -2
  51. package/dist/cursor/extension.d.ts +2 -2
  52. package/dist/cursor/extension.js +14 -1
  53. package/dist/cursor/extension.js.map +1 -1
  54. package/dist/cursor/extension.mjs +14 -1
  55. package/dist/cursor/extension.mjs.map +1 -1
  56. package/dist/edge-config.d.mts +130 -0
  57. package/dist/edge-config.d.ts +130 -0
  58. package/dist/edge-config.js +162 -0
  59. package/dist/edge-config.js.map +1 -0
  60. package/dist/edge-config.mjs +131 -0
  61. package/dist/edge-config.mjs.map +1 -0
  62. package/dist/{express-Di_hnZZS.d.mts → express-DXUyvv7t.d.mts} +1 -1
  63. package/dist/{express-C8nJGi5P.d.ts → express-sGXhDdd0.d.ts} +1 -1
  64. package/dist/gateway/gateway.d.mts +2 -2
  65. package/dist/gateway/gateway.d.ts +2 -2
  66. package/dist/gateway/gateway.js +14 -1
  67. package/dist/gateway/gateway.js.map +1 -1
  68. package/dist/gateway/gateway.mjs +14 -1
  69. package/dist/gateway/gateway.mjs.map +1 -1
  70. package/dist/git-trigger/git-hooks.d.mts +2 -2
  71. package/dist/git-trigger/git-hooks.d.ts +2 -2
  72. package/dist/{index-CuCkjT7B.d.ts → index-C61VL_OW.d.ts} +1 -1
  73. package/dist/{index-CBQr4FGs.d.ts → index-CMg-vjEK.d.ts} +1 -1
  74. package/dist/{index-CXcvO9Au.d.mts → index-Dalih3EB.d.mts} +1 -1
  75. package/dist/{index-DALAqct7.d.mts → index-DmmdehNu.d.mts} +1 -1
  76. package/dist/index.d.mts +26 -82
  77. package/dist/index.d.ts +26 -82
  78. package/dist/index.js +226 -10
  79. package/dist/index.js.map +1 -1
  80. package/dist/index.mjs +215 -10
  81. package/dist/index.mjs.map +1 -1
  82. package/dist/local-evaluator/evaluator.d.mts +2 -2
  83. package/dist/local-evaluator/evaluator.d.ts +2 -2
  84. package/dist/{nextjs-IyXWW2KL.d.ts → nextjs-DwUW-Nm1.d.ts} +1 -1
  85. package/dist/{nextjs-BMAe8ode.d.mts → nextjs-F_2pbPIA.d.mts} +1 -1
  86. package/dist/platform-signatures.d.mts +47 -0
  87. package/dist/platform-signatures.d.ts +47 -0
  88. package/dist/platform-signatures.js +89 -0
  89. package/dist/platform-signatures.js.map +1 -0
  90. package/dist/platform-signatures.mjs +63 -0
  91. package/dist/platform-signatures.mjs.map +1 -0
  92. package/dist/{sdk-ThdA_NtL.d.ts → sdk-CfHANs4A.d.ts} +1 -1
  93. package/dist/{sdk-Cn4KcZ5G.d.mts → sdk-Clob2-0A.d.mts} +1 -1
  94. package/dist/transport/index.d.mts +2 -2
  95. package/dist/transport/index.d.ts +2 -2
  96. package/dist/{types-DedAJbNI.d.mts → types-ACMsV07B.d.mts} +76 -1
  97. package/dist/{types-DedAJbNI.d.ts → types-ACMsV07B.d.ts} +76 -1
  98. package/dist/{types-CSFci5zD.d.mts → types-BtqUvK8v.d.mts} +1 -1
  99. package/dist/{types-D1kyMiml.d.ts → types-DmSDgPpG.d.ts} +1 -1
  100. package/dist/ui/index.d.mts +1 -1
  101. package/dist/ui/index.d.ts +1 -1
  102. package/dist/verify.d.mts +144 -0
  103. package/dist/verify.d.ts +144 -0
  104. package/dist/verify.js +593 -0
  105. package/dist/verify.js.map +1 -0
  106. package/dist/verify.mjs +557 -0
  107. package/dist/verify.mjs.map +1 -0
  108. package/package.json +21 -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.7.1";
129
+ var SDK_VERSION = "3.9.0";
130
130
 
131
131
  // src/well-known.ts
132
132
  var CACHE_TTL_MS = 60 * 60 * 1e3;
@@ -413,6 +413,7 @@ async function callVerifyAccessAPI(config, request) {
413
413
  if (requestData.runtimeChallengeOptions)
414
414
  body.runtimeChallengeOptions = requestData.runtimeChallengeOptions;
415
415
  if (requestData.invocationProtocol) body.invocationProtocol = requestData.invocationProtocol;
416
+ if (requestData.commerceArtifacts) body.commerceArtifacts = requestData.commerceArtifacts;
416
417
  body.sdkVersion = SDK_VERSION;
417
418
  if (requestData.callerMetadata || requestData.clientIp || requestData.userAgent) {
418
419
  const meta = {
@@ -661,6 +662,21 @@ async function fetchRoutes(config, counterpartyId) {
661
662
  return null;
662
663
  }
663
664
  }
665
+ async function reportUnregisteredAttempt(config, data) {
666
+ const apiBaseUrl = config.apiBaseUrl || DEFAULT_CONFIG.apiBaseUrl;
667
+ const { counterpartyUrl, ...rest } = data;
668
+ const body = {
669
+ ...rest,
670
+ ...counterpartyUrl && { counterpartyUrl },
671
+ ...config.counterpartyId && { counterpartyId: config.counterpartyId }
672
+ };
673
+ await fetch(`${apiBaseUrl}/verification-activity/unregistered-attempt`, {
674
+ method: "POST",
675
+ headers: { "Content-Type": "application/json" },
676
+ body: JSON.stringify(body)
677
+ }).catch(() => {
678
+ });
679
+ }
664
680
  async function reportCounterpartyPreCheckFailure(config, data) {
665
681
  const apiBaseUrl = config.apiBaseUrl || DEFAULT_CONFIG.apiBaseUrl;
666
682
  await fetch(`${apiBaseUrl}/verification-activity/counterparty-pre-check-failure`, {
@@ -4429,7 +4445,7 @@ async function exportJwkFromKeyLike(keyLike) {
4429
4445
 
4430
4446
  // src/transport/registry/mastercard.ts
4431
4447
  function createMastercardRegistry(options = {}) {
4432
- const cache2 = /* @__PURE__ */ new Map();
4448
+ const cache3 = /* @__PURE__ */ new Map();
4433
4449
  const ttlSec = options.cacheTtlSec ?? 3600;
4434
4450
  const fetchFn = options.fetch ?? globalThis.fetch;
4435
4451
  let warned = false;
@@ -4446,7 +4462,7 @@ function createMastercardRegistry(options = {}) {
4446
4462
  }
4447
4463
  return null;
4448
4464
  }
4449
- const cached = cache2.get(kid);
4465
+ const cached = cache3.get(kid);
4450
4466
  if (cached && cached.expiresAt > Date.now()) return cached.jwk;
4451
4467
  try {
4452
4468
  const res = await fetchFn(options.registryUrl);
@@ -4455,7 +4471,7 @@ function createMastercardRegistry(options = {}) {
4455
4471
  const keys = body.keys ?? [];
4456
4472
  for (const k of keys) {
4457
4473
  if (k.kid === kid) {
4458
- cache2.set(kid, { jwk: k, expiresAt: Date.now() + ttlSec * 1e3 });
4474
+ cache3.set(kid, { jwk: k, expiresAt: Date.now() + ttlSec * 1e3 });
4459
4475
  return k;
4460
4476
  }
4461
4477
  }
@@ -4470,7 +4486,7 @@ function createMastercardRegistry(options = {}) {
4470
4486
  // src/transport/registry/web-bot-auth.ts
4471
4487
  var DIRECTORY_PATH = "/.well-known/http-message-signatures-directory";
4472
4488
  function createWebBotAuthRegistry(options = {}) {
4473
- const cache2 = /* @__PURE__ */ new Map();
4489
+ const cache3 = /* @__PURE__ */ new Map();
4474
4490
  const ttlSec = options.cacheTtlSec ?? 3600;
4475
4491
  const fetchFn = options.fetch ?? globalThis.fetch;
4476
4492
  return {
@@ -4479,7 +4495,7 @@ function createWebBotAuthRegistry(options = {}) {
4479
4495
  if (!kid) return null;
4480
4496
  const directoryUrl = resolveDirectoryUrl(options.directoryUrl, context?.origin);
4481
4497
  if (!directoryUrl) return null;
4482
- const cached = cache2.get(directoryUrl);
4498
+ const cached = cache3.get(directoryUrl);
4483
4499
  const now = Date.now();
4484
4500
  if (cached && cached.expiresAt > now) {
4485
4501
  return findKeyByKid(cached.keys, kid);
@@ -4489,7 +4505,7 @@ function createWebBotAuthRegistry(options = {}) {
4489
4505
  if (!res.ok) return null;
4490
4506
  const body = await res.json();
4491
4507
  const keys = body.keys ?? [];
4492
- cache2.set(directoryUrl, { keys, expiresAt: now + ttlSec * 1e3 });
4508
+ cache3.set(directoryUrl, { keys, expiresAt: now + ttlSec * 1e3 });
4493
4509
  return findKeyByKid(keys, kid);
4494
4510
  } catch {
4495
4511
  return null;
@@ -5658,8 +5674,186 @@ async function recordDecision2(config, params) {
5658
5674
  };
5659
5675
  }
5660
5676
 
5661
- // src/index.ts
5662
- var VERSION = "3.4.0";
5677
+ // src/edge-config.ts
5678
+ var DEFAULT_EDGE_CONFIG = Object.freeze({
5679
+ version: 1,
5680
+ mode: "observe",
5681
+ depth: "classify",
5682
+ pathRules: [],
5683
+ sampling: Object.freeze({ anonymousBeaconRate: 0.1 }),
5684
+ failurePosture: "open"
5685
+ });
5686
+ var EDGE_MODES = ["observe", "enforce"];
5687
+ var EDGE_DEPTHS = ["classify", "authenticate", "authorize"];
5688
+ function isEdgeConfig(value) {
5689
+ if (typeof value !== "object" || value === null) return false;
5690
+ const v = value;
5691
+ if (v.version !== 1) return false;
5692
+ if (!EDGE_MODES.includes(v.mode)) return false;
5693
+ if (!EDGE_DEPTHS.includes(v.depth)) return false;
5694
+ if (!Array.isArray(v.pathRules)) return false;
5695
+ for (const rule of v.pathRules) {
5696
+ if (typeof rule !== "object" || rule === null) return false;
5697
+ const r = rule;
5698
+ if (typeof r.pattern !== "string" || r.pattern.length === 0) return false;
5699
+ if (r.mode !== void 0 && !EDGE_MODES.includes(r.mode)) return false;
5700
+ if (r.depth !== void 0 && !EDGE_DEPTHS.includes(r.depth)) return false;
5701
+ }
5702
+ const sampling = v.sampling;
5703
+ if (typeof sampling !== "object" || sampling === null || typeof sampling.anonymousBeaconRate !== "number" || sampling.anonymousBeaconRate < 0 || sampling.anonymousBeaconRate > 1) {
5704
+ return false;
5705
+ }
5706
+ return v.failurePosture === "open";
5707
+ }
5708
+ async function fetchEdgeConfig(config, counterpartyId, opts) {
5709
+ if (!counterpartyId) return null;
5710
+ const headers = { Accept: "application/json" };
5711
+ if (config.apiKey) {
5712
+ headers["Authorization"] = `Bearer ${config.apiKey}`;
5713
+ headers["X-API-Key"] = config.apiKey;
5714
+ }
5715
+ if (opts?.etag) headers["If-None-Match"] = opts.etag;
5716
+ try {
5717
+ const response = await fetch(
5718
+ `${config.apiBaseUrl}/endpoints/${encodeURIComponent(counterpartyId)}/edge-config`,
5719
+ { method: "GET", headers, signal: AbortSignal.timeout(opts?.timeoutMs ?? 5e3) }
5720
+ );
5721
+ if (response.status === 304) return { notModified: true };
5722
+ if (!response.ok) return null;
5723
+ const body = await response.json();
5724
+ const edgeConfig = body.data?.edgeConfig;
5725
+ if (!isEdgeConfig(edgeConfig)) return null;
5726
+ return { edgeConfig, etag: response.headers.get("etag") ?? void 0 };
5727
+ } catch {
5728
+ return null;
5729
+ }
5730
+ }
5731
+ var DEFAULT_TTL_MS = 60 * 1e3;
5732
+ var DEFAULT_MAX_STALE_MS = 24 * 60 * 60 * 1e3;
5733
+ var cache2 = /* @__PURE__ */ new Map();
5734
+ var inflight2 = /* @__PURE__ */ new Map();
5735
+ function cacheKey(apiBaseUrl, counterpartyId) {
5736
+ return `${apiBaseUrl}|${counterpartyId}`;
5737
+ }
5738
+ function degradeToObserve(config) {
5739
+ if (config.mode !== "enforce" && !config.pathRules.some((r) => r.mode === "enforce")) {
5740
+ return config;
5741
+ }
5742
+ return {
5743
+ ...config,
5744
+ mode: "observe",
5745
+ pathRules: config.pathRules.map((r) => r.mode === "enforce" ? { ...r, mode: "observe" } : r)
5746
+ };
5747
+ }
5748
+ async function revalidate(config, counterpartyId) {
5749
+ const key = cacheKey(config.apiBaseUrl, counterpartyId);
5750
+ const existing = inflight2.get(key);
5751
+ if (existing) return existing;
5752
+ const promise = fetchEdgeConfig(config, counterpartyId, { etag: cache2.get(key)?.etag }).then((result) => {
5753
+ if (result === null) return;
5754
+ const now = Date.now();
5755
+ if ("notModified" in result) {
5756
+ const entry = cache2.get(key);
5757
+ if (entry) entry.lastSuccessAt = now;
5758
+ return;
5759
+ }
5760
+ cache2.set(key, { config: result.edgeConfig, etag: result.etag, lastSuccessAt: now });
5761
+ }).finally(() => {
5762
+ inflight2.delete(key);
5763
+ });
5764
+ inflight2.set(key, promise);
5765
+ return promise;
5766
+ }
5767
+ async function getEdgeConfig(config, counterpartyId, opts) {
5768
+ const ttlMs = opts?.ttlMs ?? DEFAULT_TTL_MS;
5769
+ const maxStaleMs = opts?.maxStaleMs ?? DEFAULT_MAX_STALE_MS;
5770
+ const key = cacheKey(config.apiBaseUrl, counterpartyId);
5771
+ const entry = cache2.get(key);
5772
+ if (entry) {
5773
+ const age = Date.now() - entry.lastSuccessAt;
5774
+ if (age > ttlMs) {
5775
+ revalidate(config, counterpartyId).catch(() => {
5776
+ });
5777
+ }
5778
+ return age > maxStaleMs ? degradeToObserve(entry.config) : entry.config;
5779
+ }
5780
+ await revalidate(config, counterpartyId).catch(() => {
5781
+ });
5782
+ return cache2.get(key)?.config ?? DEFAULT_EDGE_CONFIG;
5783
+ }
5784
+ function matchEdgePathRule(rules, path) {
5785
+ for (const rule of rules) {
5786
+ if (globToRegExp(rule.pattern).test(path)) return rule;
5787
+ }
5788
+ return void 0;
5789
+ }
5790
+ function globToRegExp(pattern) {
5791
+ const escaped = pattern.replace(/[.+?^${}()|[\]\\]/g, "\\$&").replace(/\*/g, ".*");
5792
+ return new RegExp(`^${escaped}$`, "i");
5793
+ }
5794
+ function _resetEdgeConfigCache() {
5795
+ cache2.clear();
5796
+ inflight2.clear();
5797
+ }
5798
+
5799
+ // src/platform-signatures.ts
5800
+ var PLATFORM_AGENT_SIGNATURES = [
5801
+ {
5802
+ vendor: "claude",
5803
+ displayName: "Anthropic Claude",
5804
+ uaPatterns: [/claude/i, /anthropic/i],
5805
+ agentCardPatterns: [/anthropic\.com/i, /claude\.ai/i]
5806
+ },
5807
+ {
5808
+ vendor: "chatgpt",
5809
+ displayName: "OpenAI ChatGPT",
5810
+ uaPatterns: [/chatgpt/i, /openai/i, /gpt-?\d/i],
5811
+ agentCardPatterns: [/openai\.com/i, /chatgpt\.com/i]
5812
+ },
5813
+ {
5814
+ vendor: "gemini",
5815
+ displayName: "Google Gemini",
5816
+ uaPatterns: [/gemini/i, /google-gemini/i, /bard/i],
5817
+ agentCardPatterns: [/gemini\.google\.com/i, /ai\.google\.dev/i]
5818
+ },
5819
+ {
5820
+ vendor: "cursor",
5821
+ displayName: "Cursor",
5822
+ uaPatterns: [/cursor/i],
5823
+ agentCardPatterns: [/cursor\.sh/i, /cursor\.com/i]
5824
+ },
5825
+ {
5826
+ vendor: "goose",
5827
+ displayName: "Block Goose",
5828
+ uaPatterns: [/goose/i, /block-goose/i],
5829
+ agentCardPatterns: [/block\.xyz\/goose/i, /goose\.tools/i]
5830
+ }
5831
+ ];
5832
+ function detectPlatformFingerprint(input) {
5833
+ const ua = input.userAgent ?? "";
5834
+ const cardUrl = input.agentCardUrl ?? "";
5835
+ for (const sig of PLATFORM_AGENT_SIGNATURES) {
5836
+ const uaMatch = sig.uaPatterns?.some((p) => p.test(ua));
5837
+ const cardMatch = sig.agentCardPatterns?.some((p) => p.test(cardUrl));
5838
+ if (uaMatch || cardMatch) {
5839
+ const uaBase = ua.split(/[\s/]/)[0]?.toLowerCase() ?? "";
5840
+ const cardHost = (() => {
5841
+ try {
5842
+ return cardUrl ? new URL(cardUrl).host : "";
5843
+ } catch {
5844
+ return "";
5845
+ }
5846
+ })();
5847
+ const fingerprintKey = `${sig.vendor}:${uaBase || cardHost || "unknown"}`;
5848
+ return {
5849
+ vendor: sig.vendor,
5850
+ fingerprintKey,
5851
+ displayName: sig.displayName
5852
+ };
5853
+ }
5854
+ }
5855
+ return void 0;
5856
+ }
5663
5857
  export {
5664
5858
  ACCESS_LEVEL_DESCRIPTIONS,
5665
5859
  ACCESS_LEVEL_HIERARCHY,
@@ -5668,35 +5862,46 @@ export {
5668
5862
  AstraSyncError,
5669
5863
  AuthenticationError,
5670
5864
  ChallengeHandler,
5865
+ DEFAULT_EDGE_CONFIG,
5671
5866
  DEFAULT_TRUST_THRESHOLDS,
5672
5867
  KYDRequiredError,
5868
+ PLATFORM_AGENT_SIGNATURES,
5673
5869
  RegistrationDeniedError,
5674
5870
  RegistrationExpiredError,
5675
5871
  RegistrationTimeoutError,
5676
5872
  TRUST_LEVEL_RANGES,
5677
- VERSION,
5873
+ SDK_VERSION as VERSION,
5874
+ _resetEdgeConfigCache,
5678
5875
  agent_exports as agent,
5679
5876
  authorizeSettlement,
5680
5877
  awaitStepUpApproval,
5681
5878
  buildGuidance,
5682
5879
  clearCache,
5683
5880
  createMcpMiddleware,
5881
+ degradeToObserve,
5882
+ detectPlatformFingerprint,
5684
5883
  determineAccessLevel,
5685
5884
  express_exports as express,
5686
5885
  extractCredentials,
5687
5886
  extractMcpCredentials,
5887
+ fetchEdgeConfig,
5888
+ fetchRoutes,
5688
5889
  getAccessLevelForScore,
5689
5890
  getCachedWellKnownUrls,
5690
5891
  getCapabilities,
5892
+ getEdgeConfig,
5691
5893
  getTrustLevel,
5692
5894
  getWellKnownUrls,
5693
5895
  hasCredentials,
5694
5896
  hasMinimumAccess,
5897
+ isEdgeConfig,
5898
+ matchEdgePathRule,
5695
5899
  nextjs_exports as nextjs,
5696
5900
  pollStepUpStatus,
5697
5901
  prefetchWellKnown,
5698
5902
  quickVerify,
5699
5903
  recordDecision2 as recordDecision,
5904
+ reportUnregisteredAttempt,
5700
5905
  sdk_exports as sdk,
5701
5906
  setMcpMeta,
5702
5907
  transport_exports as transport,