@astrasyncai/verification-gateway 5.10.0 → 5.12.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/README.md +4 -0
- package/dist/adapters/express.d.mts +1 -1
- package/dist/adapters/express.d.ts +1 -1
- package/dist/adapters/express.js +359 -30
- package/dist/adapters/express.js.map +1 -1
- package/dist/adapters/express.mjs +359 -30
- package/dist/adapters/express.mjs.map +1 -1
- package/dist/adapters/mcp.d.mts +5 -1
- package/dist/adapters/mcp.d.ts +5 -1
- package/dist/adapters/mcp.js +168 -41
- package/dist/adapters/mcp.js.map +1 -1
- package/dist/adapters/mcp.mjs +168 -41
- package/dist/adapters/mcp.mjs.map +1 -1
- package/dist/adapters/nextjs.d.mts +1 -1
- package/dist/adapters/nextjs.d.ts +1 -1
- package/dist/adapters/nextjs.js +352 -13
- package/dist/adapters/nextjs.js.map +1 -1
- package/dist/adapters/nextjs.mjs +352 -13
- package/dist/adapters/nextjs.mjs.map +1 -1
- package/dist/adapters/sdk.d.mts +9 -1
- package/dist/adapters/sdk.d.ts +9 -1
- package/dist/adapters/sdk.js +100 -8
- package/dist/adapters/sdk.js.map +1 -1
- package/dist/adapters/sdk.mjs +100 -8
- package/dist/adapters/sdk.mjs.map +1 -1
- package/dist/agent/index.js +1 -1
- package/dist/agent/index.js.map +1 -1
- package/dist/agent/index.mjs +1 -1
- package/dist/agent/index.mjs.map +1 -1
- package/dist/bin/astrasync-claude-hook.js +805 -16
- package/dist/bin/astrasync-codex-hook.js +805 -16
- package/dist/bin/astrasync-guard.js +894 -71
- package/dist/bin/astrasync.js +951 -74
- package/dist/browser/background.js +284 -7
- package/dist/browser/background.js.map +1 -1
- package/dist/browser/background.mjs +284 -7
- package/dist/browser/background.mjs.map +1 -1
- package/dist/cli/index.d.mts +8 -8
- package/dist/cli/index.d.ts +8 -8
- package/dist/cli/index.js +22 -64
- package/dist/cli/index.js.map +1 -1
- package/dist/cli/index.mjs +22 -64
- package/dist/cli/index.mjs.map +1 -1
- package/dist/codex/index.d.mts +5 -0
- package/dist/codex/index.d.ts +5 -0
- package/dist/codex/index.js +821 -24
- package/dist/codex/index.js.map +1 -1
- package/dist/codex/index.mjs +823 -26
- package/dist/codex/index.mjs.map +1 -1
- package/dist/cursor/extension.d.mts +9 -2
- package/dist/cursor/extension.d.ts +9 -2
- package/dist/cursor/extension.js +787 -11
- package/dist/cursor/extension.js.map +1 -1
- package/dist/cursor/extension.mjs +789 -11
- 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/edge-config.js +1 -1
- package/dist/edge-config.js.map +1 -1
- package/dist/edge-config.mjs +1 -1
- package/dist/edge-config.mjs.map +1 -1
- package/dist/edge-core/index.d.mts +128 -13
- package/dist/edge-core/index.d.ts +128 -13
- package/dist/edge-core/index.js +337 -55
- package/dist/edge-core/index.js.map +1 -1
- package/dist/edge-core/index.mjs +334 -55
- package/dist/edge-core/index.mjs.map +1 -1
- package/dist/enrolment-store-8DyaIOLe.d.mts +26 -0
- package/dist/enrolment-store-8DyaIOLe.d.ts +26 -0
- package/dist/gateway/gateway.js +284 -7
- package/dist/gateway/gateway.js.map +1 -1
- package/dist/gateway/gateway.mjs +284 -7
- package/dist/gateway/gateway.mjs.map +1 -1
- package/dist/git-trigger/git-hooks.d.mts +1 -1
- package/dist/git-trigger/git-hooks.d.ts +1 -1
- package/dist/index.d.mts +215 -5
- package/dist/index.d.ts +215 -5
- package/dist/index.js +3756 -80
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +3748 -80
- package/dist/index.mjs.map +1 -1
- package/dist/platform-signatures.js +4 -1
- package/dist/platform-signatures.js.map +1 -1
- package/dist/platform-signatures.mjs +4 -1
- package/dist/platform-signatures.mjs.map +1 -1
- package/dist/registration/index.js +1 -1
- package/dist/registration/index.js.map +1 -1
- package/dist/registration/index.mjs +1 -1
- package/dist/registration/index.mjs.map +1 -1
- package/dist/transport/index.js +1 -1
- package/dist/transport/index.js.map +1 -1
- package/dist/transport/index.mjs +1 -1
- package/dist/transport/index.mjs.map +1 -1
- package/dist/{types-CTmUpNpS.d.mts → types-BCkwBA84.d.mts} +12 -0
- package/dist/{types-CTmUpNpS.d.ts → types-BCkwBA84.d.ts} +12 -0
- package/dist/{types-CtFXmDzm.d.ts → types-C_b4QTyO.d.ts} +18 -0
- package/dist/{types-DQrn_kei.d.mts → types-DlshIIR-.d.mts} +18 -0
- package/dist/ui/index.d.mts +1 -1
- package/dist/ui/index.d.ts +1 -1
- package/dist/verify.d.mts +35 -4
- package/dist/verify.d.ts +35 -4
- package/dist/verify.js +130 -16
- package/dist/verify.js.map +1 -1
- package/dist/verify.mjs +129 -16
- package/dist/verify.mjs.map +1 -1
- package/package.json +1 -1
package/dist/adapters/sdk.mjs
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
// src/version.ts
|
|
2
|
-
var SDK_VERSION = "5.
|
|
2
|
+
var SDK_VERSION = "5.12.0";
|
|
3
3
|
|
|
4
4
|
// src/http.ts
|
|
5
5
|
var SDK_USER_AGENT = `astrasync-sdk/${SDK_VERSION}`;
|
|
@@ -34,6 +34,29 @@ function getCachedWellKnownUrls(apiBaseUrl) {
|
|
|
34
34
|
return cache.get(apiBaseUrl)?.data;
|
|
35
35
|
}
|
|
36
36
|
|
|
37
|
+
// src/failure-posture.ts
|
|
38
|
+
var DEFAULT_UNAVAILABLE_RETRY_AFTER_S = 30;
|
|
39
|
+
var REJECTED_IDENTITY_DIMENSIONS = /* @__PURE__ */ new Set([
|
|
40
|
+
"identity.invalid_agent_id",
|
|
41
|
+
"identity.unknown_agent",
|
|
42
|
+
"agent.lookup"
|
|
43
|
+
]);
|
|
44
|
+
var UNKNOWN_AGENT_GUIDANCE = "Register your agent with AstraSync (or, inside an MCP host, add the AstraSync MCP connector for keyless, human-approved registration), then present the canonical ASTRA-* id issued after owner approval.";
|
|
45
|
+
var UNAVAILABLE_DIMENSIONS = /* @__PURE__ */ new Set([
|
|
46
|
+
"verify_access.api_error",
|
|
47
|
+
"middleware.internal_error"
|
|
48
|
+
]);
|
|
49
|
+
function isVerificationUnavailable(result) {
|
|
50
|
+
if (result.misconfigured) return false;
|
|
51
|
+
return (result.failures ?? []).some((f) => UNAVAILABLE_DIMENSIONS.has(f.dimension));
|
|
52
|
+
}
|
|
53
|
+
function unavailableRetryAfterSeconds(result) {
|
|
54
|
+
if (typeof result.retryAfterMs === "number" && Number.isFinite(result.retryAfterMs)) {
|
|
55
|
+
return Math.max(1, Math.ceil(result.retryAfterMs / 1e3));
|
|
56
|
+
}
|
|
57
|
+
return DEFAULT_UNAVAILABLE_RETRY_AFTER_S;
|
|
58
|
+
}
|
|
59
|
+
|
|
37
60
|
// src/verify.ts
|
|
38
61
|
var DEFAULT_CONFIG = {
|
|
39
62
|
apiBaseUrl: "https://astrasync.ai/api",
|
|
@@ -248,11 +271,44 @@ function createGuidanceResponse(_config, reason, options = {}) {
|
|
|
248
271
|
// coercing the absent recommendation to a policy 'deny'. Misconfig is
|
|
249
272
|
// deterministic and intentionally NOT marked retryable.
|
|
250
273
|
...isApiError && { retryable: true },
|
|
274
|
+
...options.httpStatus !== void 0 && { httpStatus: options.httpStatus },
|
|
275
|
+
...options.retryAfterMs !== void 0 && { retryAfterMs: options.retryAfterMs },
|
|
251
276
|
correlationId: options.correlationId,
|
|
252
277
|
attemptId: options.attemptId,
|
|
253
278
|
verifiedAt: /* @__PURE__ */ new Date()
|
|
254
279
|
};
|
|
255
280
|
}
|
|
281
|
+
async function readJsonSafe(response) {
|
|
282
|
+
try {
|
|
283
|
+
const parsed = await response.json();
|
|
284
|
+
return parsed && typeof parsed === "object" ? parsed : {};
|
|
285
|
+
} catch {
|
|
286
|
+
return {};
|
|
287
|
+
}
|
|
288
|
+
}
|
|
289
|
+
function rejectedIdentityGuidance(failures) {
|
|
290
|
+
const f = failures?.find((x) => REJECTED_IDENTITY_DIMENSIONS.has(x.dimension));
|
|
291
|
+
if (!f) return void 0;
|
|
292
|
+
if (f.dimension === "agent.lookup") {
|
|
293
|
+
return `The presented agent identifier is not registered with AstraSync. ${UNKNOWN_AGENT_GUIDANCE}`;
|
|
294
|
+
}
|
|
295
|
+
return f.guidance ? `${f.message} ${f.guidance}` : f.message;
|
|
296
|
+
}
|
|
297
|
+
var MAX_RETRY_AFTER_MS = 15 * 60 * 1e3;
|
|
298
|
+
function parseRetryAfterMs(response) {
|
|
299
|
+
const raw = response.headers?.get?.("retry-after");
|
|
300
|
+
if (!raw) return void 0;
|
|
301
|
+
const trimmed = raw.trim();
|
|
302
|
+
let ms;
|
|
303
|
+
if (/^\d+(\.\d+)?$/.test(trimmed)) {
|
|
304
|
+
ms = Number(trimmed) * 1e3;
|
|
305
|
+
} else {
|
|
306
|
+
const at = Date.parse(trimmed);
|
|
307
|
+
if (Number.isNaN(at)) return void 0;
|
|
308
|
+
ms = at - Date.now();
|
|
309
|
+
}
|
|
310
|
+
return Math.min(MAX_RETRY_AFTER_MS, Math.max(0, Math.round(ms)));
|
|
311
|
+
}
|
|
256
312
|
async function callVerifyAccessAPI(config, request) {
|
|
257
313
|
const { credentials, ...requestData } = request;
|
|
258
314
|
const body = {
|
|
@@ -309,7 +365,8 @@ async function callVerifyAccessAPI(config, request) {
|
|
|
309
365
|
body: JSON.stringify(body),
|
|
310
366
|
signal: AbortSignal.timeout(config.verifyTimeoutMs ?? 1e4)
|
|
311
367
|
});
|
|
312
|
-
const data = await response
|
|
368
|
+
const data = await readJsonSafe(response);
|
|
369
|
+
const retryAfterMs = parseRetryAfterMs(response);
|
|
313
370
|
if (response.status === 410) {
|
|
314
371
|
return {
|
|
315
372
|
success: true,
|
|
@@ -347,6 +404,23 @@ async function callVerifyAccessAPI(config, request) {
|
|
|
347
404
|
}
|
|
348
405
|
};
|
|
349
406
|
}
|
|
407
|
+
if (response.status === 404 && credentials.astraId && (data?.error === "AGENT_NOT_FOUND" || typeof data?.message === "string" && /agent/i.test(data.message))) {
|
|
408
|
+
return {
|
|
409
|
+
success: true,
|
|
410
|
+
attemptId: typeof data?.attemptId === "string" ? data.attemptId : void 0,
|
|
411
|
+
access: {
|
|
412
|
+
allowed: false,
|
|
413
|
+
reason: "unknown_agent",
|
|
414
|
+
failures: [
|
|
415
|
+
{
|
|
416
|
+
dimension: "identity.unknown_agent",
|
|
417
|
+
message: "The presented agent identifier is not registered with AstraSync.",
|
|
418
|
+
guidance: UNKNOWN_AGENT_GUIDANCE
|
|
419
|
+
}
|
|
420
|
+
]
|
|
421
|
+
}
|
|
422
|
+
};
|
|
423
|
+
}
|
|
350
424
|
if (!response.ok) {
|
|
351
425
|
if (response.status === 401) {
|
|
352
426
|
return {
|
|
@@ -361,9 +435,11 @@ async function callVerifyAccessAPI(config, request) {
|
|
|
361
435
|
}
|
|
362
436
|
return {
|
|
363
437
|
success: false,
|
|
364
|
-
error: data.message || data.error || `API returned ${response.status}`,
|
|
438
|
+
error: typeof data?.message === "string" && data.message || typeof data?.error === "string" && data.error || `API returned ${response.status}`,
|
|
365
439
|
correlationId: typeof data?.correlationId === "string" ? data.correlationId : void 0,
|
|
366
|
-
attemptId: typeof data?.attemptId === "string" ? data.attemptId : void 0
|
|
440
|
+
attemptId: typeof data?.attemptId === "string" ? data.attemptId : void 0,
|
|
441
|
+
httpStatus: response.status,
|
|
442
|
+
...retryAfterMs !== void 0 && { retryAfterMs }
|
|
367
443
|
};
|
|
368
444
|
}
|
|
369
445
|
return data;
|
|
@@ -435,12 +511,14 @@ async function verify(config, request, options) {
|
|
|
435
511
|
correlationId: apiResponse.correlationId,
|
|
436
512
|
attemptId: apiResponse.attemptId,
|
|
437
513
|
remediation: apiResponse.remediation,
|
|
514
|
+
httpStatus: apiResponse.httpStatus,
|
|
515
|
+
retryAfterMs: apiResponse.retryAfterMs,
|
|
438
516
|
urls
|
|
439
517
|
});
|
|
440
518
|
}
|
|
441
519
|
if (!apiResponse.access?.allowed) {
|
|
442
520
|
const aggregatedFailures = apiResponse.access?.failures;
|
|
443
|
-
const idVerifiedFromBackend = apiResponse.verificationContext?.idVerified === true;
|
|
521
|
+
const idVerifiedFromBackend = apiResponse.verificationContext?.idVerified === true && !aggregatedFailures?.some((f) => REJECTED_IDENTITY_DIMENSIONS.has(f.dimension));
|
|
444
522
|
const result2 = {
|
|
445
523
|
identityVerified: idVerifiedFromBackend,
|
|
446
524
|
policyAllowed: false,
|
|
@@ -452,7 +530,10 @@ async function verify(config, request, options) {
|
|
|
452
530
|
requiresStepUp: apiResponse.access?.requiresStepUp,
|
|
453
531
|
requiresApproval: apiResponse.access?.requiresApproval,
|
|
454
532
|
guidance: {
|
|
455
|
-
|
|
533
|
+
// 5.12.0: a presented-but-rejected id (malformed / unknown) carries
|
|
534
|
+
// actionable registration guidance on its failure — surface it
|
|
535
|
+
// instead of the bare machine reason ('unknown_agent').
|
|
536
|
+
message: rejectedIdentityGuidance(aggregatedFailures) ?? (apiResponse.access?.reason || "Access denied by PDLSS policy"),
|
|
456
537
|
registrationUrl: urls?.registrationUrl ?? "",
|
|
457
538
|
documentationUrl: urls?.documentationUrl ?? "",
|
|
458
539
|
// 5.1.0: anonymous callers land on this branch — steer MCP-hosted
|
|
@@ -552,7 +633,7 @@ async function verify(config, request, options) {
|
|
|
552
633
|
registrationUrl: urls?.registrationUrl ?? "",
|
|
553
634
|
documentationUrl: urls?.documentationUrl ?? ""
|
|
554
635
|
};
|
|
555
|
-
} else if (result.recommendation === "step_up_required") {
|
|
636
|
+
} else if (result.recommendation === "step_up_required" && result.identityVerified) {
|
|
556
637
|
result.requiresStepUp = true;
|
|
557
638
|
result.denialReasons = serverDenialReasons ?? result.recommendationReasons ?? ["Step-up verification required"];
|
|
558
639
|
}
|
|
@@ -570,7 +651,11 @@ async function quickVerify(config, credentials) {
|
|
|
570
651
|
return {
|
|
571
652
|
identityVerified: result.identityVerified,
|
|
572
653
|
policyAllowed: result.policyAllowed,
|
|
573
|
-
reason: result.denialReasons?.[0]
|
|
654
|
+
reason: result.denialReasons?.[0],
|
|
655
|
+
...isVerificationUnavailable(result) && {
|
|
656
|
+
unavailable: true,
|
|
657
|
+
retryAfterMs: unavailableRetryAfterSeconds(result) * 1e3
|
|
658
|
+
}
|
|
574
659
|
};
|
|
575
660
|
}
|
|
576
661
|
|
|
@@ -656,6 +741,12 @@ var VerificationGatewayClient = class {
|
|
|
656
741
|
* fulfil against it only once the order is settled / pending_merchant. An
|
|
657
742
|
* explicit `buyerEmail` (here or on the bridge handoff body) wins over the
|
|
658
743
|
* account default.
|
|
744
|
+
*
|
|
745
|
+
* 5.12.0 approval binding: pass the bridge handoff body's `attemptId` (and
|
|
746
|
+
* the same `checkoutSessionId`) so a step-up approval minted for this cart
|
|
747
|
+
* is matched to — and only to — this confirm. A held cart's approval is
|
|
748
|
+
* bound to its checkout session and exact value; a confirm for any other
|
|
749
|
+
* cart is held for its own approval.
|
|
659
750
|
*/
|
|
660
751
|
async confirmCheckout(options) {
|
|
661
752
|
const credentials = {
|
|
@@ -675,6 +766,7 @@ var VerificationGatewayClient = class {
|
|
|
675
766
|
commercePhase: "confirm",
|
|
676
767
|
checkoutSessionId: options.checkoutSessionId,
|
|
677
768
|
checkoutItems: options.checkoutItems,
|
|
769
|
+
...options.attemptId && { attemptId: options.attemptId },
|
|
678
770
|
buyerEmail: options.buyerEmail,
|
|
679
771
|
counterpartyUrl: options.counterpartyUrl,
|
|
680
772
|
counterpartyType: options.counterpartyType
|