@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.
Files changed (140) hide show
  1. package/README.md +1 -1
  2. package/dist/adapter-interface/interface.d.mts +2 -2
  3. package/dist/adapter-interface/interface.d.ts +2 -2
  4. package/dist/adapters/express.d.mts +2 -2
  5. package/dist/adapters/express.d.ts +2 -2
  6. package/dist/adapters/express.js +11 -33
  7. package/dist/adapters/express.js.map +1 -1
  8. package/dist/adapters/express.mjs +11 -33
  9. package/dist/adapters/express.mjs.map +1 -1
  10. package/dist/adapters/mcp.d.mts +2 -2
  11. package/dist/adapters/mcp.d.ts +2 -2
  12. package/dist/adapters/mcp.js +28 -65
  13. package/dist/adapters/mcp.js.map +1 -1
  14. package/dist/adapters/mcp.mjs +27 -64
  15. package/dist/adapters/mcp.mjs.map +1 -1
  16. package/dist/adapters/nextjs.d.mts +2 -2
  17. package/dist/adapters/nextjs.d.ts +2 -2
  18. package/dist/adapters/nextjs.js +9 -30
  19. package/dist/adapters/nextjs.js.map +1 -1
  20. package/dist/adapters/nextjs.mjs +9 -30
  21. package/dist/adapters/nextjs.mjs.map +1 -1
  22. package/dist/adapters/sdk.d.mts +2 -2
  23. package/dist/adapters/sdk.d.ts +2 -2
  24. package/dist/adapters/sdk.js +8 -124
  25. package/dist/adapters/sdk.js.map +1 -1
  26. package/dist/adapters/sdk.mjs +8 -122
  27. package/dist/adapters/sdk.mjs.map +1 -1
  28. package/dist/agent/index.d.mts +2 -2
  29. package/dist/agent/index.d.ts +2 -2
  30. package/dist/agent/index.js +1 -1
  31. package/dist/agent/index.js.map +1 -1
  32. package/dist/agent/index.mjs +1 -1
  33. package/dist/agent/index.mjs.map +1 -1
  34. package/dist/bin/astrasync-claude-hook.js +63 -41
  35. package/dist/bin/astrasync-codex-hook.js +63 -41
  36. package/dist/bin/astrasync-guard.js +63 -41
  37. package/dist/bin/astrasync.js +75 -48
  38. package/dist/browser/background.js +63 -41
  39. package/dist/browser/background.js.map +1 -1
  40. package/dist/browser/background.mjs +63 -41
  41. package/dist/browser/background.mjs.map +1 -1
  42. package/dist/browser/browser-adapter.d.mts +2 -2
  43. package/dist/browser/browser-adapter.d.ts +2 -2
  44. package/dist/claude-code/claude-code-adapter.d.mts +2 -2
  45. package/dist/claude-code/claude-code-adapter.d.ts +2 -2
  46. package/dist/cli/index.d.mts +2 -2
  47. package/dist/cli/index.d.ts +2 -2
  48. package/dist/cli/index.js +33 -6
  49. package/dist/cli/index.js.map +1 -1
  50. package/dist/cli/index.mjs +33 -6
  51. package/dist/cli/index.mjs.map +1 -1
  52. package/dist/codex/index.d.mts +2 -2
  53. package/dist/codex/index.d.ts +2 -2
  54. package/dist/codex/index.js +63 -41
  55. package/dist/codex/index.js.map +1 -1
  56. package/dist/codex/index.mjs +63 -41
  57. package/dist/codex/index.mjs.map +1 -1
  58. package/dist/cursor/cursor-adapter.d.mts +2 -2
  59. package/dist/cursor/cursor-adapter.d.ts +2 -2
  60. package/dist/cursor/extension.d.mts +2 -2
  61. package/dist/cursor/extension.d.ts +2 -2
  62. package/dist/cursor/extension.js +63 -41
  63. package/dist/cursor/extension.js.map +1 -1
  64. package/dist/cursor/extension.mjs +63 -41
  65. package/dist/cursor/extension.mjs.map +1 -1
  66. package/dist/edge-config.d.mts +1 -1
  67. package/dist/edge-config.d.ts +1 -1
  68. package/dist/edge-config.js +1 -1
  69. package/dist/edge-config.js.map +1 -1
  70. package/dist/edge-config.mjs +1 -1
  71. package/dist/edge-config.mjs.map +1 -1
  72. package/dist/edge-core/index.d.mts +1 -3
  73. package/dist/edge-core/index.d.ts +1 -3
  74. package/dist/edge-core/index.js +11 -33
  75. package/dist/edge-core/index.js.map +1 -1
  76. package/dist/edge-core/index.mjs +11 -33
  77. package/dist/edge-core/index.mjs.map +1 -1
  78. package/dist/{express-DaqL11tx.d.ts → express-B5lWuemA.d.ts} +1 -1
  79. package/dist/{express-CR6F3njD.d.mts → express-Dm-snUuY.d.mts} +1 -1
  80. package/dist/gateway/gateway.d.mts +2 -2
  81. package/dist/gateway/gateway.d.ts +2 -2
  82. package/dist/gateway/gateway.js +63 -41
  83. package/dist/gateway/gateway.js.map +1 -1
  84. package/dist/gateway/gateway.mjs +63 -41
  85. package/dist/gateway/gateway.mjs.map +1 -1
  86. package/dist/git-trigger/git-hooks.d.mts +2 -2
  87. package/dist/git-trigger/git-hooks.d.ts +2 -2
  88. package/dist/{index-Cub7lK-T.d.mts → index-B5k_vUmK.d.mts} +1 -1
  89. package/dist/{index-BfIxCYIZ.d.ts → index-BOzM6xUq.d.mts} +1 -2
  90. package/dist/{index-CwAh7Tln.d.mts → index-dRfxUdFA.d.ts} +1 -2
  91. package/dist/{index-B5Ts1WtM.d.ts → index-y8xToocF.d.ts} +1 -1
  92. package/dist/index.d.mts +10 -10
  93. package/dist/index.d.ts +10 -10
  94. package/dist/index.js +30 -217
  95. package/dist/index.js.map +1 -1
  96. package/dist/index.mjs +30 -210
  97. package/dist/index.mjs.map +1 -1
  98. package/dist/local-evaluator/evaluator.d.mts +2 -2
  99. package/dist/local-evaluator/evaluator.d.ts +2 -2
  100. package/dist/local-evaluator/evaluator.js +22 -7
  101. package/dist/local-evaluator/evaluator.js.map +1 -1
  102. package/dist/local-evaluator/evaluator.mjs +22 -7
  103. package/dist/local-evaluator/evaluator.mjs.map +1 -1
  104. package/dist/{mcp-BgBJu4Jl.d.mts → mcp-DgsyQiQq.d.mts} +53 -52
  105. package/dist/{mcp--DgKOwfu.d.ts → mcp-OosmAcKf.d.ts} +53 -52
  106. package/dist/{nextjs-DlX6xwbU.d.mts → nextjs-B1sBdEav.d.mts} +1 -1
  107. package/dist/{nextjs-DL6uE1ye.d.ts → nextjs-DoRmhV_Z.d.ts} +1 -1
  108. package/dist/registration/index.d.mts +5 -1
  109. package/dist/registration/index.d.ts +5 -1
  110. package/dist/registration/index.js +1 -1
  111. package/dist/registration/index.js.map +1 -1
  112. package/dist/registration/index.mjs +1 -1
  113. package/dist/registration/index.mjs.map +1 -1
  114. package/dist/sdk-B83N3xKc.d.mts +142 -0
  115. package/dist/sdk-H_9BTNBS.d.ts +142 -0
  116. package/dist/transport/index.d.mts +2 -2
  117. package/dist/transport/index.d.ts +2 -2
  118. package/dist/transport/index.js +1 -1
  119. package/dist/transport/index.js.map +1 -1
  120. package/dist/transport/index.mjs +1 -1
  121. package/dist/transport/index.mjs.map +1 -1
  122. package/dist/{types-DwSfO7Sb.d.ts → types-BK2POWNc.d.ts} +23 -50
  123. package/dist/{types-C0zfSXMB.d.mts → types-CJjZvPr9.d.mts} +23 -50
  124. package/dist/{types-C7Rb-w0d.d.mts → types-CXf3q4kZ.d.ts} +14 -3
  125. package/dist/{types-nIh3HtuA.d.ts → types-DQmop7ZW.d.mts} +14 -3
  126. package/dist/ui/index.d.mts +2 -17
  127. package/dist/ui/index.d.ts +2 -17
  128. package/dist/ui/index.js +1 -43
  129. package/dist/ui/index.js.map +1 -1
  130. package/dist/ui/index.mjs +1 -42
  131. package/dist/ui/index.mjs.map +1 -1
  132. package/dist/verify.d.mts +3 -4
  133. package/dist/verify.d.ts +3 -4
  134. package/dist/verify.js +8 -28
  135. package/dist/verify.js.map +1 -1
  136. package/dist/verify.mjs +8 -28
  137. package/dist/verify.mjs.map +1 -1
  138. package/package.json +1 -1
  139. package/dist/sdk-Bbh9B_dw.d.mts +0 -215
  140. package/dist/sdk-C6SASmsh.d.ts +0 -215
@@ -231,9 +231,9 @@ var LocalEvaluator = class {
231
231
  if (scopeBlock) {
232
232
  return { recommendation: "DENY", reason: scopeBlock };
233
233
  }
234
- const limitViolation = this.checkLimits(context);
235
- if (limitViolation) {
236
- return { recommendation: "DENY", reason: limitViolation };
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
- if (limits.maxTransactionAmount !== void 0 && context.transactionValue !== void 0) {
302
- if (context.transactionValue > limits.maxTransactionAmount) {
303
- return `Transaction value ${context.transactionValue} exceeds limit ${limits.maxTransactionAmount}`;
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 `Rate limit exceeded: ${entry.count}/${limits.maxRequestsPerHour} requests per hour`;
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({ path: `${path}.blockedPatterns`, message: "blockedPatterns must be an array of strings" });
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({ path: `${path}.requiresApproval`, message: "requiresApproval must be a boolean" });
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({ path: `${path}.maxTransactionAmount`, message: "maxTransactionAmount must be a number" });
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({ path: `${path}.maxRequestsPerHour`, message: "maxRequestsPerHour must be a number" });
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({ path: `${path}.${range}`, message: `${range} is required and must be an object with min and max` });
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/access-levels.ts
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 = "4.5.1";
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-level decisions (the SDK reads access.accessLevel from the verify-access response). To gate access to an endpoint, configure the endpoint's trust_score_requirement server-side."
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 with access level: ${result.accessLevel}`,
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
  };