@astrasyncai/verification-gateway 5.12.0 → 5.14.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 (75) hide show
  1. package/dist/adapters/express.js +63 -19
  2. package/dist/adapters/express.js.map +1 -1
  3. package/dist/adapters/express.mjs +63 -19
  4. package/dist/adapters/express.mjs.map +1 -1
  5. package/dist/adapters/mcp.js +26 -9
  6. package/dist/adapters/mcp.js.map +1 -1
  7. package/dist/adapters/mcp.mjs +26 -9
  8. package/dist/adapters/mcp.mjs.map +1 -1
  9. package/dist/adapters/nextjs.js +63 -19
  10. package/dist/adapters/nextjs.js.map +1 -1
  11. package/dist/adapters/nextjs.mjs +63 -19
  12. package/dist/adapters/nextjs.mjs.map +1 -1
  13. package/dist/adapters/sdk.js +26 -9
  14. package/dist/adapters/sdk.js.map +1 -1
  15. package/dist/adapters/sdk.mjs +26 -9
  16. package/dist/adapters/sdk.mjs.map +1 -1
  17. package/dist/agent/index.js +1 -1
  18. package/dist/agent/index.js.map +1 -1
  19. package/dist/agent/index.mjs +1 -1
  20. package/dist/agent/index.mjs.map +1 -1
  21. package/dist/bin/astrasync-claude-hook.js +53 -18
  22. package/dist/bin/astrasync-codex-hook.js +53 -18
  23. package/dist/bin/astrasync-guard.js +53 -18
  24. package/dist/bin/astrasync.js +54 -19
  25. package/dist/browser/background.js +53 -18
  26. package/dist/browser/background.js.map +1 -1
  27. package/dist/browser/background.mjs +53 -18
  28. package/dist/browser/background.mjs.map +1 -1
  29. package/dist/cli/index.js +1 -1
  30. package/dist/cli/index.js.map +1 -1
  31. package/dist/cli/index.mjs +1 -1
  32. package/dist/cli/index.mjs.map +1 -1
  33. package/dist/codex/index.js +53 -18
  34. package/dist/codex/index.js.map +1 -1
  35. package/dist/codex/index.mjs +53 -18
  36. package/dist/codex/index.mjs.map +1 -1
  37. package/dist/cursor/extension.js +53 -18
  38. package/dist/cursor/extension.js.map +1 -1
  39. package/dist/cursor/extension.mjs +53 -18
  40. package/dist/cursor/extension.mjs.map +1 -1
  41. package/dist/edge-config.js +1 -1
  42. package/dist/edge-config.js.map +1 -1
  43. package/dist/edge-config.mjs +1 -1
  44. package/dist/edge-config.mjs.map +1 -1
  45. package/dist/edge-core/index.d.mts +32 -4
  46. package/dist/edge-core/index.d.ts +32 -4
  47. package/dist/edge-core/index.js +53 -18
  48. package/dist/edge-core/index.js.map +1 -1
  49. package/dist/edge-core/index.mjs +53 -18
  50. package/dist/edge-core/index.mjs.map +1 -1
  51. package/dist/gateway/gateway.js +53 -18
  52. package/dist/gateway/gateway.js.map +1 -1
  53. package/dist/gateway/gateway.mjs +53 -18
  54. package/dist/gateway/gateway.mjs.map +1 -1
  55. package/dist/index.d.mts +2 -12
  56. package/dist/index.d.ts +2 -12
  57. package/dist/index.js +63 -19
  58. package/dist/index.js.map +1 -1
  59. package/dist/index.mjs +63 -19
  60. package/dist/index.mjs.map +1 -1
  61. package/dist/registration/index.js +1 -1
  62. package/dist/registration/index.js.map +1 -1
  63. package/dist/registration/index.mjs +1 -1
  64. package/dist/registration/index.mjs.map +1 -1
  65. package/dist/transport/index.js +1 -1
  66. package/dist/transport/index.js.map +1 -1
  67. package/dist/transport/index.mjs +1 -1
  68. package/dist/transport/index.mjs.map +1 -1
  69. package/dist/verify.d.mts +0 -10
  70. package/dist/verify.d.ts +0 -10
  71. package/dist/verify.js +36 -10
  72. package/dist/verify.js.map +1 -1
  73. package/dist/verify.mjs +36 -10
  74. package/dist/verify.mjs.map +1 -1
  75. package/package.json +3 -2
@@ -4036,7 +4036,7 @@ function getTrustLevel(score) {
4036
4036
  }
4037
4037
 
4038
4038
  // src/version.ts
4039
- var SDK_VERSION = "5.12.0";
4039
+ var SDK_VERSION = "5.14.0";
4040
4040
 
4041
4041
  // src/http.ts
4042
4042
  var SDK_USER_AGENT = `astrasync-sdk/${SDK_VERSION}`;
@@ -4083,7 +4083,7 @@ var DEFAULT_CONFIG = {
4083
4083
  };
4084
4084
  var initCheckPerformed = false;
4085
4085
  var deprecationWarningShown = false;
4086
- async function performInitCheck(apiBaseUrl, debug, strictInit, apiKey) {
4086
+ async function performInitCheck(apiBaseUrl, debug, strictInit, apiKey, counterparty) {
4087
4087
  initCheckPerformed = true;
4088
4088
  try {
4089
4089
  const probeUrl = `${apiBaseUrl}/agents/verify-access`;
@@ -4101,7 +4101,8 @@ async function performInitCheck(apiBaseUrl, debug, strictInit, apiKey) {
4101
4101
  );
4102
4102
  }
4103
4103
  if (apiKey) {
4104
- const selfCheck = await sdkFetch(`${apiBaseUrl}/agents/verify-access/self-check`, {
4104
+ const q = counterparty?.id ? `?counterpartyId=${encodeURIComponent(counterparty.id)}` : counterparty?.url ? `?counterpartyUrl=${encodeURIComponent(counterparty.url)}` : "";
4105
+ const selfCheck = await sdkFetch(`${apiBaseUrl}/agents/verify-access/self-check${q}`, {
4105
4106
  headers: { Authorization: `Bearer ${apiKey}` }
4106
4107
  });
4107
4108
  if (selfCheck.status === 401) {
@@ -4113,6 +4114,13 @@ async function performInitCheck(apiBaseUrl, debug, strictInit, apiKey) {
4113
4114
  console.error(message);
4114
4115
  } else if (selfCheck.ok) {
4115
4116
  const body = await selfCheck.json().catch(() => ({}));
4117
+ if (body.counterparty && body.counterparty.canVerify === false) {
4118
+ const message = `[VerificationGateway] the configured AstraSync API key cannot verify for this endpoint (${body.counterparty.message ?? "endpoint not found or owned by another account"}). Every inbound agent will be turned away until the key or counterparty is corrected.`;
4119
+ if (strictInit) {
4120
+ throw new Error(`${message} (strictInit=true)`);
4121
+ }
4122
+ console.error(message);
4123
+ }
4116
4124
  if (typeof body.daysToExpiry === "number" && body.daysToExpiry <= 7) {
4117
4125
  console.warn(
4118
4126
  `[VerificationGateway] the configured AstraSync API key expires in ${body.daysToExpiry} day(s) \u2014 rotate it at Settings \u2192 Developer Tools before integrations start failing.`
@@ -4217,11 +4225,11 @@ function createGuidanceResponse(_config, reason, options = {}) {
4217
4225
  const isMisconfig = source === "merchant_misconfig";
4218
4226
  const urls = options.urls;
4219
4227
  const guidance = isMisconfig ? {
4220
- message: "This site's AstraSync integration is misconfigured (its API key was revoked, expired, or rotated). Your identity and the AstraSync platform are fine \u2014 contact the site operator. Retrying will not help.",
4228
+ message: "This site's AstraSync integration is misconfigured (its API key was revoked, expired, rotated, or belongs to another account). Your identity and the AstraSync platform are fine \u2014 contact the site operator. Retrying will not help.",
4221
4229
  registrationUrl: urls?.registrationUrl ?? "",
4222
4230
  documentationUrl: options.remediation?.docsUrl ?? urls?.documentationUrl ?? "",
4223
4231
  steps: [
4224
- "Report the failure to the site operator \u2014 their AstraSync API key needs rotating",
4232
+ "Report the failure to the site operator \u2014 their AstraSync API key needs replacing",
4225
4233
  "Do not retry: the failure is deterministic until the operator updates their key"
4226
4234
  ]
4227
4235
  } : isApiError ? {
@@ -4433,12 +4441,13 @@ async function callVerifyAccessAPI(config, request) {
4433
4441
  };
4434
4442
  }
4435
4443
  if (!response.ok) {
4436
- if (response.status === 401) {
4444
+ const keyMismatch = response.status === 403 && data?.error === "COUNTERPARTY_KEY_MISMATCH";
4445
+ if (response.status === 401 || keyMismatch) {
4437
4446
  return {
4438
4447
  success: false,
4439
4448
  error: data.message || data.error || "Integration API key rejected",
4440
4449
  misconfig: true,
4441
- misconfigCode: typeof data?.code === "string" ? data.code : void 0,
4450
+ misconfigCode: keyMismatch ? "counterparty_key_mismatch" : typeof data?.code === "string" ? data.code : void 0,
4442
4451
  remediation: data?.remediation && typeof data.remediation === "object" ? data.remediation : void 0,
4443
4452
  correlationId: typeof data?.correlationId === "string" ? data.correlationId : void 0,
4444
4453
  attemptId: typeof data?.attemptId === "string" ? data.attemptId : void 0
@@ -4471,14 +4480,22 @@ async function verify(config, request, options) {
4471
4480
  mergedConfig.apiBaseUrl,
4472
4481
  mergedConfig.debug,
4473
4482
  true,
4474
- mergedConfig.apiKey
4483
+ mergedConfig.apiKey,
4484
+ {
4485
+ id: mergedConfig.counterpartyId,
4486
+ url: mergedConfig.counterpartyUrl ?? request.counterpartyUrl
4487
+ }
4475
4488
  );
4476
4489
  } else {
4477
4490
  void performInitCheck(
4478
4491
  mergedConfig.apiBaseUrl,
4479
4492
  mergedConfig.debug,
4480
4493
  false,
4481
- mergedConfig.apiKey
4494
+ mergedConfig.apiKey,
4495
+ {
4496
+ id: mergedConfig.counterpartyId,
4497
+ url: mergedConfig.counterpartyUrl ?? request.counterpartyUrl
4498
+ }
4482
4499
  );
4483
4500
  }
4484
4501
  }
@@ -4689,6 +4706,11 @@ async function withBudget(promise, ms) {
4689
4706
  if (timer) clearTimeout(timer);
4690
4707
  }
4691
4708
  }
4709
+ var CONTAINER_ID = (() => {
4710
+ const c = globalThis.crypto;
4711
+ if (c?.randomUUID) return c.randomUUID();
4712
+ return `c-${Date.now().toString(36)}-${Math.random().toString(36).slice(2, 12)}`;
4713
+ })();
4692
4714
  var destKeyOf = (d) => `${d.apiBaseUrl}\0${d.apiKey ?? ""}\0${d.counterparty}\0${d.adapter ?? ""}`;
4693
4715
  var BeaconBuffer = class {
4694
4716
  constructor(options = {}) {
@@ -4696,6 +4718,7 @@ var BeaconBuffer = class {
4696
4718
  this.droppedSinceLast = 0;
4697
4719
  this.droppedTotal = 0;
4698
4720
  this.deliveredTotal = 0;
4721
+ this.enqueuedTotal = 0;
4699
4722
  this.backoffUntil = 0;
4700
4723
  this.collapse = /* @__PURE__ */ new Map();
4701
4724
  /** Keys the backend answered 401 for — later batches go unauthenticated. */
@@ -4708,13 +4731,16 @@ var BeaconBuffer = class {
4708
4731
  collapseMaxKeys: options.collapseMaxKeys ?? 1e3,
4709
4732
  requestTimeoutMs: options.requestTimeoutMs ?? 1e4,
4710
4733
  retryBackoffMs: options.retryBackoffMs ?? 1e3,
4734
+ holdRepeats: options.holdRepeats ?? false,
4735
+ containerId: options.containerId ?? CONTAINER_ID,
4711
4736
  now: options.now ?? Date.now
4712
4737
  };
4713
4738
  }
4714
4739
  /**
4715
4740
  * Queue one beacon. With a `collapseKey`, a repeat inside the window is
4716
- * merged into a held aggregate (sent when the window closes) instead of
4717
- * becoming its own item.
4741
+ * merged into this key's item while that item is still queued (not yet in
4742
+ * flight). Once it has left, the repeat becomes a new item, sendable on
4743
+ * this flush — nothing waits for a later invocation (round 27.6).
4718
4744
  */
4719
4745
  enqueue(dest, item, collapseKey) {
4720
4746
  const now = this.opts.now();
@@ -4727,12 +4753,15 @@ var BeaconBuffer = class {
4727
4753
  return;
4728
4754
  }
4729
4755
  }
4730
- const held = this.push(
4731
- dest,
4732
- { ...item, repeatCount: 1 },
4733
- entry.firstSeenAt + this.opts.collapseWindowMs
4734
- );
4735
- entry.held = held;
4756
+ if (this.opts.holdRepeats) {
4757
+ entry.held = this.push(
4758
+ dest,
4759
+ { ...item, repeatCount: 1 },
4760
+ entry.firstSeenAt + this.opts.collapseWindowMs
4761
+ );
4762
+ return;
4763
+ }
4764
+ entry.first = this.push(dest, { ...item, repeatCount: 1 }, now);
4736
4765
  return;
4737
4766
  }
4738
4767
  this.collapse.delete(collapseKey);
@@ -4768,6 +4797,7 @@ var BeaconBuffer = class {
4768
4797
  droppedSinceLast: this.droppedSinceLast,
4769
4798
  droppedTotal: this.droppedTotal,
4770
4799
  deliveredTotal: this.deliveredTotal,
4800
+ enqueuedTotal: this.enqueuedTotal,
4771
4801
  flushing: this.inFlight !== void 0
4772
4802
  };
4773
4803
  }
@@ -4782,6 +4812,7 @@ var BeaconBuffer = class {
4782
4812
  inFlight: false
4783
4813
  };
4784
4814
  this.queue.push(entry);
4815
+ this.enqueuedTotal += 1;
4785
4816
  return entry;
4786
4817
  }
4787
4818
  dropOldest() {
@@ -4827,7 +4858,11 @@ var BeaconBuffer = class {
4827
4858
  droppedSinceLast: reportedDropped,
4828
4859
  queueDepth: this.queue.length,
4829
4860
  adapter: dest.adapter ?? "edge-core",
4830
- version: SDK_VERSION
4861
+ version: SDK_VERSION,
4862
+ containerId: this.opts.containerId,
4863
+ enqueuedTotal: this.enqueuedTotal,
4864
+ deliveredTotal: this.deliveredTotal,
4865
+ droppedTotal: this.droppedTotal
4831
4866
  };
4832
4867
  const controller = typeof AbortController !== "undefined" ? new AbortController() : void 0;
4833
4868
  const response = await withBudget(