@astrasyncai/verification-gateway 3.12.0 → 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 +85 -8
- package/dist/adapters/express.js.map +1 -1
- package/dist/adapters/express.mjs +85 -8
- 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 +90 -8
- package/dist/adapters/mcp.js.map +1 -1
- package/dist/adapters/mcp.mjs +90 -8
- 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 +86 -8
- package/dist/adapters/nextjs.js.map +1 -1
- package/dist/adapters/nextjs.mjs +86 -8
- 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 +71 -8
- package/dist/adapters/sdk.js.map +1 -1
- package/dist/adapters/sdk.mjs +71 -8
- 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 +71 -8
- package/dist/bin/astrasync-codex-hook.js +71 -8
- package/dist/bin/astrasync-guard.js +71 -8
- package/dist/bin/astrasync.js +71 -8
- package/dist/browser/background.js +71 -8
- package/dist/browser/background.js.map +1 -1
- package/dist/browser/background.mjs +71 -8
- 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 +71 -8
- package/dist/codex/index.js.map +1 -1
- package/dist/codex/index.mjs +71 -8
- 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 +71 -8
- package/dist/cursor/extension.js.map +1 -1
- package/dist/cursor/extension.mjs +71 -8
- 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-B39o89gf.d.mts → express-BZajRs4i.d.mts} +1 -1
- package/dist/{express-BuxKNO_q.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 +71 -8
- package/dist/gateway/gateway.js.map +1 -1
- package/dist/gateway/gateway.mjs +71 -8
- 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-DME3w3lf.d.mts → index-B0cyMZDL.d.mts} +1 -1
- package/dist/{index-CqydB4ks.d.mts → index-BRYteOqO.d.mts} +1 -1
- package/dist/{index-BG62SXso.d.ts → index-BZQdVqNw.d.ts} +1 -1
- package/dist/{index-CLHdqs2M.d.ts → index-adgKhujR.d.ts} +1 -1
- package/dist/index.d.mts +8 -8
- package/dist/index.d.ts +8 -8
- package/dist/index.js +119 -8
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +119 -8
- 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-Ddlw_J1J.d.ts → nextjs-D_iFf5k-.d.ts} +1 -1
- package/dist/{nextjs-D74W7wt-.d.mts → nextjs-DeUTnOBd.d.mts} +1 -1
- package/dist/{sdk-CT7gdkfR.d.ts → sdk-BM3mwEAq.d.ts} +1 -1
- package/dist/{sdk-Bn6bj7kt.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-BntuzEEn.d.mts → types-BcDf9Kk0.d.mts} +15 -0
- package/dist/{types-DHu7m9HI.d.ts → types-CHKCgDFC.d.ts} +1 -1
- package/dist/{types-Djw4GLtz.d.mts → types-DfnP7JiM.d.mts} +1 -1
- package/dist/{types-SDu4Llbe.d.ts → types-fTQD448H.d.ts} +15 -0
- package/dist/ui/index.d.mts +1 -1
- package/dist/ui/index.d.ts +1 -1
- package/dist/verify.d.mts +4 -2
- package/dist/verify.d.ts +4 -2
- package/dist/verify.js +76 -8
- package/dist/verify.js.map +1 -1
- package/dist/verify.mjs +75 -8
- package/dist/verify.mjs.map +1 -1
- package/package.json +1 -1
package/dist/adapters/nextjs.mjs
CHANGED
|
@@ -65,7 +65,7 @@ function getTrustLevel(score) {
|
|
|
65
65
|
}
|
|
66
66
|
|
|
67
67
|
// src/version.ts
|
|
68
|
-
var SDK_VERSION = "
|
|
68
|
+
var SDK_VERSION = "4.0.0";
|
|
69
69
|
|
|
70
70
|
// src/well-known.ts
|
|
71
71
|
var CACHE_TTL_MS = 60 * 60 * 1e3;
|
|
@@ -91,7 +91,7 @@ var DEFAULT_CONFIG = {
|
|
|
91
91
|
};
|
|
92
92
|
var initCheckPerformed = false;
|
|
93
93
|
var deprecationWarningShown = false;
|
|
94
|
-
async function performInitCheck(apiBaseUrl, debug, strictInit) {
|
|
94
|
+
async function performInitCheck(apiBaseUrl, debug, strictInit, apiKey) {
|
|
95
95
|
initCheckPerformed = true;
|
|
96
96
|
try {
|
|
97
97
|
const probeUrl = `${apiBaseUrl}/agents/verify-access`;
|
|
@@ -108,6 +108,28 @@ async function performInitCheck(apiBaseUrl, debug, strictInit) {
|
|
|
108
108
|
`[VerificationGateway] init check passed for ${apiBaseUrl} (content-type: ${contentType})`
|
|
109
109
|
);
|
|
110
110
|
}
|
|
111
|
+
if (apiKey) {
|
|
112
|
+
const selfCheck = await fetch(`${apiBaseUrl}/agents/verify-access/self-check`, {
|
|
113
|
+
headers: { Authorization: `Bearer ${apiKey}` }
|
|
114
|
+
});
|
|
115
|
+
if (selfCheck.status === 401) {
|
|
116
|
+
const body = await selfCheck.json().catch(() => ({}));
|
|
117
|
+
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}` : "") + `.`;
|
|
118
|
+
if (strictInit) {
|
|
119
|
+
throw new Error(`${message} (strictInit=true)`);
|
|
120
|
+
}
|
|
121
|
+
console.error(message);
|
|
122
|
+
} else if (selfCheck.ok) {
|
|
123
|
+
const body = await selfCheck.json().catch(() => ({}));
|
|
124
|
+
if (typeof body.daysToExpiry === "number" && body.daysToExpiry <= 7) {
|
|
125
|
+
console.warn(
|
|
126
|
+
`[VerificationGateway] the configured AstraSync API key expires in ${body.daysToExpiry} day(s) \u2014 rotate it at Settings \u2192 Developer Tools before integrations start failing.`
|
|
127
|
+
);
|
|
128
|
+
} else if (debug) {
|
|
129
|
+
console.log("[VerificationGateway] API key self-check passed");
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
}
|
|
111
133
|
} catch (err) {
|
|
112
134
|
if (strictInit) {
|
|
113
135
|
throw err;
|
|
@@ -185,8 +207,17 @@ function cacheResult(request, result, configuredTtl, counterpartyId) {
|
|
|
185
207
|
function createGuidanceResponse(_config, reason, options = {}) {
|
|
186
208
|
const source = options.source ?? "no_credentials";
|
|
187
209
|
const isApiError = source === "api_error";
|
|
210
|
+
const isMisconfig = source === "merchant_misconfig";
|
|
188
211
|
const urls = options.urls;
|
|
189
|
-
const guidance =
|
|
212
|
+
const guidance = isMisconfig ? {
|
|
213
|
+
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.",
|
|
214
|
+
registrationUrl: urls?.registrationUrl ?? "",
|
|
215
|
+
documentationUrl: options.remediation?.docsUrl ?? urls?.documentationUrl ?? "",
|
|
216
|
+
steps: [
|
|
217
|
+
"Report the failure to the site operator \u2014 their AstraSync API key needs rotating",
|
|
218
|
+
"Do not retry: the failure is deterministic until the operator updates their key"
|
|
219
|
+
]
|
|
220
|
+
} : isApiError ? {
|
|
190
221
|
message: "Verification is temporarily unavailable. Retry with exponential backoff; if the issue persists, contact support with the correlationId.",
|
|
191
222
|
registrationUrl: urls?.registrationUrl ?? "",
|
|
192
223
|
documentationUrl: urls?.documentationUrl ?? "",
|
|
@@ -224,13 +255,22 @@ function createGuidanceResponse(_config, reason, options = {}) {
|
|
|
224
255
|
// partners (and their custom onDenied handlers) can branch on
|
|
225
256
|
// dimension. Without this, the synthesised stub was indistinguishable
|
|
226
257
|
// from a real policy deny.
|
|
227
|
-
failures:
|
|
258
|
+
failures: isMisconfig ? [
|
|
259
|
+
{
|
|
260
|
+
dimension: "verify_access.merchant_misconfigured",
|
|
261
|
+
message: reason ?? "The integration API key was rejected by AstraSync",
|
|
262
|
+
guidance: guidance.message
|
|
263
|
+
}
|
|
264
|
+
] : isApiError ? [
|
|
228
265
|
{
|
|
229
266
|
dimension: "verify_access.api_error",
|
|
230
267
|
message: reason ?? "Verification temporarily unavailable",
|
|
231
268
|
guidance: guidance.message
|
|
232
269
|
}
|
|
233
270
|
] : void 0,
|
|
271
|
+
// 4.0.0: typed marker so adapters render the misconfig envelope (503 +
|
|
272
|
+
// MERCHANT_VERIFICATION_MISCONFIGURED) without string-matching.
|
|
273
|
+
...isMisconfig && { misconfigured: true },
|
|
234
274
|
correlationId: options.correlationId,
|
|
235
275
|
attemptId: options.attemptId,
|
|
236
276
|
verifiedAt: /* @__PURE__ */ new Date()
|
|
@@ -285,7 +325,8 @@ async function callVerifyAccessAPI(config, request) {
|
|
|
285
325
|
const response = await fetch(`${config.apiBaseUrl}/agents/verify-access`, {
|
|
286
326
|
method: "POST",
|
|
287
327
|
headers,
|
|
288
|
-
body: JSON.stringify(body)
|
|
328
|
+
body: JSON.stringify(body),
|
|
329
|
+
signal: AbortSignal.timeout(config.verifyTimeoutMs ?? 1e4)
|
|
289
330
|
});
|
|
290
331
|
const data = await response.json();
|
|
291
332
|
if (response.status === 410) {
|
|
@@ -309,6 +350,17 @@ async function callVerifyAccessAPI(config, request) {
|
|
|
309
350
|
};
|
|
310
351
|
}
|
|
311
352
|
if (!response.ok) {
|
|
353
|
+
if (response.status === 401) {
|
|
354
|
+
return {
|
|
355
|
+
success: false,
|
|
356
|
+
error: data.message || data.error || "Integration API key rejected",
|
|
357
|
+
misconfig: true,
|
|
358
|
+
misconfigCode: typeof data?.code === "string" ? data.code : void 0,
|
|
359
|
+
remediation: data?.remediation && typeof data.remediation === "object" ? data.remediation : void 0,
|
|
360
|
+
correlationId: typeof data?.correlationId === "string" ? data.correlationId : void 0,
|
|
361
|
+
attemptId: typeof data?.attemptId === "string" ? data.attemptId : void 0
|
|
362
|
+
};
|
|
363
|
+
}
|
|
312
364
|
return {
|
|
313
365
|
success: false,
|
|
314
366
|
error: data.message || data.error || `API returned ${response.status}`,
|
|
@@ -330,9 +382,19 @@ async function verify(config, request, options) {
|
|
|
330
382
|
const urls = mergedConfig.apiBaseUrl ? getCachedWellKnownUrls(mergedConfig.apiBaseUrl) : void 0;
|
|
331
383
|
if (!initCheckPerformed && !mergedConfig.disableInitChecks && mergedConfig.apiBaseUrl) {
|
|
332
384
|
if (mergedConfig.strictInit) {
|
|
333
|
-
await performInitCheck(
|
|
385
|
+
await performInitCheck(
|
|
386
|
+
mergedConfig.apiBaseUrl,
|
|
387
|
+
mergedConfig.debug,
|
|
388
|
+
true,
|
|
389
|
+
mergedConfig.apiKey
|
|
390
|
+
);
|
|
334
391
|
} else {
|
|
335
|
-
void performInitCheck(
|
|
392
|
+
void performInitCheck(
|
|
393
|
+
mergedConfig.apiBaseUrl,
|
|
394
|
+
mergedConfig.debug,
|
|
395
|
+
false,
|
|
396
|
+
mergedConfig.apiKey
|
|
397
|
+
);
|
|
336
398
|
}
|
|
337
399
|
}
|
|
338
400
|
if (!deprecationWarningShown && (config.minTrustScore !== void 0 || config.minTrustScoreForFull !== void 0)) {
|
|
@@ -371,9 +433,10 @@ async function verify(config, request, options) {
|
|
|
371
433
|
const serverDenialReasons = Array.isArray(rawServerDenialReasons) && rawServerDenialReasons.length > 0 ? rawServerDenialReasons : void 0;
|
|
372
434
|
if (!apiResponse.success) {
|
|
373
435
|
return createGuidanceResponse(mergedConfig, apiResponse.error, {
|
|
374
|
-
source: "api_error",
|
|
436
|
+
source: apiResponse.misconfig ? "merchant_misconfig" : "api_error",
|
|
375
437
|
correlationId: apiResponse.correlationId,
|
|
376
438
|
attemptId: apiResponse.attemptId,
|
|
439
|
+
remediation: apiResponse.remediation,
|
|
377
440
|
urls
|
|
378
441
|
});
|
|
379
442
|
}
|
|
@@ -1232,6 +1295,21 @@ function createMiddleware(options) {
|
|
|
1232
1295
|
const approvalRequired = result.identityVerified && result.policyAllowed && requiresHumanApproval(result);
|
|
1233
1296
|
if (approvalRequired) annotateApprovalRequired(result);
|
|
1234
1297
|
if (!result.identityVerified || !result.policyAllowed || approvalRequired) {
|
|
1298
|
+
if (result.misconfigured && pathname.startsWith("/api/")) {
|
|
1299
|
+
return NextResponse.json(
|
|
1300
|
+
{
|
|
1301
|
+
success: false,
|
|
1302
|
+
error: {
|
|
1303
|
+
code: "MERCHANT_VERIFICATION_MISCONFIGURED",
|
|
1304
|
+
message: result.denialReasons?.[0] || "This site's AstraSync integration is misconfigured",
|
|
1305
|
+
guidance: result.guidance,
|
|
1306
|
+
failures: result.failures,
|
|
1307
|
+
correlationId: result.correlationId
|
|
1308
|
+
}
|
|
1309
|
+
},
|
|
1310
|
+
{ status: 503 }
|
|
1311
|
+
);
|
|
1312
|
+
}
|
|
1235
1313
|
if (pathname.startsWith("/api/")) {
|
|
1236
1314
|
return NextResponse.json(
|
|
1237
1315
|
{
|