@astrasyncai/verification-gateway 5.18.1 → 5.20.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/CHANGELOG.md +232 -0
- package/README.md +217 -4
- package/dist/adapter-interface/interface.d.mts +2 -2
- package/dist/adapter-interface/interface.d.ts +2 -2
- package/dist/adapters/express.d.mts +9 -1
- package/dist/adapters/express.d.ts +9 -1
- package/dist/adapters/express.js +160 -52
- package/dist/adapters/express.js.map +1 -1
- package/dist/adapters/express.mjs +160 -52
- package/dist/adapters/express.mjs.map +1 -1
- package/dist/adapters/http-pdlss.d.mts +7 -1
- package/dist/adapters/http-pdlss.d.ts +7 -1
- package/dist/adapters/http-pdlss.js +18 -2
- package/dist/adapters/http-pdlss.js.map +1 -1
- package/dist/adapters/http-pdlss.mjs +16 -1
- package/dist/adapters/http-pdlss.mjs.map +1 -1
- package/dist/adapters/kit-express.d.mts +93 -1
- package/dist/adapters/kit-express.d.ts +93 -1
- package/dist/adapters/kit-express.js +181 -2
- package/dist/adapters/kit-express.js.map +1 -1
- package/dist/adapters/kit-express.mjs +180 -2
- package/dist/adapters/kit-express.mjs.map +1 -1
- package/dist/adapters/mcp.d.mts +102 -9
- package/dist/adapters/mcp.d.ts +102 -9
- package/dist/adapters/mcp.js +242 -19
- package/dist/adapters/mcp.js.map +1 -1
- package/dist/adapters/mcp.mjs +240 -19
- 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 +97 -14
- package/dist/adapters/nextjs.js.map +1 -1
- package/dist/adapters/nextjs.mjs +97 -14
- package/dist/adapters/nextjs.mjs.map +1 -1
- package/dist/adapters/sdk.d.mts +101 -2
- package/dist/adapters/sdk.d.ts +101 -2
- package/dist/adapters/sdk.js +199 -12
- package/dist/adapters/sdk.js.map +1 -1
- package/dist/adapters/sdk.mjs +199 -12
- package/dist/adapters/sdk.mjs.map +1 -1
- package/dist/agent/index.d.mts +1 -1
- package/dist/agent/index.d.ts +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 +94 -16
- package/dist/bin/astrasync-codex-hook.js +94 -16
- package/dist/bin/astrasync-guard.js +94 -16
- package/dist/bin/astrasync.js +127 -16
- package/dist/browser/background.js +94 -16
- package/dist/browser/background.js.map +1 -1
- package/dist/browser/background.mjs +94 -16
- package/dist/browser/background.mjs.map +1 -1
- package/dist/cli/index.js +1 -1
- package/dist/cli/index.js.map +1 -1
- package/dist/cli/index.mjs +1 -1
- package/dist/cli/index.mjs.map +1 -1
- package/dist/codex/index.js +94 -16
- package/dist/codex/index.js.map +1 -1
- package/dist/codex/index.mjs +94 -16
- package/dist/codex/index.mjs.map +1 -1
- package/dist/cursor/extension.js +94 -16
- package/dist/cursor/extension.js.map +1 -1
- package/dist/cursor/extension.mjs +94 -16
- 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 +1 -1
- package/dist/edge-core/index.d.ts +1 -1
- package/dist/edge-core/index.js +69 -12
- package/dist/edge-core/index.js.map +1 -1
- package/dist/edge-core/index.mjs +69 -12
- package/dist/edge-core/index.mjs.map +1 -1
- package/dist/gateway/gateway.d.mts +2 -2
- package/dist/gateway/gateway.d.ts +2 -2
- package/dist/gateway/gateway.js +94 -16
- package/dist/gateway/gateway.js.map +1 -1
- package/dist/gateway/gateway.mjs +94 -16
- 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 +706 -34
- package/dist/index.d.ts +706 -34
- package/dist/index.js +1391 -205
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +1374 -195
- 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/registration/index.d.mts +11 -2
- package/dist/registration/index.d.ts +11 -2
- 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.d.mts +1 -1
- package/dist/transport/index.d.ts +1 -1
- package/dist/transport/index.js +3 -2
- package/dist/transport/index.js.map +1 -1
- package/dist/transport/index.mjs +3 -2
- package/dist/transport/index.mjs.map +1 -1
- package/dist/{types-BRz2U0Pn.d.ts → types-B_HLhZ9n.d.ts} +1 -1
- package/dist/{types-BfILnheI.d.mts → types-CU17R4Nr.d.mts} +11 -0
- package/dist/{types-BfILnheI.d.ts → types-CU17R4Nr.d.ts} +11 -0
- package/dist/{types-Cns4l8gX.d.mts → types-CxjqmPl-.d.mts} +115 -13
- package/dist/{types-Cns4l8gX.d.ts → types-CxjqmPl-.d.ts} +115 -13
- package/dist/{types-3ObBpsnf.d.mts → types-D37aSQ9c.d.mts} +106 -3
- package/dist/{types-CfBpm3w5.d.mts → types-Djpz-L0w.d.mts} +1 -1
- package/dist/{types-BoxZEYPS.d.ts → types-Dn8tXnei.d.ts} +106 -3
- package/dist/ui/index.d.mts +1 -1
- package/dist/ui/index.d.ts +1 -1
- package/dist/verify.d.mts +50 -4
- package/dist/verify.d.ts +50 -4
- package/dist/verify.js +93 -14
- package/dist/verify.js.map +1 -1
- package/dist/verify.mjs +91 -14
- package/dist/verify.mjs.map +1 -1
- package/dist/webhooks.d.mts +16 -3
- package/dist/webhooks.d.ts +16 -3
- package/dist/webhooks.js +24 -13
- package/dist/webhooks.js.map +1 -1
- package/dist/webhooks.mjs +24 -13
- package/dist/webhooks.mjs.map +1 -1
- package/package.json +1 -1
package/dist/gateway/gateway.mjs
CHANGED
|
@@ -3722,7 +3722,7 @@ function getTrustLevel(score) {
|
|
|
3722
3722
|
}
|
|
3723
3723
|
|
|
3724
3724
|
// src/version.ts
|
|
3725
|
-
var SDK_VERSION = "5.
|
|
3725
|
+
var SDK_VERSION = "5.20.0";
|
|
3726
3726
|
|
|
3727
3727
|
// src/http.ts
|
|
3728
3728
|
var SDK_USER_AGENT = `astrasync-sdk/${SDK_VERSION}`;
|
|
@@ -3877,7 +3877,12 @@ function getCacheKey(request, counterpartyId) {
|
|
|
3877
3877
|
// its start_checkout quote was served the cached quote-leg grant (no
|
|
3878
3878
|
// settlementOutcome) and never reached the backend. Same F-A1-07 bug class.
|
|
3879
3879
|
request.commercePhase || "",
|
|
3880
|
-
request.checkoutSessionId || ""
|
|
3880
|
+
request.checkoutSessionId || "",
|
|
3881
|
+
// 5.19.0: a route_config purpose claim is checked server-side against
|
|
3882
|
+
// the stored rule for this method + path, so it changes the verdict.
|
|
3883
|
+
request.purposeSource || "",
|
|
3884
|
+
request.requestMethod || "",
|
|
3885
|
+
request.requestPath || ""
|
|
3881
3886
|
].join("|");
|
|
3882
3887
|
}
|
|
3883
3888
|
function getCachedResult(request, counterpartyId) {
|
|
@@ -4035,6 +4040,9 @@ async function callVerifyAccessAPI(config, request) {
|
|
|
4035
4040
|
if (requestData.enableRuntimeChallenge)
|
|
4036
4041
|
body.enableRuntimeChallenge = requestData.enableRuntimeChallenge;
|
|
4037
4042
|
if (requestData.routePolicy) body.routePolicy = requestData.routePolicy;
|
|
4043
|
+
if (config.actingProof?.connectorToken) {
|
|
4044
|
+
body.actingProof = { connectorToken: config.actingProof.connectorToken };
|
|
4045
|
+
}
|
|
4038
4046
|
if (requestData.approvalHeldByRoute) body.approvalHeldByRoute = true;
|
|
4039
4047
|
if (requestData.createSession) body.createSession = requestData.createSession;
|
|
4040
4048
|
if (requestData.durationRequired) body.durationRequired = requestData.durationRequired;
|
|
@@ -4051,6 +4059,11 @@ async function callVerifyAccessAPI(config, request) {
|
|
|
4051
4059
|
if (requestData.buyerEmail) body.buyerEmail = requestData.buyerEmail;
|
|
4052
4060
|
if (requestData.commerceArtifacts) body.commerceArtifacts = requestData.commerceArtifacts;
|
|
4053
4061
|
if (requestData.attemptId) body.attemptId = requestData.attemptId;
|
|
4062
|
+
if (requestData.purposeSource) body.purposeSource = requestData.purposeSource;
|
|
4063
|
+
if (requestData.agentArtifacts) body.agentArtifacts = requestData.agentArtifacts;
|
|
4064
|
+
if (requestData.metadata) body.metadata = requestData.metadata;
|
|
4065
|
+
if (requestData.requestMethod) body.requestMethod = requestData.requestMethod;
|
|
4066
|
+
if (requestData.requestPath) body.requestPath = requestData.requestPath;
|
|
4054
4067
|
if (requestData.considerationSet) body.considerationSet = requestData.considerationSet;
|
|
4055
4068
|
body.sdkVersion = SDK_VERSION;
|
|
4056
4069
|
if (requestData.callerMetadata || requestData.clientIp || requestData.userAgent) {
|
|
@@ -4197,22 +4210,43 @@ async function verify(config, request, options) {
|
|
|
4197
4210
|
"[VerificationGateway] minTrustScore / minTrustScoreForFull are deprecated in v2.3.0 and have no effect. Server is now the single source of truth for access decisions (verified ID + runtime challenge + PDLSS + trust score). To gate access to an endpoint, configure the endpoint's trust_score_requirement server-side."
|
|
4198
4211
|
);
|
|
4199
4212
|
}
|
|
4200
|
-
const uncacheable = Boolean(request.commerceArtifacts);
|
|
4213
|
+
const uncacheable = Boolean(request.commerceArtifacts) || Boolean(mergedConfig.actingProof);
|
|
4201
4214
|
if (mergedConfig.cacheTtl !== 0 && !options?.bypassCache && !uncacheable) {
|
|
4202
4215
|
const cached = getCachedResult(request, mergedConfig.counterpartyId);
|
|
4203
4216
|
if (cached) {
|
|
4204
4217
|
if (mergedConfig.debug) {
|
|
4205
4218
|
console.log("[VerificationGateway] Returning cached result");
|
|
4206
4219
|
}
|
|
4207
|
-
|
|
4208
|
-
|
|
4209
|
-
|
|
4210
|
-
|
|
4211
|
-
|
|
4212
|
-
|
|
4213
|
-
|
|
4220
|
+
return sharedVerdict(cached, request);
|
|
4221
|
+
}
|
|
4222
|
+
}
|
|
4223
|
+
if (mergedConfig.cacheTtl !== 0 && !options?.bypassCache && !uncacheable) {
|
|
4224
|
+
const key = getCacheKey(request, mergedConfig.counterpartyId);
|
|
4225
|
+
const pending = inflightVerifies.get(key);
|
|
4226
|
+
if (pending) return sharedVerdict(await pending, request);
|
|
4227
|
+
const flight = verifyViaApi(mergedConfig, request, urls, uncacheable);
|
|
4228
|
+
inflightVerifies.set(key, flight);
|
|
4229
|
+
try {
|
|
4230
|
+
return await flight;
|
|
4231
|
+
} finally {
|
|
4232
|
+
inflightVerifies.delete(key);
|
|
4214
4233
|
}
|
|
4215
4234
|
}
|
|
4235
|
+
return verifyViaApi(mergedConfig, request, urls, uncacheable);
|
|
4236
|
+
}
|
|
4237
|
+
var inflightVerifies = /* @__PURE__ */ new Map();
|
|
4238
|
+
var sharedVerdicts = /* @__PURE__ */ new WeakSet();
|
|
4239
|
+
function sharedVerdict(source, request) {
|
|
4240
|
+
const hit = { ...source };
|
|
4241
|
+
if (request.attemptId) {
|
|
4242
|
+
hit.attemptId = request.attemptId;
|
|
4243
|
+
} else {
|
|
4244
|
+
delete hit.attemptId;
|
|
4245
|
+
}
|
|
4246
|
+
sharedVerdicts.add(hit);
|
|
4247
|
+
return hit;
|
|
4248
|
+
}
|
|
4249
|
+
async function verifyViaApi(mergedConfig, request, urls, uncacheable) {
|
|
4216
4250
|
const enrichedRequest = { ...request };
|
|
4217
4251
|
if (!enrichedRequest.counterpartyUrl && mergedConfig.counterpartyUrl) {
|
|
4218
4252
|
enrichedRequest.counterpartyUrl = mergedConfig.counterpartyUrl;
|
|
@@ -4240,9 +4274,18 @@ async function verify(config, request, options) {
|
|
|
4240
4274
|
if (!apiResponse.access?.allowed) {
|
|
4241
4275
|
const aggregatedFailures = apiResponse.access?.failures;
|
|
4242
4276
|
const idVerifiedFromBackend = apiResponse.verificationContext?.idVerified === true && !aggregatedFailures?.some((f) => REJECTED_IDENTITY_DIMENSIONS.has(f.dimension));
|
|
4277
|
+
const denyAgent = idVerifiedFromBackend && apiResponse.agent ? {
|
|
4278
|
+
astraId: apiResponse.agent.astraId,
|
|
4279
|
+
name: apiResponse.agent.name,
|
|
4280
|
+
trustScore: apiResponse.agent.trustScore,
|
|
4281
|
+
trustLevel: getTrustLevel(apiResponse.agent.trustScore),
|
|
4282
|
+
blockchainAnchored: apiResponse.agent.blockchainStatus === "anchored",
|
|
4283
|
+
status: apiResponse.agent.agentStatus
|
|
4284
|
+
} : void 0;
|
|
4243
4285
|
const result2 = {
|
|
4244
4286
|
identityVerified: idVerifiedFromBackend,
|
|
4245
4287
|
policyAllowed: false,
|
|
4288
|
+
...denyAgent && { agent: denyAgent },
|
|
4246
4289
|
// 3.6.0: the server now emits top-level denialReasons on every deny
|
|
4247
4290
|
// path — prefer it verbatim; the failure-message reconstruction remains
|
|
4248
4291
|
// as the fallback for older backends.
|
|
@@ -4282,7 +4325,9 @@ async function verify(config, request, options) {
|
|
|
4282
4325
|
fulfilment: apiResponse.fulfilment,
|
|
4283
4326
|
mandates: apiResponse.mandates,
|
|
4284
4327
|
kyaToken: apiResponse.kyaToken,
|
|
4285
|
-
aep: apiResponse.aep
|
|
4328
|
+
aep: apiResponse.aep,
|
|
4329
|
+
// 5.20.0 (round 29.1): non-fatal integration warnings (e.g. events_url_missing).
|
|
4330
|
+
warnings: apiResponse.warnings
|
|
4286
4331
|
};
|
|
4287
4332
|
return result2;
|
|
4288
4333
|
}
|
|
@@ -4350,7 +4395,9 @@ async function verify(config, request, options) {
|
|
|
4350
4395
|
// 5.15.0: merchant-lane AP2 mandates + KYAPay identity token.
|
|
4351
4396
|
mandates: apiResponse.mandates,
|
|
4352
4397
|
kyaToken: apiResponse.kyaToken,
|
|
4353
|
-
aep: apiResponse.aep
|
|
4398
|
+
aep: apiResponse.aep,
|
|
4399
|
+
// 5.20.0 (round 29.1): non-fatal integration warnings (e.g. events_url_missing).
|
|
4400
|
+
warnings: apiResponse.warnings
|
|
4354
4401
|
};
|
|
4355
4402
|
if (result.recommendation === "deny") {
|
|
4356
4403
|
result.policyAllowed = false;
|
|
@@ -4376,8 +4423,18 @@ async function verify(config, request, options) {
|
|
|
4376
4423
|
cacheResult(request, result, mergedConfig.cacheTtl, mergedConfig.counterpartyId);
|
|
4377
4424
|
}
|
|
4378
4425
|
}
|
|
4426
|
+
notifyVerificationListeners(request, result);
|
|
4379
4427
|
return result;
|
|
4380
4428
|
}
|
|
4429
|
+
var verificationListeners = /* @__PURE__ */ new Set();
|
|
4430
|
+
function notifyVerificationListeners(request, result) {
|
|
4431
|
+
for (const listener of verificationListeners) {
|
|
4432
|
+
try {
|
|
4433
|
+
listener(result, request);
|
|
4434
|
+
} catch {
|
|
4435
|
+
}
|
|
4436
|
+
}
|
|
4437
|
+
}
|
|
4381
4438
|
|
|
4382
4439
|
// src/adapters/stepup-poll.ts
|
|
4383
4440
|
var FALLBACK_MAX_WAIT_MS = 5 * 60 * 1e3;
|
|
@@ -4388,6 +4445,9 @@ var MAX_TOTAL_BYTES = 16 * 1024;
|
|
|
4388
4445
|
// src/adapters/commerce-detect.ts
|
|
4389
4446
|
var MAX_BODY_BYTES = 64 * 1024;
|
|
4390
4447
|
|
|
4448
|
+
// src/adapters/routes-cache.ts
|
|
4449
|
+
var DEFAULT_ROUTES_REFRESH_MS = 5 * 60 * 1e3;
|
|
4450
|
+
|
|
4391
4451
|
// src/edge-config.ts
|
|
4392
4452
|
var DEFAULT_EDGE_CONFIG = Object.freeze({
|
|
4393
4453
|
version: 1,
|
|
@@ -4629,9 +4689,6 @@ var BeaconBuffer = class {
|
|
|
4629
4689
|
};
|
|
4630
4690
|
var beaconBuffer = new BeaconBuffer();
|
|
4631
4691
|
|
|
4632
|
-
// src/adapters/express.ts
|
|
4633
|
-
var DEFAULT_ROUTES_REFRESH_MS = 5 * 60 * 1e3;
|
|
4634
|
-
|
|
4635
4692
|
// src/adapters/nextjs.ts
|
|
4636
4693
|
var DEFAULT_ROUTES_REFRESH_MS2 = 5 * 60 * 1e3;
|
|
4637
4694
|
|
|
@@ -4725,6 +4782,25 @@ import {
|
|
|
4725
4782
|
// src/idempotency/index.ts
|
|
4726
4783
|
var DEFAULT_IDEMPOTENCY_TTL_MS = 24 * 60 * 60 * 1e3;
|
|
4727
4784
|
|
|
4785
|
+
// src/ucp/approval-events.ts
|
|
4786
|
+
var MemorySeenEvents = class {
|
|
4787
|
+
constructor(max = 1e4) {
|
|
4788
|
+
this.max = max;
|
|
4789
|
+
this.ids = /* @__PURE__ */ new Set();
|
|
4790
|
+
}
|
|
4791
|
+
async has(eventId) {
|
|
4792
|
+
return this.ids.has(eventId);
|
|
4793
|
+
}
|
|
4794
|
+
async add(eventId) {
|
|
4795
|
+
if (this.ids.size >= this.max) {
|
|
4796
|
+
const first = this.ids.values().next().value;
|
|
4797
|
+
if (first !== void 0) this.ids.delete(first);
|
|
4798
|
+
}
|
|
4799
|
+
this.ids.add(eventId);
|
|
4800
|
+
}
|
|
4801
|
+
};
|
|
4802
|
+
var defaultSeen = new MemorySeenEvents();
|
|
4803
|
+
|
|
4728
4804
|
// src/payments/kyapay.ts
|
|
4729
4805
|
import {
|
|
4730
4806
|
createLocalJWKSet,
|
|
@@ -4769,7 +4845,9 @@ function toDecision(result) {
|
|
|
4769
4845
|
if (result.identityVerified && result.policyAllowed) {
|
|
4770
4846
|
return {
|
|
4771
4847
|
recommendation: "ALLOW",
|
|
4772
|
-
|
|
4848
|
+
// 5.19.0: the score is on `trustScore` for the merchant; `reason` is
|
|
4849
|
+
// text a merchant may relay to the agent, so it never embeds the number.
|
|
4850
|
+
reason: "Verified",
|
|
4773
4851
|
trustScore: result.agent?.trustScore,
|
|
4774
4852
|
sessionId: "sessionId" in result ? result.sessionId : void 0
|
|
4775
4853
|
};
|