@astrasyncai/verification-gateway 3.11.1 → 4.0.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 (99) 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 +106 -10
  6. package/dist/adapters/express.js.map +1 -1
  7. package/dist/adapters/express.mjs +106 -10
  8. package/dist/adapters/express.mjs.map +1 -1
  9. package/dist/adapters/mcp.d.mts +1 -1
  10. package/dist/adapters/mcp.d.ts +1 -1
  11. package/dist/adapters/mcp.js +111 -10
  12. package/dist/adapters/mcp.js.map +1 -1
  13. package/dist/adapters/mcp.mjs +111 -10
  14. package/dist/adapters/mcp.mjs.map +1 -1
  15. package/dist/adapters/nextjs.d.mts +2 -2
  16. package/dist/adapters/nextjs.d.ts +2 -2
  17. package/dist/adapters/nextjs.js +107 -10
  18. package/dist/adapters/nextjs.js.map +1 -1
  19. package/dist/adapters/nextjs.mjs +107 -10
  20. package/dist/adapters/nextjs.mjs.map +1 -1
  21. package/dist/adapters/sdk.d.mts +2 -2
  22. package/dist/adapters/sdk.d.ts +2 -2
  23. package/dist/adapters/sdk.js +92 -10
  24. package/dist/adapters/sdk.js.map +1 -1
  25. package/dist/adapters/sdk.mjs +92 -10
  26. package/dist/adapters/sdk.mjs.map +1 -1
  27. package/dist/agent/index.d.mts +2 -2
  28. package/dist/agent/index.d.ts +2 -2
  29. package/dist/bin/astrasync-claude-hook.js +92 -10
  30. package/dist/bin/astrasync-codex-hook.js +92 -10
  31. package/dist/bin/astrasync-guard.js +92 -10
  32. package/dist/bin/astrasync.js +93 -10
  33. package/dist/browser/background.js +92 -10
  34. package/dist/browser/background.js.map +1 -1
  35. package/dist/browser/background.mjs +92 -10
  36. package/dist/browser/background.mjs.map +1 -1
  37. package/dist/browser/browser-adapter.d.mts +2 -2
  38. package/dist/browser/browser-adapter.d.ts +2 -2
  39. package/dist/claude-code/claude-code-adapter.d.mts +2 -2
  40. package/dist/claude-code/claude-code-adapter.d.ts +2 -2
  41. package/dist/cli/index.d.mts +2 -2
  42. package/dist/cli/index.d.ts +2 -2
  43. package/dist/codex/index.d.mts +2 -2
  44. package/dist/codex/index.d.ts +2 -2
  45. package/dist/codex/index.js +92 -10
  46. package/dist/codex/index.js.map +1 -1
  47. package/dist/codex/index.mjs +92 -10
  48. package/dist/codex/index.mjs.map +1 -1
  49. package/dist/cursor/cursor-adapter.d.mts +2 -2
  50. package/dist/cursor/cursor-adapter.d.ts +2 -2
  51. package/dist/cursor/extension.d.mts +2 -2
  52. package/dist/cursor/extension.d.ts +2 -2
  53. package/dist/cursor/extension.js +92 -10
  54. package/dist/cursor/extension.js.map +1 -1
  55. package/dist/cursor/extension.mjs +92 -10
  56. package/dist/cursor/extension.mjs.map +1 -1
  57. package/dist/edge-config.d.mts +1 -1
  58. package/dist/edge-config.d.ts +1 -1
  59. package/dist/{express-DCXa1oqj.d.mts → express-BZajRs4i.d.mts} +1 -1
  60. package/dist/{express-ClNtDhhc.d.ts → express-CjCUB1k7.d.ts} +1 -1
  61. package/dist/gateway/gateway.d.mts +2 -2
  62. package/dist/gateway/gateway.d.ts +2 -2
  63. package/dist/gateway/gateway.js +92 -10
  64. package/dist/gateway/gateway.js.map +1 -1
  65. package/dist/gateway/gateway.mjs +92 -10
  66. package/dist/gateway/gateway.mjs.map +1 -1
  67. package/dist/git-trigger/git-hooks.d.mts +2 -2
  68. package/dist/git-trigger/git-hooks.d.ts +2 -2
  69. package/dist/{index-BrNKDmiR.d.mts → index-B0cyMZDL.d.mts} +1 -1
  70. package/dist/{index-Dr_XiN65.d.mts → index-BRYteOqO.d.mts} +1 -1
  71. package/dist/{index-CfHurO1P.d.ts → index-BZQdVqNw.d.ts} +1 -1
  72. package/dist/{index-D2ztkumS.d.ts → index-adgKhujR.d.ts} +1 -1
  73. package/dist/index.d.mts +9 -9
  74. package/dist/index.d.ts +9 -9
  75. package/dist/index.js +160 -10
  76. package/dist/index.js.map +1 -1
  77. package/dist/index.mjs +159 -10
  78. package/dist/index.mjs.map +1 -1
  79. package/dist/local-evaluator/evaluator.d.mts +2 -2
  80. package/dist/local-evaluator/evaluator.d.ts +2 -2
  81. package/dist/{nextjs-CEBVBsdi.d.ts → nextjs-D_iFf5k-.d.ts} +1 -1
  82. package/dist/{nextjs-DcQIk6Zj.d.mts → nextjs-DeUTnOBd.d.mts} +1 -1
  83. package/dist/{sdk-H0JCLW2y.d.ts → sdk-BM3mwEAq.d.ts} +1 -1
  84. package/dist/{sdk-CZkbSOeO.d.mts → sdk-_il1Q41f.d.mts} +1 -1
  85. package/dist/transport/index.d.mts +2 -2
  86. package/dist/transport/index.d.ts +2 -2
  87. package/dist/{types-sy3tq8lp.d.mts → types-BcDf9Kk0.d.mts} +118 -1
  88. package/dist/{types-DhFPiZ3t.d.ts → types-CHKCgDFC.d.ts} +1 -1
  89. package/dist/{types-cQVCMeNV.d.mts → types-DfnP7JiM.d.mts} +1 -1
  90. package/dist/{types-9tns4wyl.d.ts → types-fTQD448H.d.ts} +118 -1
  91. package/dist/ui/index.d.mts +1 -1
  92. package/dist/ui/index.d.ts +1 -1
  93. package/dist/verify.d.mts +15 -2
  94. package/dist/verify.d.ts +15 -2
  95. package/dist/verify.js +117 -10
  96. package/dist/verify.js.map +1 -1
  97. package/dist/verify.mjs +115 -10
  98. package/dist/verify.mjs.map +1 -1
  99. package/package.json +1 -1
@@ -1,7 +1,7 @@
1
1
  import { PlatformAdapter, AdapterConfig } from '../adapter-interface/interface.mjs';
2
- import { P as PDLSSContext, V as VerificationDecision, A as AgentAction, I as InterceptResult } from '../types-cQVCMeNV.mjs';
2
+ import { P as PDLSSContext, V as VerificationDecision, A as AgentAction, I as InterceptResult } from '../types-DfnP7JiM.mjs';
3
3
  import '../gateway/gateway.mjs';
4
- import '../types-sy3tq8lp.mjs';
4
+ import '../types-BcDf9Kk0.mjs';
5
5
  import '../metadata-capture.mjs';
6
6
 
7
7
  /**
@@ -1,7 +1,7 @@
1
1
  import { PlatformAdapter, AdapterConfig } from '../adapter-interface/interface.js';
2
- import { P as PDLSSContext, V as VerificationDecision, A as AgentAction, I as InterceptResult } from '../types-DhFPiZ3t.js';
2
+ import { P as PDLSSContext, V as VerificationDecision, A as AgentAction, I as InterceptResult } from '../types-CHKCgDFC.js';
3
3
  import '../gateway/gateway.js';
4
- import '../types-9tns4wyl.js';
4
+ import '../types-fTQD448H.js';
5
5
  import '../metadata-capture.js';
6
6
 
7
7
  /**
@@ -1,7 +1,7 @@
1
1
  import { PlatformAdapter, AdapterConfig } from '../adapter-interface/interface.mjs';
2
- import { A as AgentAction, I as InterceptResult, P as PDLSSContext, V as VerificationDecision } from '../types-cQVCMeNV.mjs';
2
+ import { A as AgentAction, I as InterceptResult, P as PDLSSContext, V as VerificationDecision } from '../types-DfnP7JiM.mjs';
3
3
  import '../gateway/gateway.mjs';
4
- import '../types-sy3tq8lp.mjs';
4
+ import '../types-BcDf9Kk0.mjs';
5
5
  import '../metadata-capture.mjs';
6
6
 
7
7
  /**
@@ -1,7 +1,7 @@
1
1
  import { PlatformAdapter, AdapterConfig } from '../adapter-interface/interface.js';
2
- import { A as AgentAction, I as InterceptResult, P as PDLSSContext, V as VerificationDecision } from '../types-DhFPiZ3t.js';
2
+ import { A as AgentAction, I as InterceptResult, P as PDLSSContext, V as VerificationDecision } from '../types-CHKCgDFC.js';
3
3
  import '../gateway/gateway.js';
4
- import '../types-9tns4wyl.js';
4
+ import '../types-fTQD448H.js';
5
5
  import '../metadata-capture.js';
6
6
 
7
7
  /**
@@ -1,6 +1,6 @@
1
- import { b as LocalPurposeRule, d as LocalScope, c as LocalRiskThresholds, L as LocalPolicy, P as PDLSSContext, V as VerificationDecision, A as AgentAction, I as InterceptResult } from '../types-cQVCMeNV.mjs';
1
+ import { b as LocalPurposeRule, d as LocalScope, c as LocalRiskThresholds, L as LocalPolicy, P as PDLSSContext, V as VerificationDecision, A as AgentAction, I as InterceptResult } from '../types-DfnP7JiM.mjs';
2
2
  import { PlatformAdapter, AdapterConfig } from '../adapter-interface/interface.mjs';
3
- import '../types-sy3tq8lp.mjs';
3
+ import '../types-BcDf9Kk0.mjs';
4
4
  import '../metadata-capture.mjs';
5
5
  import '../gateway/gateway.mjs';
6
6
 
@@ -1,6 +1,6 @@
1
- import { b as LocalPurposeRule, d as LocalScope, c as LocalRiskThresholds, L as LocalPolicy, P as PDLSSContext, V as VerificationDecision, A as AgentAction, I as InterceptResult } from '../types-DhFPiZ3t.js';
1
+ import { b as LocalPurposeRule, d as LocalScope, c as LocalRiskThresholds, L as LocalPolicy, P as PDLSSContext, V as VerificationDecision, A as AgentAction, I as InterceptResult } from '../types-CHKCgDFC.js';
2
2
  import { PlatformAdapter, AdapterConfig } from '../adapter-interface/interface.js';
3
- import '../types-9tns4wyl.js';
3
+ import '../types-fTQD448H.js';
4
4
  import '../metadata-capture.js';
5
5
  import '../gateway/gateway.js';
6
6
 
@@ -1,7 +1,7 @@
1
1
  import { PlatformAdapter, AdapterConfig } from '../adapter-interface/interface.mjs';
2
- import { A as AgentAction, I as InterceptResult, P as PDLSSContext, V as VerificationDecision } from '../types-cQVCMeNV.mjs';
2
+ import { A as AgentAction, I as InterceptResult, P as PDLSSContext, V as VerificationDecision } from '../types-DfnP7JiM.mjs';
3
3
  import { AstraSyncGateway } from '../gateway/gateway.mjs';
4
- import '../types-sy3tq8lp.mjs';
4
+ import '../types-BcDf9Kk0.mjs';
5
5
  import '../metadata-capture.mjs';
6
6
 
7
7
  /**
@@ -1,7 +1,7 @@
1
1
  import { PlatformAdapter, AdapterConfig } from '../adapter-interface/interface.js';
2
- import { A as AgentAction, I as InterceptResult, P as PDLSSContext, V as VerificationDecision } from '../types-DhFPiZ3t.js';
2
+ import { A as AgentAction, I as InterceptResult, P as PDLSSContext, V as VerificationDecision } from '../types-CHKCgDFC.js';
3
3
  import { AstraSyncGateway } from '../gateway/gateway.js';
4
- import '../types-9tns4wyl.js';
4
+ import '../types-fTQD448H.js';
5
5
  import '../metadata-capture.js';
6
6
 
7
7
  /**
@@ -3985,7 +3985,7 @@ function getTrustLevel(score) {
3985
3985
  }
3986
3986
 
3987
3987
  // src/version.ts
3988
- var SDK_VERSION = "3.11.1";
3988
+ var SDK_VERSION = "4.0.0";
3989
3989
 
3990
3990
  // src/well-known.ts
3991
3991
  var CACHE_TTL_MS = 60 * 60 * 1e3;
@@ -4011,7 +4011,7 @@ var DEFAULT_CONFIG = {
4011
4011
  };
4012
4012
  var initCheckPerformed = false;
4013
4013
  var deprecationWarningShown = false;
4014
- async function performInitCheck(apiBaseUrl, debug, strictInit) {
4014
+ async function performInitCheck(apiBaseUrl, debug, strictInit, apiKey) {
4015
4015
  initCheckPerformed = true;
4016
4016
  try {
4017
4017
  const probeUrl = `${apiBaseUrl}/agents/verify-access`;
@@ -4028,6 +4028,28 @@ async function performInitCheck(apiBaseUrl, debug, strictInit) {
4028
4028
  `[VerificationGateway] init check passed for ${apiBaseUrl} (content-type: ${contentType})`
4029
4029
  );
4030
4030
  }
4031
+ if (apiKey) {
4032
+ const selfCheck = await fetch(`${apiBaseUrl}/agents/verify-access/self-check`, {
4033
+ headers: { Authorization: `Bearer ${apiKey}` }
4034
+ });
4035
+ if (selfCheck.status === 401) {
4036
+ const body = await selfCheck.json().catch(() => ({}));
4037
+ const message = `[VerificationGateway] the configured AstraSync API key was REJECTED at startup (${body.code ?? "api_key_invalid"}: ${body.message ?? "invalid key"}). Every inbound agent will be turned away until the key is rotated` + (body.remediation?.manageUrl ? ` at ${body.remediation.manageUrl}` : "") + `.`;
4038
+ if (strictInit) {
4039
+ throw new Error(`${message} (strictInit=true)`);
4040
+ }
4041
+ console.error(message);
4042
+ } else if (selfCheck.ok) {
4043
+ const body = await selfCheck.json().catch(() => ({}));
4044
+ if (typeof body.daysToExpiry === "number" && body.daysToExpiry <= 7) {
4045
+ console.warn(
4046
+ `[VerificationGateway] the configured AstraSync API key expires in ${body.daysToExpiry} day(s) \u2014 rotate it at Settings \u2192 Developer Tools before integrations start failing.`
4047
+ );
4048
+ } else if (debug) {
4049
+ console.log("[VerificationGateway] API key self-check passed");
4050
+ }
4051
+ }
4052
+ }
4031
4053
  } catch (err) {
4032
4054
  if (strictInit) {
4033
4055
  throw err;
@@ -4105,8 +4127,17 @@ function cacheResult(request, result, configuredTtl, counterpartyId) {
4105
4127
  function createGuidanceResponse(_config, reason, options = {}) {
4106
4128
  const source = options.source ?? "no_credentials";
4107
4129
  const isApiError = source === "api_error";
4130
+ const isMisconfig = source === "merchant_misconfig";
4108
4131
  const urls = options.urls;
4109
- const guidance = isApiError ? {
4132
+ const guidance = isMisconfig ? {
4133
+ 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.",
4134
+ registrationUrl: urls?.registrationUrl ?? "",
4135
+ documentationUrl: options.remediation?.docsUrl ?? urls?.documentationUrl ?? "",
4136
+ steps: [
4137
+ "Report the failure to the site operator \u2014 their AstraSync API key needs rotating",
4138
+ "Do not retry: the failure is deterministic until the operator updates their key"
4139
+ ]
4140
+ } : isApiError ? {
4110
4141
  message: "Verification is temporarily unavailable. Retry with exponential backoff; if the issue persists, contact support with the correlationId.",
4111
4142
  registrationUrl: urls?.registrationUrl ?? "",
4112
4143
  documentationUrl: urls?.documentationUrl ?? "",
@@ -4144,14 +4175,24 @@ function createGuidanceResponse(_config, reason, options = {}) {
4144
4175
  // partners (and their custom onDenied handlers) can branch on
4145
4176
  // dimension. Without this, the synthesised stub was indistinguishable
4146
4177
  // from a real policy deny.
4147
- failures: isApiError ? [
4178
+ failures: isMisconfig ? [
4179
+ {
4180
+ dimension: "verify_access.merchant_misconfigured",
4181
+ message: reason ?? "The integration API key was rejected by AstraSync",
4182
+ guidance: guidance.message
4183
+ }
4184
+ ] : isApiError ? [
4148
4185
  {
4149
4186
  dimension: "verify_access.api_error",
4150
4187
  message: reason ?? "Verification temporarily unavailable",
4151
4188
  guidance: guidance.message
4152
4189
  }
4153
4190
  ] : void 0,
4191
+ // 4.0.0: typed marker so adapters render the misconfig envelope (503 +
4192
+ // MERCHANT_VERIFICATION_MISCONFIGURED) without string-matching.
4193
+ ...isMisconfig && { misconfigured: true },
4154
4194
  correlationId: options.correlationId,
4195
+ attemptId: options.attemptId,
4155
4196
  verifiedAt: /* @__PURE__ */ new Date()
4156
4197
  };
4157
4198
  }
@@ -4181,6 +4222,8 @@ async function callVerifyAccessAPI(config, request) {
4181
4222
  body.runtimeChallengeOptions = requestData.runtimeChallengeOptions;
4182
4223
  if (requestData.invocationProtocol) body.invocationProtocol = requestData.invocationProtocol;
4183
4224
  if (requestData.commerceArtifacts) body.commerceArtifacts = requestData.commerceArtifacts;
4225
+ if (requestData.attemptId) body.attemptId = requestData.attemptId;
4226
+ if (requestData.considerationSet) body.considerationSet = requestData.considerationSet;
4184
4227
  body.sdkVersion = SDK_VERSION;
4185
4228
  if (requestData.callerMetadata || requestData.clientIp || requestData.userAgent) {
4186
4229
  const meta = {
@@ -4202,12 +4245,16 @@ async function callVerifyAccessAPI(config, request) {
4202
4245
  const response = await fetch(`${config.apiBaseUrl}/agents/verify-access`, {
4203
4246
  method: "POST",
4204
4247
  headers,
4205
- body: JSON.stringify(body)
4248
+ body: JSON.stringify(body),
4249
+ signal: AbortSignal.timeout(config.verifyTimeoutMs ?? 1e4)
4206
4250
  });
4207
4251
  const data = await response.json();
4208
4252
  if (response.status === 410) {
4209
4253
  return {
4210
4254
  success: true,
4255
+ // 3.12.0 (Trust Record): keep the server-echoed attempt handle even on
4256
+ // the synthesised 410 deny shape (echoed on every branch).
4257
+ attemptId: typeof data?.attemptId === "string" ? data.attemptId : void 0,
4211
4258
  access: {
4212
4259
  allowed: false,
4213
4260
  accessLevel: "none",
@@ -4223,10 +4270,22 @@ async function callVerifyAccessAPI(config, request) {
4223
4270
  };
4224
4271
  }
4225
4272
  if (!response.ok) {
4273
+ if (response.status === 401) {
4274
+ return {
4275
+ success: false,
4276
+ error: data.message || data.error || "Integration API key rejected",
4277
+ misconfig: true,
4278
+ misconfigCode: typeof data?.code === "string" ? data.code : void 0,
4279
+ remediation: data?.remediation && typeof data.remediation === "object" ? data.remediation : void 0,
4280
+ correlationId: typeof data?.correlationId === "string" ? data.correlationId : void 0,
4281
+ attemptId: typeof data?.attemptId === "string" ? data.attemptId : void 0
4282
+ };
4283
+ }
4226
4284
  return {
4227
4285
  success: false,
4228
4286
  error: data.message || data.error || `API returned ${response.status}`,
4229
- correlationId: typeof data?.correlationId === "string" ? data.correlationId : void 0
4287
+ correlationId: typeof data?.correlationId === "string" ? data.correlationId : void 0,
4288
+ attemptId: typeof data?.attemptId === "string" ? data.attemptId : void 0
4230
4289
  };
4231
4290
  }
4232
4291
  return data;
@@ -4243,9 +4302,19 @@ async function verify(config, request, options) {
4243
4302
  const urls = mergedConfig.apiBaseUrl ? getCachedWellKnownUrls(mergedConfig.apiBaseUrl) : void 0;
4244
4303
  if (!initCheckPerformed && !mergedConfig.disableInitChecks && mergedConfig.apiBaseUrl) {
4245
4304
  if (mergedConfig.strictInit) {
4246
- await performInitCheck(mergedConfig.apiBaseUrl, mergedConfig.debug, true);
4305
+ await performInitCheck(
4306
+ mergedConfig.apiBaseUrl,
4307
+ mergedConfig.debug,
4308
+ true,
4309
+ mergedConfig.apiKey
4310
+ );
4247
4311
  } else {
4248
- void performInitCheck(mergedConfig.apiBaseUrl, mergedConfig.debug, false);
4312
+ void performInitCheck(
4313
+ mergedConfig.apiBaseUrl,
4314
+ mergedConfig.debug,
4315
+ false,
4316
+ mergedConfig.apiKey
4317
+ );
4249
4318
  }
4250
4319
  }
4251
4320
  if (!deprecationWarningShown && (config.minTrustScore !== void 0 || config.minTrustScoreForFull !== void 0)) {
@@ -4260,7 +4329,13 @@ async function verify(config, request, options) {
4260
4329
  if (mergedConfig.debug) {
4261
4330
  console.log("[VerificationGateway] Returning cached result");
4262
4331
  }
4263
- return cached;
4332
+ const hit = { ...cached };
4333
+ if (request.attemptId) {
4334
+ hit.attemptId = request.attemptId;
4335
+ } else {
4336
+ delete hit.attemptId;
4337
+ }
4338
+ return hit;
4264
4339
  }
4265
4340
  }
4266
4341
  const enrichedRequest = { ...request };
@@ -4278,8 +4353,10 @@ async function verify(config, request, options) {
4278
4353
  const serverDenialReasons = Array.isArray(rawServerDenialReasons) && rawServerDenialReasons.length > 0 ? rawServerDenialReasons : void 0;
4279
4354
  if (!apiResponse.success) {
4280
4355
  return createGuidanceResponse(mergedConfig, apiResponse.error, {
4281
- source: "api_error",
4356
+ source: apiResponse.misconfig ? "merchant_misconfig" : "api_error",
4282
4357
  correlationId: apiResponse.correlationId,
4358
+ attemptId: apiResponse.attemptId,
4359
+ remediation: apiResponse.remediation,
4283
4360
  urls
4284
4361
  });
4285
4362
  }
@@ -4315,6 +4392,9 @@ async function verify(config, request, options) {
4315
4392
  // Anonymous traffic has no session → correlationId is the per-attempt
4316
4393
  // linking key (the sessionId-equivalent for anonymous callers).
4317
4394
  correlationId: apiResponse.correlationId,
4395
+ // 3.12.0 (Trust Record): server echoes the attempt-chain handle on
4396
+ // every branch — denials included (the funnel outlives one deny).
4397
+ attemptId: apiResponse.attemptId,
4318
4398
  recommendation: apiResponse.recommendation,
4319
4399
  recommendationReasons: apiResponse.recommendationReasons,
4320
4400
  stepUpApproval: apiResponse.stepUpApproval,
@@ -4366,6 +4446,8 @@ async function verify(config, request, options) {
4366
4446
  // v2.3.10 (defect #34, round-4): anonymous responses surface correlationId
4367
4447
  // (no session row exists for unverified callers).
4368
4448
  correlationId: apiResponse.correlationId,
4449
+ // 3.12.0 (Trust Record): server-echoed attempt-chain handle.
4450
+ attemptId: apiResponse.attemptId,
4369
4451
  runtimeChallenge: apiResponse.runtimeChallenge,
4370
4452
  tokenGuidance: apiResponse.tokenGuidance,
4371
4453
  recommendation: apiResponse.recommendation,