@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.
- package/dist/adapter-interface/interface.d.mts +2 -2
- package/dist/adapter-interface/interface.d.ts +2 -2
- package/dist/adapters/express.d.mts +2 -2
- package/dist/adapters/express.d.ts +2 -2
- package/dist/adapters/express.js +106 -10
- package/dist/adapters/express.js.map +1 -1
- package/dist/adapters/express.mjs +106 -10
- package/dist/adapters/express.mjs.map +1 -1
- package/dist/adapters/mcp.d.mts +1 -1
- package/dist/adapters/mcp.d.ts +1 -1
- package/dist/adapters/mcp.js +111 -10
- package/dist/adapters/mcp.js.map +1 -1
- package/dist/adapters/mcp.mjs +111 -10
- package/dist/adapters/mcp.mjs.map +1 -1
- package/dist/adapters/nextjs.d.mts +2 -2
- package/dist/adapters/nextjs.d.ts +2 -2
- package/dist/adapters/nextjs.js +107 -10
- package/dist/adapters/nextjs.js.map +1 -1
- package/dist/adapters/nextjs.mjs +107 -10
- package/dist/adapters/nextjs.mjs.map +1 -1
- package/dist/adapters/sdk.d.mts +2 -2
- package/dist/adapters/sdk.d.ts +2 -2
- package/dist/adapters/sdk.js +92 -10
- package/dist/adapters/sdk.js.map +1 -1
- package/dist/adapters/sdk.mjs +92 -10
- package/dist/adapters/sdk.mjs.map +1 -1
- package/dist/agent/index.d.mts +2 -2
- package/dist/agent/index.d.ts +2 -2
- package/dist/bin/astrasync-claude-hook.js +92 -10
- package/dist/bin/astrasync-codex-hook.js +92 -10
- package/dist/bin/astrasync-guard.js +92 -10
- package/dist/bin/astrasync.js +93 -10
- package/dist/browser/background.js +92 -10
- package/dist/browser/background.js.map +1 -1
- package/dist/browser/background.mjs +92 -10
- package/dist/browser/background.mjs.map +1 -1
- package/dist/browser/browser-adapter.d.mts +2 -2
- package/dist/browser/browser-adapter.d.ts +2 -2
- package/dist/claude-code/claude-code-adapter.d.mts +2 -2
- package/dist/claude-code/claude-code-adapter.d.ts +2 -2
- package/dist/cli/index.d.mts +2 -2
- package/dist/cli/index.d.ts +2 -2
- package/dist/codex/index.d.mts +2 -2
- package/dist/codex/index.d.ts +2 -2
- package/dist/codex/index.js +92 -10
- package/dist/codex/index.js.map +1 -1
- package/dist/codex/index.mjs +92 -10
- package/dist/codex/index.mjs.map +1 -1
- package/dist/cursor/cursor-adapter.d.mts +2 -2
- package/dist/cursor/cursor-adapter.d.ts +2 -2
- package/dist/cursor/extension.d.mts +2 -2
- package/dist/cursor/extension.d.ts +2 -2
- package/dist/cursor/extension.js +92 -10
- package/dist/cursor/extension.js.map +1 -1
- package/dist/cursor/extension.mjs +92 -10
- package/dist/cursor/extension.mjs.map +1 -1
- package/dist/edge-config.d.mts +1 -1
- package/dist/edge-config.d.ts +1 -1
- package/dist/{express-DCXa1oqj.d.mts → express-BZajRs4i.d.mts} +1 -1
- package/dist/{express-ClNtDhhc.d.ts → express-CjCUB1k7.d.ts} +1 -1
- package/dist/gateway/gateway.d.mts +2 -2
- package/dist/gateway/gateway.d.ts +2 -2
- package/dist/gateway/gateway.js +92 -10
- package/dist/gateway/gateway.js.map +1 -1
- package/dist/gateway/gateway.mjs +92 -10
- package/dist/gateway/gateway.mjs.map +1 -1
- package/dist/git-trigger/git-hooks.d.mts +2 -2
- package/dist/git-trigger/git-hooks.d.ts +2 -2
- package/dist/{index-BrNKDmiR.d.mts → index-B0cyMZDL.d.mts} +1 -1
- package/dist/{index-Dr_XiN65.d.mts → index-BRYteOqO.d.mts} +1 -1
- package/dist/{index-CfHurO1P.d.ts → index-BZQdVqNw.d.ts} +1 -1
- package/dist/{index-D2ztkumS.d.ts → index-adgKhujR.d.ts} +1 -1
- package/dist/index.d.mts +9 -9
- package/dist/index.d.ts +9 -9
- package/dist/index.js +160 -10
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +159 -10
- package/dist/index.mjs.map +1 -1
- package/dist/local-evaluator/evaluator.d.mts +2 -2
- package/dist/local-evaluator/evaluator.d.ts +2 -2
- package/dist/{nextjs-CEBVBsdi.d.ts → nextjs-D_iFf5k-.d.ts} +1 -1
- package/dist/{nextjs-DcQIk6Zj.d.mts → nextjs-DeUTnOBd.d.mts} +1 -1
- package/dist/{sdk-H0JCLW2y.d.ts → sdk-BM3mwEAq.d.ts} +1 -1
- package/dist/{sdk-CZkbSOeO.d.mts → sdk-_il1Q41f.d.mts} +1 -1
- package/dist/transport/index.d.mts +2 -2
- package/dist/transport/index.d.ts +2 -2
- package/dist/{types-sy3tq8lp.d.mts → types-BcDf9Kk0.d.mts} +118 -1
- package/dist/{types-DhFPiZ3t.d.ts → types-CHKCgDFC.d.ts} +1 -1
- package/dist/{types-cQVCMeNV.d.mts → types-DfnP7JiM.d.mts} +1 -1
- package/dist/{types-9tns4wyl.d.ts → types-fTQD448H.d.ts} +118 -1
- package/dist/ui/index.d.mts +1 -1
- package/dist/ui/index.d.ts +1 -1
- package/dist/verify.d.mts +15 -2
- package/dist/verify.d.ts +15 -2
- package/dist/verify.js +117 -10
- package/dist/verify.js.map +1 -1
- package/dist/verify.mjs +115 -10
- package/dist/verify.mjs.map +1 -1
- 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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
4
|
+
import '../types-fTQD448H.js';
|
|
5
5
|
import '../metadata-capture.js';
|
|
6
6
|
|
|
7
7
|
/**
|
package/dist/cli/index.d.mts
CHANGED
|
@@ -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-
|
|
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-
|
|
3
|
+
import '../types-BcDf9Kk0.mjs';
|
|
4
4
|
import '../metadata-capture.mjs';
|
|
5
5
|
import '../gateway/gateway.mjs';
|
|
6
6
|
|
package/dist/cli/index.d.ts
CHANGED
|
@@ -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-
|
|
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-
|
|
3
|
+
import '../types-fTQD448H.js';
|
|
4
4
|
import '../metadata-capture.js';
|
|
5
5
|
import '../gateway/gateway.js';
|
|
6
6
|
|
package/dist/codex/index.d.mts
CHANGED
|
@@ -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-
|
|
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-
|
|
4
|
+
import '../types-BcDf9Kk0.mjs';
|
|
5
5
|
import '../metadata-capture.mjs';
|
|
6
6
|
|
|
7
7
|
/**
|
package/dist/codex/index.d.ts
CHANGED
|
@@ -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-
|
|
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-
|
|
4
|
+
import '../types-fTQD448H.js';
|
|
5
5
|
import '../metadata-capture.js';
|
|
6
6
|
|
|
7
7
|
/**
|
package/dist/codex/index.js
CHANGED
|
@@ -3985,7 +3985,7 @@ function getTrustLevel(score) {
|
|
|
3985
3985
|
}
|
|
3986
3986
|
|
|
3987
3987
|
// src/version.ts
|
|
3988
|
-
var SDK_VERSION = "
|
|
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 =
|
|
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:
|
|
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(
|
|
4305
|
+
await performInitCheck(
|
|
4306
|
+
mergedConfig.apiBaseUrl,
|
|
4307
|
+
mergedConfig.debug,
|
|
4308
|
+
true,
|
|
4309
|
+
mergedConfig.apiKey
|
|
4310
|
+
);
|
|
4247
4311
|
} else {
|
|
4248
|
-
void performInitCheck(
|
|
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
|
-
|
|
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,
|