@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
@@ -474,9 +474,9 @@ var LocalEvaluator = class {
474
474
  if (scopeBlock) {
475
475
  return { recommendation: "DENY", reason: scopeBlock };
476
476
  }
477
- const limitViolation = this.checkLimits(context);
478
- if (limitViolation) {
479
- return { recommendation: "DENY", reason: limitViolation };
477
+ const limitDecision = this.checkLimits(context);
478
+ if (limitDecision) {
479
+ return limitDecision;
480
480
  }
481
481
  if (context.purpose === "sub_agent.spawn" && this.policy.selfInstantiation) {
482
482
  if (!this.policy.selfInstantiation.allowed) {
@@ -541,9 +541,21 @@ var LocalEvaluator = class {
541
541
  checkLimits(context) {
542
542
  const limits = this.policy.limits;
543
543
  if (!limits) return null;
544
- if (limits.maxTransactionAmount !== void 0 && context.transactionValue !== void 0) {
545
- if (context.transactionValue > limits.maxTransactionAmount) {
546
- return `Transaction value ${context.transactionValue} exceeds limit ${limits.maxTransactionAmount}`;
544
+ const value = context.transactionValue;
545
+ if (value !== void 0 && value > 0 && (limits.autonomousThreshold !== void 0 || limits.maxTransactionAmount !== void 0)) {
546
+ const autonomousThreshold = limits.autonomousThreshold ?? 0;
547
+ const hardLimit = limits.maxTransactionAmount ?? limits.autonomousThreshold ?? 0;
548
+ if (value > autonomousThreshold) {
549
+ if (value >= hardLimit) {
550
+ return {
551
+ recommendation: "DENY",
552
+ reason: `Transaction value ${value} at or above Hard Limit ${hardLimit}`
553
+ };
554
+ }
555
+ return {
556
+ recommendation: "MANUAL_REVIEW",
557
+ reason: `Transaction value ${value} is in the human-approval band (${autonomousThreshold}, ${hardLimit})`
558
+ };
547
559
  }
548
560
  }
549
561
  if (limits.maxRequestsPerHour !== void 0) {
@@ -556,7 +568,10 @@ var LocalEvaluator = class {
556
568
  } else {
557
569
  entry.count++;
558
570
  if (entry.count > limits.maxRequestsPerHour) {
559
- return `Rate limit exceeded: ${entry.count}/${limits.maxRequestsPerHour} requests per hour`;
571
+ return {
572
+ recommendation: "DENY",
573
+ reason: `Rate limit exceeded: ${entry.count}/${limits.maxRequestsPerHour} requests per hour`
574
+ };
560
575
  }
561
576
  }
562
577
  }
@@ -3765,10 +3780,16 @@ function validatePurpose(purpose, path) {
3765
3780
  errors.push({ path: `${path}.targets`, message: "targets must be an array of strings" });
3766
3781
  }
3767
3782
  if (p.blockedPatterns !== void 0 && !isStringArray(p.blockedPatterns)) {
3768
- errors.push({ path: `${path}.blockedPatterns`, message: "blockedPatterns must be an array of strings" });
3783
+ errors.push({
3784
+ path: `${path}.blockedPatterns`,
3785
+ message: "blockedPatterns must be an array of strings"
3786
+ });
3769
3787
  }
3770
3788
  if (p.requiresApproval !== void 0 && typeof p.requiresApproval !== "boolean") {
3771
- errors.push({ path: `${path}.requiresApproval`, message: "requiresApproval must be a boolean" });
3789
+ errors.push({
3790
+ path: `${path}.requiresApproval`,
3791
+ message: "requiresApproval must be a boolean"
3792
+ });
3772
3793
  }
3773
3794
  return errors;
3774
3795
  }
@@ -3791,11 +3812,29 @@ function validateLimits(limits, path) {
3791
3812
  return [{ path, message: "limits must be an object" }];
3792
3813
  }
3793
3814
  const l = limits;
3815
+ if (l.autonomousThreshold !== void 0 && typeof l.autonomousThreshold !== "number") {
3816
+ errors.push({
3817
+ path: `${path}.autonomousThreshold`,
3818
+ message: "autonomousThreshold must be a number"
3819
+ });
3820
+ }
3794
3821
  if (l.maxTransactionAmount !== void 0 && typeof l.maxTransactionAmount !== "number") {
3795
- errors.push({ path: `${path}.maxTransactionAmount`, message: "maxTransactionAmount must be a number" });
3822
+ errors.push({
3823
+ path: `${path}.maxTransactionAmount`,
3824
+ message: "maxTransactionAmount must be a number"
3825
+ });
3826
+ }
3827
+ if (typeof l.autonomousThreshold === "number" && typeof l.maxTransactionAmount === "number" && l.autonomousThreshold > l.maxTransactionAmount) {
3828
+ errors.push({
3829
+ path: `${path}.autonomousThreshold`,
3830
+ message: "autonomousThreshold (Autonomous Limit) must be <= maxTransactionAmount (Hard Limit)"
3831
+ });
3796
3832
  }
3797
3833
  if (l.maxRequestsPerHour !== void 0 && typeof l.maxRequestsPerHour !== "number") {
3798
- errors.push({ path: `${path}.maxRequestsPerHour`, message: "maxRequestsPerHour must be a number" });
3834
+ errors.push({
3835
+ path: `${path}.maxRequestsPerHour`,
3836
+ message: "maxRequestsPerHour must be a number"
3837
+ });
3799
3838
  }
3800
3839
  if (l.currency !== void 0 && typeof l.currency !== "string") {
3801
3840
  errors.push({ path: `${path}.currency`, message: "currency must be a string" });
@@ -3810,7 +3849,10 @@ function validateRiskThresholds(thresholds, path) {
3810
3849
  const t = thresholds;
3811
3850
  for (const range of ["autoAllow", "requireApproval", "autoBlock"]) {
3812
3851
  if (!t[range] || typeof t[range] !== "object") {
3813
- errors.push({ path: `${path}.${range}`, message: `${range} is required and must be an object with min and max` });
3852
+ errors.push({
3853
+ path: `${path}.${range}`,
3854
+ message: `${range} is required and must be an object with min and max`
3855
+ });
3814
3856
  continue;
3815
3857
  }
3816
3858
  const r = t[range];
@@ -3906,7 +3948,7 @@ function verifyLocal(evaluator, context) {
3906
3948
  return evaluator.evaluate(context);
3907
3949
  }
3908
3950
 
3909
- // src/access-levels.ts
3951
+ // src/trust-levels.ts
3910
3952
  function getTrustLevel(score) {
3911
3953
  if (score >= 80) return "PLATINUM";
3912
3954
  if (score >= 60) return "GOLD";
@@ -3915,7 +3957,7 @@ function getTrustLevel(score) {
3915
3957
  }
3916
3958
 
3917
3959
  // src/version.ts
3918
- var SDK_VERSION = "4.5.1";
3960
+ var SDK_VERSION = "5.0.0";
3919
3961
 
3920
3962
  // src/http.ts
3921
3963
  var SDK_USER_AGENT = `astrasync-sdk/${SDK_VERSION}`;
@@ -3945,11 +3987,6 @@ function getCachedWellKnownUrls(apiBaseUrl) {
3945
3987
  // src/verify.ts
3946
3988
  var DEFAULT_CONFIG = {
3947
3989
  apiBaseUrl: "https://astrasync.ai/api",
3948
- // v2.3.9 (defect #30): default for unconfigured callers is `'none'` (no
3949
- // access). Pre-rename this defaulted to `'guidance'`, which combined with
3950
- // a route gated at `'guidance'` to silently let unverified traffic
3951
- // through (`hasMinimumAccess('guidance', 'guidance') === true`).
3952
- defaultAccessLevel: "none",
3953
3990
  // minTrustScore + minTrustScoreForFull deprecated in v2.3.0 — server decides.
3954
3991
  // cacheTtl deliberately unset. When undefined, cacheResult applies the 60s
3955
3992
  // default; the caller's explicit value is honoured for cacheable results.
@@ -4110,13 +4147,6 @@ function createGuidanceResponse(_config, reason, options = {}) {
4110
4147
  // policy is not evaluated (we never reached the gate).
4111
4148
  identityVerified: false,
4112
4149
  policyAllowed: false,
4113
- // v2.3.9 (defect #30): denials grant `'none'`, NEVER a positive band.
4114
- // Adapters additionally short-circuit on `!identityVerified ||
4115
- // !policyAllowed` before the gate check, but the access level still has
4116
- // to be honest at the data layer so downstream consumers (SDK adapters
4117
- // in other languages, custom integrations) inherit the correct
4118
- // semantics.
4119
- accessLevel: "none",
4120
4150
  guidance,
4121
4151
  denialReasons: reason ? [reason] : ["No valid agent credentials provided"],
4122
4152
  // Round-10 (#47, O5): on API-error fallback, surface a typed failure so
@@ -4139,6 +4169,11 @@ function createGuidanceResponse(_config, reason, options = {}) {
4139
4169
  // 4.0.0: typed marker so adapters render the misconfig envelope (503 +
4140
4170
  // MERCHANT_VERIFICATION_MISCONFIGURED) without string-matching.
4141
4171
  ...isMisconfig && { misconfigured: true },
4172
+ // 4.6.0: a transient api_error is retryable — mark it so consumers surface
4173
+ // "temporarily unavailable, retry" (recommendation 'error') instead of
4174
+ // coercing the absent recommendation to a policy 'deny'. Misconfig is
4175
+ // deterministic and intentionally NOT marked retryable.
4176
+ ...isApiError && { retryable: true },
4142
4177
  correlationId: options.correlationId,
4143
4178
  attemptId: options.attemptId,
4144
4179
  verifiedAt: /* @__PURE__ */ new Date()
@@ -4205,7 +4240,6 @@ async function callVerifyAccessAPI(config, request) {
4205
4240
  attemptId: typeof data?.attemptId === "string" ? data.attemptId : void 0,
4206
4241
  access: {
4207
4242
  allowed: false,
4208
- accessLevel: "none",
4209
4243
  reason: "endpoint_deactivated",
4210
4244
  failures: [
4211
4245
  {
@@ -4268,7 +4302,7 @@ async function verify(config, request, options) {
4268
4302
  if (!deprecationWarningShown && (config.minTrustScore !== void 0 || config.minTrustScoreForFull !== void 0)) {
4269
4303
  deprecationWarningShown = true;
4270
4304
  console.warn(
4271
- "[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."
4305
+ "[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."
4272
4306
  );
4273
4307
  }
4274
4308
  if (mergedConfig.cacheTtl !== 0 && !options?.bypassCache) {
@@ -4314,14 +4348,6 @@ async function verify(config, request, options) {
4314
4348
  const result2 = {
4315
4349
  identityVerified: idVerifiedFromBackend,
4316
4350
  policyAllowed: false,
4317
- // v2.3.9 (defect #30): denials grant `'none'`, NEVER a positive band.
4318
- // Pre-rename this hardcoded `'guidance'`, which conflated with the
4319
- // colocated `guidance: {...}` help-payload object below and let
4320
- // denied requests pass any route gated at `'guidance'` because
4321
- // `hasMinimumAccess('guidance', 'guidance') === true`. Adapters now
4322
- // ALSO short-circuit on `!identityVerified || !policyAllowed` before
4323
- // the gate check — belt-and-braces.
4324
- accessLevel: "none",
4325
4351
  // 3.6.0: the server now emits top-level denialReasons on every deny
4326
4352
  // path — prefer it verbatim; the failure-message reconstruction remains
4327
4353
  // as the fallback for older backends.
@@ -4370,7 +4396,6 @@ async function verify(config, request, options) {
4370
4396
  trustScore: apiResponse.organization.trustScore
4371
4397
  } : void 0;
4372
4398
  const verificationContext = apiResponse.verificationContext;
4373
- const accessLevel = apiResponse.access?.accessLevel ?? "standard";
4374
4399
  const result = {
4375
4400
  // 4.5.0 (probe F1): read idVerified from verificationContext with the
4376
4401
  // SAME absent⇒false default as the deny branch. The previous `!== false`
@@ -4382,7 +4407,6 @@ async function verify(config, request, options) {
4382
4407
  // this load-bearing must never be defaulted on.
4383
4408
  identityVerified: apiResponse.verificationContext?.idVerified === true,
4384
4409
  policyAllowed: true,
4385
- accessLevel,
4386
4410
  agent,
4387
4411
  developer,
4388
4412
  organization,
@@ -4409,7 +4433,6 @@ async function verify(config, request, options) {
4409
4433
  };
4410
4434
  if (result.recommendation === "deny") {
4411
4435
  result.policyAllowed = false;
4412
- result.accessLevel = "none";
4413
4436
  result.denialReasons = serverDenialReasons ?? result.recommendationReasons ?? ["Access denied by AstraSync recommendation"];
4414
4437
  result.guidance = result.runtimeChallenge ? {
4415
4438
  message: `Verification failed: ${result.runtimeChallenge.reason || "runtime challenge failed"}`,
@@ -4525,7 +4548,6 @@ function toGatewayConfig(config) {
4525
4548
  return {
4526
4549
  apiBaseUrl: config.apiBaseUrl || "https://api.astrasync.ai",
4527
4550
  apiKey: config.apiKey,
4528
- defaultAccessLevel: config.defaultAccessLevel,
4529
4551
  minTrustScore: config.minTrustScore,
4530
4552
  minTrustScoreForFull: config.minTrustScoreForFull,
4531
4553
  cacheTtl: config.cacheTtl,
@@ -4553,7 +4575,7 @@ function toDecision(result) {
4553
4575
  if (result.identityVerified && result.policyAllowed) {
4554
4576
  return {
4555
4577
  recommendation: "ALLOW",
4556
- reason: `Verified with access level: ${result.accessLevel}`,
4578
+ reason: result.agent?.trustScore ? `Verified (trust score ${result.agent.trustScore})` : "Verified",
4557
4579
  trustScore: result.agent?.trustScore,
4558
4580
  sessionId: "sessionId" in result ? result.sessionId : void 0
4559
4581
  };