@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/mcp.mjs
CHANGED
|
@@ -7,7 +7,7 @@ function getTrustLevel(score) {
|
|
|
7
7
|
}
|
|
8
8
|
|
|
9
9
|
// src/version.ts
|
|
10
|
-
var SDK_VERSION = "
|
|
10
|
+
var SDK_VERSION = "4.0.0";
|
|
11
11
|
|
|
12
12
|
// src/well-known.ts
|
|
13
13
|
var CACHE_TTL_MS = 60 * 60 * 1e3;
|
|
@@ -85,7 +85,7 @@ var DEFAULT_CONFIG = {
|
|
|
85
85
|
};
|
|
86
86
|
var initCheckPerformed = false;
|
|
87
87
|
var deprecationWarningShown = false;
|
|
88
|
-
async function performInitCheck(apiBaseUrl, debug, strictInit) {
|
|
88
|
+
async function performInitCheck(apiBaseUrl, debug, strictInit, apiKey) {
|
|
89
89
|
initCheckPerformed = true;
|
|
90
90
|
try {
|
|
91
91
|
const probeUrl = `${apiBaseUrl}/agents/verify-access`;
|
|
@@ -102,6 +102,28 @@ async function performInitCheck(apiBaseUrl, debug, strictInit) {
|
|
|
102
102
|
`[VerificationGateway] init check passed for ${apiBaseUrl} (content-type: ${contentType})`
|
|
103
103
|
);
|
|
104
104
|
}
|
|
105
|
+
if (apiKey) {
|
|
106
|
+
const selfCheck = await fetch(`${apiBaseUrl}/agents/verify-access/self-check`, {
|
|
107
|
+
headers: { Authorization: `Bearer ${apiKey}` }
|
|
108
|
+
});
|
|
109
|
+
if (selfCheck.status === 401) {
|
|
110
|
+
const body = await selfCheck.json().catch(() => ({}));
|
|
111
|
+
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}` : "") + `.`;
|
|
112
|
+
if (strictInit) {
|
|
113
|
+
throw new Error(`${message} (strictInit=true)`);
|
|
114
|
+
}
|
|
115
|
+
console.error(message);
|
|
116
|
+
} else if (selfCheck.ok) {
|
|
117
|
+
const body = await selfCheck.json().catch(() => ({}));
|
|
118
|
+
if (typeof body.daysToExpiry === "number" && body.daysToExpiry <= 7) {
|
|
119
|
+
console.warn(
|
|
120
|
+
`[VerificationGateway] the configured AstraSync API key expires in ${body.daysToExpiry} day(s) \u2014 rotate it at Settings \u2192 Developer Tools before integrations start failing.`
|
|
121
|
+
);
|
|
122
|
+
} else if (debug) {
|
|
123
|
+
console.log("[VerificationGateway] API key self-check passed");
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
}
|
|
105
127
|
} catch (err) {
|
|
106
128
|
if (strictInit) {
|
|
107
129
|
throw err;
|
|
@@ -213,8 +235,17 @@ function extractCredentials(headers, query) {
|
|
|
213
235
|
function createGuidanceResponse(_config, reason, options = {}) {
|
|
214
236
|
const source = options.source ?? "no_credentials";
|
|
215
237
|
const isApiError = source === "api_error";
|
|
238
|
+
const isMisconfig = source === "merchant_misconfig";
|
|
216
239
|
const urls = options.urls;
|
|
217
|
-
const guidance =
|
|
240
|
+
const guidance = isMisconfig ? {
|
|
241
|
+
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.",
|
|
242
|
+
registrationUrl: urls?.registrationUrl ?? "",
|
|
243
|
+
documentationUrl: options.remediation?.docsUrl ?? urls?.documentationUrl ?? "",
|
|
244
|
+
steps: [
|
|
245
|
+
"Report the failure to the site operator \u2014 their AstraSync API key needs rotating",
|
|
246
|
+
"Do not retry: the failure is deterministic until the operator updates their key"
|
|
247
|
+
]
|
|
248
|
+
} : isApiError ? {
|
|
218
249
|
message: "Verification is temporarily unavailable. Retry with exponential backoff; if the issue persists, contact support with the correlationId.",
|
|
219
250
|
registrationUrl: urls?.registrationUrl ?? "",
|
|
220
251
|
documentationUrl: urls?.documentationUrl ?? "",
|
|
@@ -252,13 +283,22 @@ function createGuidanceResponse(_config, reason, options = {}) {
|
|
|
252
283
|
// partners (and their custom onDenied handlers) can branch on
|
|
253
284
|
// dimension. Without this, the synthesised stub was indistinguishable
|
|
254
285
|
// from a real policy deny.
|
|
255
|
-
failures:
|
|
286
|
+
failures: isMisconfig ? [
|
|
287
|
+
{
|
|
288
|
+
dimension: "verify_access.merchant_misconfigured",
|
|
289
|
+
message: reason ?? "The integration API key was rejected by AstraSync",
|
|
290
|
+
guidance: guidance.message
|
|
291
|
+
}
|
|
292
|
+
] : isApiError ? [
|
|
256
293
|
{
|
|
257
294
|
dimension: "verify_access.api_error",
|
|
258
295
|
message: reason ?? "Verification temporarily unavailable",
|
|
259
296
|
guidance: guidance.message
|
|
260
297
|
}
|
|
261
298
|
] : void 0,
|
|
299
|
+
// 4.0.0: typed marker so adapters render the misconfig envelope (503 +
|
|
300
|
+
// MERCHANT_VERIFICATION_MISCONFIGURED) without string-matching.
|
|
301
|
+
...isMisconfig && { misconfigured: true },
|
|
262
302
|
correlationId: options.correlationId,
|
|
263
303
|
attemptId: options.attemptId,
|
|
264
304
|
verifiedAt: /* @__PURE__ */ new Date()
|
|
@@ -313,7 +353,8 @@ async function callVerifyAccessAPI(config, request) {
|
|
|
313
353
|
const response = await fetch(`${config.apiBaseUrl}/agents/verify-access`, {
|
|
314
354
|
method: "POST",
|
|
315
355
|
headers,
|
|
316
|
-
body: JSON.stringify(body)
|
|
356
|
+
body: JSON.stringify(body),
|
|
357
|
+
signal: AbortSignal.timeout(config.verifyTimeoutMs ?? 1e4)
|
|
317
358
|
});
|
|
318
359
|
const data = await response.json();
|
|
319
360
|
if (response.status === 410) {
|
|
@@ -337,6 +378,17 @@ async function callVerifyAccessAPI(config, request) {
|
|
|
337
378
|
};
|
|
338
379
|
}
|
|
339
380
|
if (!response.ok) {
|
|
381
|
+
if (response.status === 401) {
|
|
382
|
+
return {
|
|
383
|
+
success: false,
|
|
384
|
+
error: data.message || data.error || "Integration API key rejected",
|
|
385
|
+
misconfig: true,
|
|
386
|
+
misconfigCode: typeof data?.code === "string" ? data.code : void 0,
|
|
387
|
+
remediation: data?.remediation && typeof data.remediation === "object" ? data.remediation : void 0,
|
|
388
|
+
correlationId: typeof data?.correlationId === "string" ? data.correlationId : void 0,
|
|
389
|
+
attemptId: typeof data?.attemptId === "string" ? data.attemptId : void 0
|
|
390
|
+
};
|
|
391
|
+
}
|
|
340
392
|
return {
|
|
341
393
|
success: false,
|
|
342
394
|
error: data.message || data.error || `API returned ${response.status}`,
|
|
@@ -358,9 +410,19 @@ async function verify(config, request, options) {
|
|
|
358
410
|
const urls = mergedConfig.apiBaseUrl ? getCachedWellKnownUrls(mergedConfig.apiBaseUrl) : void 0;
|
|
359
411
|
if (!initCheckPerformed && !mergedConfig.disableInitChecks && mergedConfig.apiBaseUrl) {
|
|
360
412
|
if (mergedConfig.strictInit) {
|
|
361
|
-
await performInitCheck(
|
|
413
|
+
await performInitCheck(
|
|
414
|
+
mergedConfig.apiBaseUrl,
|
|
415
|
+
mergedConfig.debug,
|
|
416
|
+
true,
|
|
417
|
+
mergedConfig.apiKey
|
|
418
|
+
);
|
|
362
419
|
} else {
|
|
363
|
-
void performInitCheck(
|
|
420
|
+
void performInitCheck(
|
|
421
|
+
mergedConfig.apiBaseUrl,
|
|
422
|
+
mergedConfig.debug,
|
|
423
|
+
false,
|
|
424
|
+
mergedConfig.apiKey
|
|
425
|
+
);
|
|
364
426
|
}
|
|
365
427
|
}
|
|
366
428
|
if (!deprecationWarningShown && (config.minTrustScore !== void 0 || config.minTrustScoreForFull !== void 0)) {
|
|
@@ -399,9 +461,10 @@ async function verify(config, request, options) {
|
|
|
399
461
|
const serverDenialReasons = Array.isArray(rawServerDenialReasons) && rawServerDenialReasons.length > 0 ? rawServerDenialReasons : void 0;
|
|
400
462
|
if (!apiResponse.success) {
|
|
401
463
|
return createGuidanceResponse(mergedConfig, apiResponse.error, {
|
|
402
|
-
source: "api_error",
|
|
464
|
+
source: apiResponse.misconfig ? "merchant_misconfig" : "api_error",
|
|
403
465
|
correlationId: apiResponse.correlationId,
|
|
404
466
|
attemptId: apiResponse.attemptId,
|
|
467
|
+
remediation: apiResponse.remediation,
|
|
405
468
|
urls
|
|
406
469
|
});
|
|
407
470
|
}
|
|
@@ -755,6 +818,24 @@ function dedupeFailures(result) {
|
|
|
755
818
|
}
|
|
756
819
|
function defaultMcpDenied(result, req, res) {
|
|
757
820
|
const id = req.body?.id ?? null;
|
|
821
|
+
if (result.misconfigured) {
|
|
822
|
+
res.setHeader("X-Astra-Gateway-Mode", "enforced");
|
|
823
|
+
res.status(503).json({
|
|
824
|
+
jsonrpc: "2.0",
|
|
825
|
+
id,
|
|
826
|
+
error: {
|
|
827
|
+
// -32002 → merchant verification misconfigured (see -32000/-32001 below)
|
|
828
|
+
code: -32002,
|
|
829
|
+
message: result.denialReasons?.[0] ?? "This server's AstraSync integration is misconfigured",
|
|
830
|
+
data: {
|
|
831
|
+
guidance: result.guidance,
|
|
832
|
+
failures: result.failures,
|
|
833
|
+
correlationId: result.correlationId
|
|
834
|
+
}
|
|
835
|
+
}
|
|
836
|
+
});
|
|
837
|
+
return;
|
|
838
|
+
}
|
|
758
839
|
const status = !result.identityVerified ? 401 : 403;
|
|
759
840
|
res.setHeader("X-Astra-Gateway-Mode", "enforced");
|
|
760
841
|
res.status(status).json({
|
|
@@ -764,6 +845,7 @@ function defaultMcpDenied(result, req, res) {
|
|
|
764
845
|
// JSON-RPC error codes:
|
|
765
846
|
// -32000 → unauthorized (no identity resolved)
|
|
766
847
|
// -32001 → insufficient access (identity OK, policy denied)
|
|
848
|
+
// -32002 → merchant verification misconfigured (handled above)
|
|
767
849
|
code: !result.identityVerified ? -32e3 : -32001,
|
|
768
850
|
message: result.denialReasons?.[0] ?? "Access denied",
|
|
769
851
|
data: {
|