@astrasyncai/verification-gateway 4.5.1 → 5.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/README.md +1 -1
- 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 +11 -33
- package/dist/adapters/express.js.map +1 -1
- package/dist/adapters/express.mjs +11 -33
- package/dist/adapters/express.mjs.map +1 -1
- package/dist/adapters/mcp.d.mts +2 -2
- package/dist/adapters/mcp.d.ts +2 -2
- package/dist/adapters/mcp.js +28 -65
- package/dist/adapters/mcp.js.map +1 -1
- package/dist/adapters/mcp.mjs +27 -64
- 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 +9 -30
- package/dist/adapters/nextjs.js.map +1 -1
- package/dist/adapters/nextjs.mjs +9 -30
- 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 +8 -124
- package/dist/adapters/sdk.js.map +1 -1
- package/dist/adapters/sdk.mjs +8 -122
- 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/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 +63 -41
- package/dist/bin/astrasync-codex-hook.js +63 -41
- package/dist/bin/astrasync-guard.js +63 -41
- package/dist/bin/astrasync.js +75 -48
- package/dist/browser/background.js +63 -41
- package/dist/browser/background.js.map +1 -1
- package/dist/browser/background.mjs +63 -41
- 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/cli/index.js +33 -6
- package/dist/cli/index.js.map +1 -1
- package/dist/cli/index.mjs +33 -6
- package/dist/cli/index.mjs.map +1 -1
- package/dist/codex/index.d.mts +2 -2
- package/dist/codex/index.d.ts +2 -2
- package/dist/codex/index.js +63 -41
- package/dist/codex/index.js.map +1 -1
- package/dist/codex/index.mjs +63 -41
- 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 +63 -41
- package/dist/cursor/extension.js.map +1 -1
- package/dist/cursor/extension.mjs +63 -41
- 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 -3
- package/dist/edge-core/index.d.ts +1 -3
- package/dist/edge-core/index.js +11 -33
- package/dist/edge-core/index.js.map +1 -1
- package/dist/edge-core/index.mjs +11 -33
- package/dist/edge-core/index.mjs.map +1 -1
- package/dist/{express-DaqL11tx.d.ts → express-B5lWuemA.d.ts} +1 -1
- package/dist/{express-CR6F3njD.d.mts → express-Dm-snUuY.d.mts} +1 -1
- package/dist/gateway/gateway.d.mts +2 -2
- package/dist/gateway/gateway.d.ts +2 -2
- package/dist/gateway/gateway.js +63 -41
- package/dist/gateway/gateway.js.map +1 -1
- package/dist/gateway/gateway.mjs +63 -41
- 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-Cub7lK-T.d.mts → index-B5k_vUmK.d.mts} +1 -1
- package/dist/{index-BfIxCYIZ.d.ts → index-BOzM6xUq.d.mts} +1 -2
- package/dist/{index-CwAh7Tln.d.mts → index-dRfxUdFA.d.ts} +1 -2
- package/dist/{index-B5Ts1WtM.d.ts → index-y8xToocF.d.ts} +1 -1
- package/dist/index.d.mts +10 -10
- package/dist/index.d.ts +10 -10
- package/dist/index.js +30 -217
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +30 -210
- 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/local-evaluator/evaluator.js +22 -7
- package/dist/local-evaluator/evaluator.js.map +1 -1
- package/dist/local-evaluator/evaluator.mjs +22 -7
- package/dist/local-evaluator/evaluator.mjs.map +1 -1
- package/dist/{mcp-BgBJu4Jl.d.mts → mcp-DgsyQiQq.d.mts} +53 -52
- package/dist/{mcp--DgKOwfu.d.ts → mcp-OosmAcKf.d.ts} +53 -52
- package/dist/{nextjs-DlX6xwbU.d.mts → nextjs-B1sBdEav.d.mts} +1 -1
- package/dist/{nextjs-DL6uE1ye.d.ts → nextjs-DoRmhV_Z.d.ts} +1 -1
- package/dist/registration/index.d.mts +5 -1
- package/dist/registration/index.d.ts +5 -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/sdk-B83N3xKc.d.mts +142 -0
- package/dist/sdk-H_9BTNBS.d.ts +142 -0
- package/dist/transport/index.d.mts +2 -2
- package/dist/transport/index.d.ts +2 -2
- 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-DwSfO7Sb.d.ts → types-BK2POWNc.d.ts} +23 -50
- package/dist/{types-C0zfSXMB.d.mts → types-CJjZvPr9.d.mts} +23 -50
- package/dist/{types-C7Rb-w0d.d.mts → types-CXf3q4kZ.d.ts} +14 -3
- package/dist/{types-nIh3HtuA.d.ts → types-DQmop7ZW.d.mts} +14 -3
- package/dist/ui/index.d.mts +2 -17
- package/dist/ui/index.d.ts +2 -17
- package/dist/ui/index.js +1 -43
- package/dist/ui/index.js.map +1 -1
- package/dist/ui/index.mjs +1 -42
- package/dist/ui/index.mjs.map +1 -1
- package/dist/verify.d.mts +3 -4
- package/dist/verify.d.ts +3 -4
- package/dist/verify.js +8 -28
- package/dist/verify.js.map +1 -1
- package/dist/verify.mjs +8 -28
- package/dist/verify.mjs.map +1 -1
- package/package.json +1 -1
- package/dist/sdk-Bbh9B_dw.d.mts +0 -215
- package/dist/sdk-C6SASmsh.d.ts +0 -215
package/dist/gateway/gateway.mjs
CHANGED
|
@@ -231,9 +231,9 @@ var LocalEvaluator = class {
|
|
|
231
231
|
if (scopeBlock) {
|
|
232
232
|
return { recommendation: "DENY", reason: scopeBlock };
|
|
233
233
|
}
|
|
234
|
-
const
|
|
235
|
-
if (
|
|
236
|
-
return
|
|
234
|
+
const limitDecision = this.checkLimits(context);
|
|
235
|
+
if (limitDecision) {
|
|
236
|
+
return limitDecision;
|
|
237
237
|
}
|
|
238
238
|
if (context.purpose === "sub_agent.spawn" && this.policy.selfInstantiation) {
|
|
239
239
|
if (!this.policy.selfInstantiation.allowed) {
|
|
@@ -298,9 +298,21 @@ var LocalEvaluator = class {
|
|
|
298
298
|
checkLimits(context) {
|
|
299
299
|
const limits = this.policy.limits;
|
|
300
300
|
if (!limits) return null;
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
|
|
301
|
+
const value = context.transactionValue;
|
|
302
|
+
if (value !== void 0 && value > 0 && (limits.autonomousThreshold !== void 0 || limits.maxTransactionAmount !== void 0)) {
|
|
303
|
+
const autonomousThreshold = limits.autonomousThreshold ?? 0;
|
|
304
|
+
const hardLimit = limits.maxTransactionAmount ?? limits.autonomousThreshold ?? 0;
|
|
305
|
+
if (value > autonomousThreshold) {
|
|
306
|
+
if (value >= hardLimit) {
|
|
307
|
+
return {
|
|
308
|
+
recommendation: "DENY",
|
|
309
|
+
reason: `Transaction value ${value} at or above Hard Limit ${hardLimit}`
|
|
310
|
+
};
|
|
311
|
+
}
|
|
312
|
+
return {
|
|
313
|
+
recommendation: "MANUAL_REVIEW",
|
|
314
|
+
reason: `Transaction value ${value} is in the human-approval band (${autonomousThreshold}, ${hardLimit})`
|
|
315
|
+
};
|
|
304
316
|
}
|
|
305
317
|
}
|
|
306
318
|
if (limits.maxRequestsPerHour !== void 0) {
|
|
@@ -313,7 +325,10 @@ var LocalEvaluator = class {
|
|
|
313
325
|
} else {
|
|
314
326
|
entry.count++;
|
|
315
327
|
if (entry.count > limits.maxRequestsPerHour) {
|
|
316
|
-
return
|
|
328
|
+
return {
|
|
329
|
+
recommendation: "DENY",
|
|
330
|
+
reason: `Rate limit exceeded: ${entry.count}/${limits.maxRequestsPerHour} requests per hour`
|
|
331
|
+
};
|
|
317
332
|
}
|
|
318
333
|
}
|
|
319
334
|
}
|
|
@@ -3522,10 +3537,16 @@ function validatePurpose(purpose, path) {
|
|
|
3522
3537
|
errors.push({ path: `${path}.targets`, message: "targets must be an array of strings" });
|
|
3523
3538
|
}
|
|
3524
3539
|
if (p.blockedPatterns !== void 0 && !isStringArray(p.blockedPatterns)) {
|
|
3525
|
-
errors.push({
|
|
3540
|
+
errors.push({
|
|
3541
|
+
path: `${path}.blockedPatterns`,
|
|
3542
|
+
message: "blockedPatterns must be an array of strings"
|
|
3543
|
+
});
|
|
3526
3544
|
}
|
|
3527
3545
|
if (p.requiresApproval !== void 0 && typeof p.requiresApproval !== "boolean") {
|
|
3528
|
-
errors.push({
|
|
3546
|
+
errors.push({
|
|
3547
|
+
path: `${path}.requiresApproval`,
|
|
3548
|
+
message: "requiresApproval must be a boolean"
|
|
3549
|
+
});
|
|
3529
3550
|
}
|
|
3530
3551
|
return errors;
|
|
3531
3552
|
}
|
|
@@ -3548,11 +3569,29 @@ function validateLimits(limits, path) {
|
|
|
3548
3569
|
return [{ path, message: "limits must be an object" }];
|
|
3549
3570
|
}
|
|
3550
3571
|
const l = limits;
|
|
3572
|
+
if (l.autonomousThreshold !== void 0 && typeof l.autonomousThreshold !== "number") {
|
|
3573
|
+
errors.push({
|
|
3574
|
+
path: `${path}.autonomousThreshold`,
|
|
3575
|
+
message: "autonomousThreshold must be a number"
|
|
3576
|
+
});
|
|
3577
|
+
}
|
|
3551
3578
|
if (l.maxTransactionAmount !== void 0 && typeof l.maxTransactionAmount !== "number") {
|
|
3552
|
-
errors.push({
|
|
3579
|
+
errors.push({
|
|
3580
|
+
path: `${path}.maxTransactionAmount`,
|
|
3581
|
+
message: "maxTransactionAmount must be a number"
|
|
3582
|
+
});
|
|
3583
|
+
}
|
|
3584
|
+
if (typeof l.autonomousThreshold === "number" && typeof l.maxTransactionAmount === "number" && l.autonomousThreshold > l.maxTransactionAmount) {
|
|
3585
|
+
errors.push({
|
|
3586
|
+
path: `${path}.autonomousThreshold`,
|
|
3587
|
+
message: "autonomousThreshold (Autonomous Limit) must be <= maxTransactionAmount (Hard Limit)"
|
|
3588
|
+
});
|
|
3553
3589
|
}
|
|
3554
3590
|
if (l.maxRequestsPerHour !== void 0 && typeof l.maxRequestsPerHour !== "number") {
|
|
3555
|
-
errors.push({
|
|
3591
|
+
errors.push({
|
|
3592
|
+
path: `${path}.maxRequestsPerHour`,
|
|
3593
|
+
message: "maxRequestsPerHour must be a number"
|
|
3594
|
+
});
|
|
3556
3595
|
}
|
|
3557
3596
|
if (l.currency !== void 0 && typeof l.currency !== "string") {
|
|
3558
3597
|
errors.push({ path: `${path}.currency`, message: "currency must be a string" });
|
|
@@ -3567,7 +3606,10 @@ function validateRiskThresholds(thresholds, path) {
|
|
|
3567
3606
|
const t = thresholds;
|
|
3568
3607
|
for (const range of ["autoAllow", "requireApproval", "autoBlock"]) {
|
|
3569
3608
|
if (!t[range] || typeof t[range] !== "object") {
|
|
3570
|
-
errors.push({
|
|
3609
|
+
errors.push({
|
|
3610
|
+
path: `${path}.${range}`,
|
|
3611
|
+
message: `${range} is required and must be an object with min and max`
|
|
3612
|
+
});
|
|
3571
3613
|
continue;
|
|
3572
3614
|
}
|
|
3573
3615
|
const r = t[range];
|
|
@@ -3663,7 +3705,7 @@ function verifyLocal(evaluator, context) {
|
|
|
3663
3705
|
return evaluator.evaluate(context);
|
|
3664
3706
|
}
|
|
3665
3707
|
|
|
3666
|
-
// src/
|
|
3708
|
+
// src/trust-levels.ts
|
|
3667
3709
|
function getTrustLevel(score) {
|
|
3668
3710
|
if (score >= 80) return "PLATINUM";
|
|
3669
3711
|
if (score >= 60) return "GOLD";
|
|
@@ -3672,7 +3714,7 @@ function getTrustLevel(score) {
|
|
|
3672
3714
|
}
|
|
3673
3715
|
|
|
3674
3716
|
// src/version.ts
|
|
3675
|
-
var SDK_VERSION = "
|
|
3717
|
+
var SDK_VERSION = "5.0.0";
|
|
3676
3718
|
|
|
3677
3719
|
// src/http.ts
|
|
3678
3720
|
var SDK_USER_AGENT = `astrasync-sdk/${SDK_VERSION}`;
|
|
@@ -3702,11 +3744,6 @@ function getCachedWellKnownUrls(apiBaseUrl) {
|
|
|
3702
3744
|
// src/verify.ts
|
|
3703
3745
|
var DEFAULT_CONFIG = {
|
|
3704
3746
|
apiBaseUrl: "https://astrasync.ai/api",
|
|
3705
|
-
// v2.3.9 (defect #30): default for unconfigured callers is `'none'` (no
|
|
3706
|
-
// access). Pre-rename this defaulted to `'guidance'`, which combined with
|
|
3707
|
-
// a route gated at `'guidance'` to silently let unverified traffic
|
|
3708
|
-
// through (`hasMinimumAccess('guidance', 'guidance') === true`).
|
|
3709
|
-
defaultAccessLevel: "none",
|
|
3710
3747
|
// minTrustScore + minTrustScoreForFull deprecated in v2.3.0 — server decides.
|
|
3711
3748
|
// cacheTtl deliberately unset. When undefined, cacheResult applies the 60s
|
|
3712
3749
|
// default; the caller's explicit value is honoured for cacheable results.
|
|
@@ -3867,13 +3904,6 @@ function createGuidanceResponse(_config, reason, options = {}) {
|
|
|
3867
3904
|
// policy is not evaluated (we never reached the gate).
|
|
3868
3905
|
identityVerified: false,
|
|
3869
3906
|
policyAllowed: false,
|
|
3870
|
-
// v2.3.9 (defect #30): denials grant `'none'`, NEVER a positive band.
|
|
3871
|
-
// Adapters additionally short-circuit on `!identityVerified ||
|
|
3872
|
-
// !policyAllowed` before the gate check, but the access level still has
|
|
3873
|
-
// to be honest at the data layer so downstream consumers (SDK adapters
|
|
3874
|
-
// in other languages, custom integrations) inherit the correct
|
|
3875
|
-
// semantics.
|
|
3876
|
-
accessLevel: "none",
|
|
3877
3907
|
guidance,
|
|
3878
3908
|
denialReasons: reason ? [reason] : ["No valid agent credentials provided"],
|
|
3879
3909
|
// Round-10 (#47, O5): on API-error fallback, surface a typed failure so
|
|
@@ -3896,6 +3926,11 @@ function createGuidanceResponse(_config, reason, options = {}) {
|
|
|
3896
3926
|
// 4.0.0: typed marker so adapters render the misconfig envelope (503 +
|
|
3897
3927
|
// MERCHANT_VERIFICATION_MISCONFIGURED) without string-matching.
|
|
3898
3928
|
...isMisconfig && { misconfigured: true },
|
|
3929
|
+
// 4.6.0: a transient api_error is retryable — mark it so consumers surface
|
|
3930
|
+
// "temporarily unavailable, retry" (recommendation 'error') instead of
|
|
3931
|
+
// coercing the absent recommendation to a policy 'deny'. Misconfig is
|
|
3932
|
+
// deterministic and intentionally NOT marked retryable.
|
|
3933
|
+
...isApiError && { retryable: true },
|
|
3899
3934
|
correlationId: options.correlationId,
|
|
3900
3935
|
attemptId: options.attemptId,
|
|
3901
3936
|
verifiedAt: /* @__PURE__ */ new Date()
|
|
@@ -3962,7 +3997,6 @@ async function callVerifyAccessAPI(config, request) {
|
|
|
3962
3997
|
attemptId: typeof data?.attemptId === "string" ? data.attemptId : void 0,
|
|
3963
3998
|
access: {
|
|
3964
3999
|
allowed: false,
|
|
3965
|
-
accessLevel: "none",
|
|
3966
4000
|
reason: "endpoint_deactivated",
|
|
3967
4001
|
failures: [
|
|
3968
4002
|
{
|
|
@@ -4025,7 +4059,7 @@ async function verify(config, request, options) {
|
|
|
4025
4059
|
if (!deprecationWarningShown && (config.minTrustScore !== void 0 || config.minTrustScoreForFull !== void 0)) {
|
|
4026
4060
|
deprecationWarningShown = true;
|
|
4027
4061
|
console.warn(
|
|
4028
|
-
"[VerificationGateway] minTrustScore / minTrustScoreForFull are deprecated in v2.3.0 and have no effect. Server is now the single source of truth for access
|
|
4062
|
+
"[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."
|
|
4029
4063
|
);
|
|
4030
4064
|
}
|
|
4031
4065
|
if (mergedConfig.cacheTtl !== 0 && !options?.bypassCache) {
|
|
@@ -4071,14 +4105,6 @@ async function verify(config, request, options) {
|
|
|
4071
4105
|
const result2 = {
|
|
4072
4106
|
identityVerified: idVerifiedFromBackend,
|
|
4073
4107
|
policyAllowed: false,
|
|
4074
|
-
// v2.3.9 (defect #30): denials grant `'none'`, NEVER a positive band.
|
|
4075
|
-
// Pre-rename this hardcoded `'guidance'`, which conflated with the
|
|
4076
|
-
// colocated `guidance: {...}` help-payload object below and let
|
|
4077
|
-
// denied requests pass any route gated at `'guidance'` because
|
|
4078
|
-
// `hasMinimumAccess('guidance', 'guidance') === true`. Adapters now
|
|
4079
|
-
// ALSO short-circuit on `!identityVerified || !policyAllowed` before
|
|
4080
|
-
// the gate check — belt-and-braces.
|
|
4081
|
-
accessLevel: "none",
|
|
4082
4108
|
// 3.6.0: the server now emits top-level denialReasons on every deny
|
|
4083
4109
|
// path — prefer it verbatim; the failure-message reconstruction remains
|
|
4084
4110
|
// as the fallback for older backends.
|
|
@@ -4127,7 +4153,6 @@ async function verify(config, request, options) {
|
|
|
4127
4153
|
trustScore: apiResponse.organization.trustScore
|
|
4128
4154
|
} : void 0;
|
|
4129
4155
|
const verificationContext = apiResponse.verificationContext;
|
|
4130
|
-
const accessLevel = apiResponse.access?.accessLevel ?? "standard";
|
|
4131
4156
|
const result = {
|
|
4132
4157
|
// 4.5.0 (probe F1): read idVerified from verificationContext with the
|
|
4133
4158
|
// SAME absent⇒false default as the deny branch. The previous `!== false`
|
|
@@ -4139,7 +4164,6 @@ async function verify(config, request, options) {
|
|
|
4139
4164
|
// this load-bearing must never be defaulted on.
|
|
4140
4165
|
identityVerified: apiResponse.verificationContext?.idVerified === true,
|
|
4141
4166
|
policyAllowed: true,
|
|
4142
|
-
accessLevel,
|
|
4143
4167
|
agent,
|
|
4144
4168
|
developer,
|
|
4145
4169
|
organization,
|
|
@@ -4166,7 +4190,6 @@ async function verify(config, request, options) {
|
|
|
4166
4190
|
};
|
|
4167
4191
|
if (result.recommendation === "deny") {
|
|
4168
4192
|
result.policyAllowed = false;
|
|
4169
|
-
result.accessLevel = "none";
|
|
4170
4193
|
result.denialReasons = serverDenialReasons ?? result.recommendationReasons ?? ["Access denied by AstraSync recommendation"];
|
|
4171
4194
|
result.guidance = result.runtimeChallenge ? {
|
|
4172
4195
|
message: `Verification failed: ${result.runtimeChallenge.reason || "runtime challenge failed"}`,
|
|
@@ -4282,7 +4305,6 @@ function toGatewayConfig(config) {
|
|
|
4282
4305
|
return {
|
|
4283
4306
|
apiBaseUrl: config.apiBaseUrl || "https://api.astrasync.ai",
|
|
4284
4307
|
apiKey: config.apiKey,
|
|
4285
|
-
defaultAccessLevel: config.defaultAccessLevel,
|
|
4286
4308
|
minTrustScore: config.minTrustScore,
|
|
4287
4309
|
minTrustScoreForFull: config.minTrustScoreForFull,
|
|
4288
4310
|
cacheTtl: config.cacheTtl,
|
|
@@ -4310,7 +4332,7 @@ function toDecision(result) {
|
|
|
4310
4332
|
if (result.identityVerified && result.policyAllowed) {
|
|
4311
4333
|
return {
|
|
4312
4334
|
recommendation: "ALLOW",
|
|
4313
|
-
reason: `Verified
|
|
4335
|
+
reason: result.agent?.trustScore ? `Verified (trust score ${result.agent.trustScore})` : "Verified",
|
|
4314
4336
|
trustScore: result.agent?.trustScore,
|
|
4315
4337
|
sessionId: "sessionId" in result ? result.sessionId : void 0
|
|
4316
4338
|
};
|