@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/codex/index.mjs
CHANGED
|
@@ -514,9 +514,9 @@ var LocalEvaluator = class {
|
|
|
514
514
|
if (scopeBlock) {
|
|
515
515
|
return { recommendation: "DENY", reason: scopeBlock };
|
|
516
516
|
}
|
|
517
|
-
const
|
|
518
|
-
if (
|
|
519
|
-
return
|
|
517
|
+
const limitDecision = this.checkLimits(context);
|
|
518
|
+
if (limitDecision) {
|
|
519
|
+
return limitDecision;
|
|
520
520
|
}
|
|
521
521
|
if (context.purpose === "sub_agent.spawn" && this.policy.selfInstantiation) {
|
|
522
522
|
if (!this.policy.selfInstantiation.allowed) {
|
|
@@ -581,9 +581,21 @@ var LocalEvaluator = class {
|
|
|
581
581
|
checkLimits(context) {
|
|
582
582
|
const limits = this.policy.limits;
|
|
583
583
|
if (!limits) return null;
|
|
584
|
-
|
|
585
|
-
|
|
586
|
-
|
|
584
|
+
const value = context.transactionValue;
|
|
585
|
+
if (value !== void 0 && value > 0 && (limits.autonomousThreshold !== void 0 || limits.maxTransactionAmount !== void 0)) {
|
|
586
|
+
const autonomousThreshold = limits.autonomousThreshold ?? 0;
|
|
587
|
+
const hardLimit = limits.maxTransactionAmount ?? limits.autonomousThreshold ?? 0;
|
|
588
|
+
if (value > autonomousThreshold) {
|
|
589
|
+
if (value >= hardLimit) {
|
|
590
|
+
return {
|
|
591
|
+
recommendation: "DENY",
|
|
592
|
+
reason: `Transaction value ${value} at or above Hard Limit ${hardLimit}`
|
|
593
|
+
};
|
|
594
|
+
}
|
|
595
|
+
return {
|
|
596
|
+
recommendation: "MANUAL_REVIEW",
|
|
597
|
+
reason: `Transaction value ${value} is in the human-approval band (${autonomousThreshold}, ${hardLimit})`
|
|
598
|
+
};
|
|
587
599
|
}
|
|
588
600
|
}
|
|
589
601
|
if (limits.maxRequestsPerHour !== void 0) {
|
|
@@ -596,7 +608,10 @@ var LocalEvaluator = class {
|
|
|
596
608
|
} else {
|
|
597
609
|
entry.count++;
|
|
598
610
|
if (entry.count > limits.maxRequestsPerHour) {
|
|
599
|
-
return
|
|
611
|
+
return {
|
|
612
|
+
recommendation: "DENY",
|
|
613
|
+
reason: `Rate limit exceeded: ${entry.count}/${limits.maxRequestsPerHour} requests per hour`
|
|
614
|
+
};
|
|
600
615
|
}
|
|
601
616
|
}
|
|
602
617
|
}
|
|
@@ -3805,10 +3820,16 @@ function validatePurpose(purpose, path) {
|
|
|
3805
3820
|
errors.push({ path: `${path}.targets`, message: "targets must be an array of strings" });
|
|
3806
3821
|
}
|
|
3807
3822
|
if (p.blockedPatterns !== void 0 && !isStringArray(p.blockedPatterns)) {
|
|
3808
|
-
errors.push({
|
|
3823
|
+
errors.push({
|
|
3824
|
+
path: `${path}.blockedPatterns`,
|
|
3825
|
+
message: "blockedPatterns must be an array of strings"
|
|
3826
|
+
});
|
|
3809
3827
|
}
|
|
3810
3828
|
if (p.requiresApproval !== void 0 && typeof p.requiresApproval !== "boolean") {
|
|
3811
|
-
errors.push({
|
|
3829
|
+
errors.push({
|
|
3830
|
+
path: `${path}.requiresApproval`,
|
|
3831
|
+
message: "requiresApproval must be a boolean"
|
|
3832
|
+
});
|
|
3812
3833
|
}
|
|
3813
3834
|
return errors;
|
|
3814
3835
|
}
|
|
@@ -3831,11 +3852,29 @@ function validateLimits(limits, path) {
|
|
|
3831
3852
|
return [{ path, message: "limits must be an object" }];
|
|
3832
3853
|
}
|
|
3833
3854
|
const l = limits;
|
|
3855
|
+
if (l.autonomousThreshold !== void 0 && typeof l.autonomousThreshold !== "number") {
|
|
3856
|
+
errors.push({
|
|
3857
|
+
path: `${path}.autonomousThreshold`,
|
|
3858
|
+
message: "autonomousThreshold must be a number"
|
|
3859
|
+
});
|
|
3860
|
+
}
|
|
3834
3861
|
if (l.maxTransactionAmount !== void 0 && typeof l.maxTransactionAmount !== "number") {
|
|
3835
|
-
errors.push({
|
|
3862
|
+
errors.push({
|
|
3863
|
+
path: `${path}.maxTransactionAmount`,
|
|
3864
|
+
message: "maxTransactionAmount must be a number"
|
|
3865
|
+
});
|
|
3866
|
+
}
|
|
3867
|
+
if (typeof l.autonomousThreshold === "number" && typeof l.maxTransactionAmount === "number" && l.autonomousThreshold > l.maxTransactionAmount) {
|
|
3868
|
+
errors.push({
|
|
3869
|
+
path: `${path}.autonomousThreshold`,
|
|
3870
|
+
message: "autonomousThreshold (Autonomous Limit) must be <= maxTransactionAmount (Hard Limit)"
|
|
3871
|
+
});
|
|
3836
3872
|
}
|
|
3837
3873
|
if (l.maxRequestsPerHour !== void 0 && typeof l.maxRequestsPerHour !== "number") {
|
|
3838
|
-
errors.push({
|
|
3874
|
+
errors.push({
|
|
3875
|
+
path: `${path}.maxRequestsPerHour`,
|
|
3876
|
+
message: "maxRequestsPerHour must be a number"
|
|
3877
|
+
});
|
|
3839
3878
|
}
|
|
3840
3879
|
if (l.currency !== void 0 && typeof l.currency !== "string") {
|
|
3841
3880
|
errors.push({ path: `${path}.currency`, message: "currency must be a string" });
|
|
@@ -3850,7 +3889,10 @@ function validateRiskThresholds(thresholds, path) {
|
|
|
3850
3889
|
const t = thresholds;
|
|
3851
3890
|
for (const range of ["autoAllow", "requireApproval", "autoBlock"]) {
|
|
3852
3891
|
if (!t[range] || typeof t[range] !== "object") {
|
|
3853
|
-
errors.push({
|
|
3892
|
+
errors.push({
|
|
3893
|
+
path: `${path}.${range}`,
|
|
3894
|
+
message: `${range} is required and must be an object with min and max`
|
|
3895
|
+
});
|
|
3854
3896
|
continue;
|
|
3855
3897
|
}
|
|
3856
3898
|
const r = t[range];
|
|
@@ -3946,7 +3988,7 @@ function verifyLocal(evaluator, context) {
|
|
|
3946
3988
|
return evaluator.evaluate(context);
|
|
3947
3989
|
}
|
|
3948
3990
|
|
|
3949
|
-
// src/
|
|
3991
|
+
// src/trust-levels.ts
|
|
3950
3992
|
function getTrustLevel(score) {
|
|
3951
3993
|
if (score >= 80) return "PLATINUM";
|
|
3952
3994
|
if (score >= 60) return "GOLD";
|
|
@@ -3955,7 +3997,7 @@ function getTrustLevel(score) {
|
|
|
3955
3997
|
}
|
|
3956
3998
|
|
|
3957
3999
|
// src/version.ts
|
|
3958
|
-
var SDK_VERSION = "
|
|
4000
|
+
var SDK_VERSION = "5.0.0";
|
|
3959
4001
|
|
|
3960
4002
|
// src/http.ts
|
|
3961
4003
|
var SDK_USER_AGENT = `astrasync-sdk/${SDK_VERSION}`;
|
|
@@ -3985,11 +4027,6 @@ function getCachedWellKnownUrls(apiBaseUrl) {
|
|
|
3985
4027
|
// src/verify.ts
|
|
3986
4028
|
var DEFAULT_CONFIG = {
|
|
3987
4029
|
apiBaseUrl: "https://astrasync.ai/api",
|
|
3988
|
-
// v2.3.9 (defect #30): default for unconfigured callers is `'none'` (no
|
|
3989
|
-
// access). Pre-rename this defaulted to `'guidance'`, which combined with
|
|
3990
|
-
// a route gated at `'guidance'` to silently let unverified traffic
|
|
3991
|
-
// through (`hasMinimumAccess('guidance', 'guidance') === true`).
|
|
3992
|
-
defaultAccessLevel: "none",
|
|
3993
4030
|
// minTrustScore + minTrustScoreForFull deprecated in v2.3.0 — server decides.
|
|
3994
4031
|
// cacheTtl deliberately unset. When undefined, cacheResult applies the 60s
|
|
3995
4032
|
// default; the caller's explicit value is honoured for cacheable results.
|
|
@@ -4150,13 +4187,6 @@ function createGuidanceResponse(_config, reason, options = {}) {
|
|
|
4150
4187
|
// policy is not evaluated (we never reached the gate).
|
|
4151
4188
|
identityVerified: false,
|
|
4152
4189
|
policyAllowed: false,
|
|
4153
|
-
// v2.3.9 (defect #30): denials grant `'none'`, NEVER a positive band.
|
|
4154
|
-
// Adapters additionally short-circuit on `!identityVerified ||
|
|
4155
|
-
// !policyAllowed` before the gate check, but the access level still has
|
|
4156
|
-
// to be honest at the data layer so downstream consumers (SDK adapters
|
|
4157
|
-
// in other languages, custom integrations) inherit the correct
|
|
4158
|
-
// semantics.
|
|
4159
|
-
accessLevel: "none",
|
|
4160
4190
|
guidance,
|
|
4161
4191
|
denialReasons: reason ? [reason] : ["No valid agent credentials provided"],
|
|
4162
4192
|
// Round-10 (#47, O5): on API-error fallback, surface a typed failure so
|
|
@@ -4179,6 +4209,11 @@ function createGuidanceResponse(_config, reason, options = {}) {
|
|
|
4179
4209
|
// 4.0.0: typed marker so adapters render the misconfig envelope (503 +
|
|
4180
4210
|
// MERCHANT_VERIFICATION_MISCONFIGURED) without string-matching.
|
|
4181
4211
|
...isMisconfig && { misconfigured: true },
|
|
4212
|
+
// 4.6.0: a transient api_error is retryable — mark it so consumers surface
|
|
4213
|
+
// "temporarily unavailable, retry" (recommendation 'error') instead of
|
|
4214
|
+
// coercing the absent recommendation to a policy 'deny'. Misconfig is
|
|
4215
|
+
// deterministic and intentionally NOT marked retryable.
|
|
4216
|
+
...isApiError && { retryable: true },
|
|
4182
4217
|
correlationId: options.correlationId,
|
|
4183
4218
|
attemptId: options.attemptId,
|
|
4184
4219
|
verifiedAt: /* @__PURE__ */ new Date()
|
|
@@ -4245,7 +4280,6 @@ async function callVerifyAccessAPI(config, request) {
|
|
|
4245
4280
|
attemptId: typeof data?.attemptId === "string" ? data.attemptId : void 0,
|
|
4246
4281
|
access: {
|
|
4247
4282
|
allowed: false,
|
|
4248
|
-
accessLevel: "none",
|
|
4249
4283
|
reason: "endpoint_deactivated",
|
|
4250
4284
|
failures: [
|
|
4251
4285
|
{
|
|
@@ -4308,7 +4342,7 @@ async function verify(config, request, options) {
|
|
|
4308
4342
|
if (!deprecationWarningShown && (config.minTrustScore !== void 0 || config.minTrustScoreForFull !== void 0)) {
|
|
4309
4343
|
deprecationWarningShown = true;
|
|
4310
4344
|
console.warn(
|
|
4311
|
-
"[VerificationGateway] minTrustScore / minTrustScoreForFull are deprecated in v2.3.0 and have no effect. Server is now the single source of truth for access
|
|
4345
|
+
"[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."
|
|
4312
4346
|
);
|
|
4313
4347
|
}
|
|
4314
4348
|
if (mergedConfig.cacheTtl !== 0 && !options?.bypassCache) {
|
|
@@ -4354,14 +4388,6 @@ async function verify(config, request, options) {
|
|
|
4354
4388
|
const result2 = {
|
|
4355
4389
|
identityVerified: idVerifiedFromBackend,
|
|
4356
4390
|
policyAllowed: false,
|
|
4357
|
-
// v2.3.9 (defect #30): denials grant `'none'`, NEVER a positive band.
|
|
4358
|
-
// Pre-rename this hardcoded `'guidance'`, which conflated with the
|
|
4359
|
-
// colocated `guidance: {...}` help-payload object below and let
|
|
4360
|
-
// denied requests pass any route gated at `'guidance'` because
|
|
4361
|
-
// `hasMinimumAccess('guidance', 'guidance') === true`. Adapters now
|
|
4362
|
-
// ALSO short-circuit on `!identityVerified || !policyAllowed` before
|
|
4363
|
-
// the gate check — belt-and-braces.
|
|
4364
|
-
accessLevel: "none",
|
|
4365
4391
|
// 3.6.0: the server now emits top-level denialReasons on every deny
|
|
4366
4392
|
// path — prefer it verbatim; the failure-message reconstruction remains
|
|
4367
4393
|
// as the fallback for older backends.
|
|
@@ -4410,7 +4436,6 @@ async function verify(config, request, options) {
|
|
|
4410
4436
|
trustScore: apiResponse.organization.trustScore
|
|
4411
4437
|
} : void 0;
|
|
4412
4438
|
const verificationContext = apiResponse.verificationContext;
|
|
4413
|
-
const accessLevel = apiResponse.access?.accessLevel ?? "standard";
|
|
4414
4439
|
const result = {
|
|
4415
4440
|
// 4.5.0 (probe F1): read idVerified from verificationContext with the
|
|
4416
4441
|
// SAME absent⇒false default as the deny branch. The previous `!== false`
|
|
@@ -4422,7 +4447,6 @@ async function verify(config, request, options) {
|
|
|
4422
4447
|
// this load-bearing must never be defaulted on.
|
|
4423
4448
|
identityVerified: apiResponse.verificationContext?.idVerified === true,
|
|
4424
4449
|
policyAllowed: true,
|
|
4425
|
-
accessLevel,
|
|
4426
4450
|
agent,
|
|
4427
4451
|
developer,
|
|
4428
4452
|
organization,
|
|
@@ -4449,7 +4473,6 @@ async function verify(config, request, options) {
|
|
|
4449
4473
|
};
|
|
4450
4474
|
if (result.recommendation === "deny") {
|
|
4451
4475
|
result.policyAllowed = false;
|
|
4452
|
-
result.accessLevel = "none";
|
|
4453
4476
|
result.denialReasons = serverDenialReasons ?? result.recommendationReasons ?? ["Access denied by AstraSync recommendation"];
|
|
4454
4477
|
result.guidance = result.runtimeChallenge ? {
|
|
4455
4478
|
message: `Verification failed: ${result.runtimeChallenge.reason || "runtime challenge failed"}`,
|
|
@@ -4565,7 +4588,6 @@ function toGatewayConfig(config) {
|
|
|
4565
4588
|
return {
|
|
4566
4589
|
apiBaseUrl: config.apiBaseUrl || "https://api.astrasync.ai",
|
|
4567
4590
|
apiKey: config.apiKey,
|
|
4568
|
-
defaultAccessLevel: config.defaultAccessLevel,
|
|
4569
4591
|
minTrustScore: config.minTrustScore,
|
|
4570
4592
|
minTrustScoreForFull: config.minTrustScoreForFull,
|
|
4571
4593
|
cacheTtl: config.cacheTtl,
|
|
@@ -4593,7 +4615,7 @@ function toDecision(result) {
|
|
|
4593
4615
|
if (result.identityVerified && result.policyAllowed) {
|
|
4594
4616
|
return {
|
|
4595
4617
|
recommendation: "ALLOW",
|
|
4596
|
-
reason: `Verified
|
|
4618
|
+
reason: result.agent?.trustScore ? `Verified (trust score ${result.agent.trustScore})` : "Verified",
|
|
4597
4619
|
trustScore: result.agent?.trustScore,
|
|
4598
4620
|
sessionId: "sessionId" in result ? result.sessionId : void 0
|
|
4599
4621
|
};
|