@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
@@ -497,9 +497,9 @@ var LocalEvaluator = class {
497
497
  if (scopeBlock) {
498
498
  return { recommendation: "DENY", reason: scopeBlock };
499
499
  }
500
- const limitViolation = this.checkLimits(context);
501
- if (limitViolation) {
502
- return { recommendation: "DENY", reason: limitViolation };
500
+ const limitDecision = this.checkLimits(context);
501
+ if (limitDecision) {
502
+ return limitDecision;
503
503
  }
504
504
  if (context.purpose === "sub_agent.spawn" && this.policy.selfInstantiation) {
505
505
  if (!this.policy.selfInstantiation.allowed) {
@@ -564,9 +564,21 @@ var LocalEvaluator = class {
564
564
  checkLimits(context) {
565
565
  const limits = this.policy.limits;
566
566
  if (!limits) return null;
567
- if (limits.maxTransactionAmount !== void 0 && context.transactionValue !== void 0) {
568
- if (context.transactionValue > limits.maxTransactionAmount) {
569
- return `Transaction value ${context.transactionValue} exceeds limit ${limits.maxTransactionAmount}`;
567
+ const value = context.transactionValue;
568
+ if (value !== void 0 && value > 0 && (limits.autonomousThreshold !== void 0 || limits.maxTransactionAmount !== void 0)) {
569
+ const autonomousThreshold = limits.autonomousThreshold ?? 0;
570
+ const hardLimit = limits.maxTransactionAmount ?? limits.autonomousThreshold ?? 0;
571
+ if (value > autonomousThreshold) {
572
+ if (value >= hardLimit) {
573
+ return {
574
+ recommendation: "DENY",
575
+ reason: `Transaction value ${value} at or above Hard Limit ${hardLimit}`
576
+ };
577
+ }
578
+ return {
579
+ recommendation: "MANUAL_REVIEW",
580
+ reason: `Transaction value ${value} is in the human-approval band (${autonomousThreshold}, ${hardLimit})`
581
+ };
570
582
  }
571
583
  }
572
584
  if (limits.maxRequestsPerHour !== void 0) {
@@ -579,7 +591,10 @@ var LocalEvaluator = class {
579
591
  } else {
580
592
  entry.count++;
581
593
  if (entry.count > limits.maxRequestsPerHour) {
582
- return `Rate limit exceeded: ${entry.count}/${limits.maxRequestsPerHour} requests per hour`;
594
+ return {
595
+ recommendation: "DENY",
596
+ reason: `Rate limit exceeded: ${entry.count}/${limits.maxRequestsPerHour} requests per hour`
597
+ };
583
598
  }
584
599
  }
585
600
  }
@@ -3788,10 +3803,16 @@ function validatePurpose(purpose, path) {
3788
3803
  errors.push({ path: `${path}.targets`, message: "targets must be an array of strings" });
3789
3804
  }
3790
3805
  if (p.blockedPatterns !== void 0 && !isStringArray(p.blockedPatterns)) {
3791
- errors.push({ path: `${path}.blockedPatterns`, message: "blockedPatterns must be an array of strings" });
3806
+ errors.push({
3807
+ path: `${path}.blockedPatterns`,
3808
+ message: "blockedPatterns must be an array of strings"
3809
+ });
3792
3810
  }
3793
3811
  if (p.requiresApproval !== void 0 && typeof p.requiresApproval !== "boolean") {
3794
- errors.push({ path: `${path}.requiresApproval`, message: "requiresApproval must be a boolean" });
3812
+ errors.push({
3813
+ path: `${path}.requiresApproval`,
3814
+ message: "requiresApproval must be a boolean"
3815
+ });
3795
3816
  }
3796
3817
  return errors;
3797
3818
  }
@@ -3814,11 +3835,29 @@ function validateLimits(limits, path) {
3814
3835
  return [{ path, message: "limits must be an object" }];
3815
3836
  }
3816
3837
  const l = limits;
3838
+ if (l.autonomousThreshold !== void 0 && typeof l.autonomousThreshold !== "number") {
3839
+ errors.push({
3840
+ path: `${path}.autonomousThreshold`,
3841
+ message: "autonomousThreshold must be a number"
3842
+ });
3843
+ }
3817
3844
  if (l.maxTransactionAmount !== void 0 && typeof l.maxTransactionAmount !== "number") {
3818
- errors.push({ path: `${path}.maxTransactionAmount`, message: "maxTransactionAmount must be a number" });
3845
+ errors.push({
3846
+ path: `${path}.maxTransactionAmount`,
3847
+ message: "maxTransactionAmount must be a number"
3848
+ });
3849
+ }
3850
+ if (typeof l.autonomousThreshold === "number" && typeof l.maxTransactionAmount === "number" && l.autonomousThreshold > l.maxTransactionAmount) {
3851
+ errors.push({
3852
+ path: `${path}.autonomousThreshold`,
3853
+ message: "autonomousThreshold (Autonomous Limit) must be <= maxTransactionAmount (Hard Limit)"
3854
+ });
3819
3855
  }
3820
3856
  if (l.maxRequestsPerHour !== void 0 && typeof l.maxRequestsPerHour !== "number") {
3821
- errors.push({ path: `${path}.maxRequestsPerHour`, message: "maxRequestsPerHour must be a number" });
3857
+ errors.push({
3858
+ path: `${path}.maxRequestsPerHour`,
3859
+ message: "maxRequestsPerHour must be a number"
3860
+ });
3822
3861
  }
3823
3862
  if (l.currency !== void 0 && typeof l.currency !== "string") {
3824
3863
  errors.push({ path: `${path}.currency`, message: "currency must be a string" });
@@ -3833,7 +3872,10 @@ function validateRiskThresholds(thresholds, path) {
3833
3872
  const t = thresholds;
3834
3873
  for (const range of ["autoAllow", "requireApproval", "autoBlock"]) {
3835
3874
  if (!t[range] || typeof t[range] !== "object") {
3836
- errors.push({ path: `${path}.${range}`, message: `${range} is required and must be an object with min and max` });
3875
+ errors.push({
3876
+ path: `${path}.${range}`,
3877
+ message: `${range} is required and must be an object with min and max`
3878
+ });
3837
3879
  continue;
3838
3880
  }
3839
3881
  const r = t[range];
@@ -3929,7 +3971,7 @@ function verifyLocal(evaluator, context) {
3929
3971
  return evaluator.evaluate(context);
3930
3972
  }
3931
3973
 
3932
- // src/access-levels.ts
3974
+ // src/trust-levels.ts
3933
3975
  function getTrustLevel(score) {
3934
3976
  if (score >= 80) return "PLATINUM";
3935
3977
  if (score >= 60) return "GOLD";
@@ -3938,7 +3980,7 @@ function getTrustLevel(score) {
3938
3980
  }
3939
3981
 
3940
3982
  // src/version.ts
3941
- var SDK_VERSION = "4.5.1";
3983
+ var SDK_VERSION = "5.0.0";
3942
3984
 
3943
3985
  // src/http.ts
3944
3986
  var SDK_USER_AGENT = `astrasync-sdk/${SDK_VERSION}`;
@@ -3968,11 +4010,6 @@ function getCachedWellKnownUrls(apiBaseUrl) {
3968
4010
  // src/verify.ts
3969
4011
  var DEFAULT_CONFIG = {
3970
4012
  apiBaseUrl: "https://astrasync.ai/api",
3971
- // v2.3.9 (defect #30): default for unconfigured callers is `'none'` (no
3972
- // access). Pre-rename this defaulted to `'guidance'`, which combined with
3973
- // a route gated at `'guidance'` to silently let unverified traffic
3974
- // through (`hasMinimumAccess('guidance', 'guidance') === true`).
3975
- defaultAccessLevel: "none",
3976
4013
  // minTrustScore + minTrustScoreForFull deprecated in v2.3.0 — server decides.
3977
4014
  // cacheTtl deliberately unset. When undefined, cacheResult applies the 60s
3978
4015
  // default; the caller's explicit value is honoured for cacheable results.
@@ -4133,13 +4170,6 @@ function createGuidanceResponse(_config, reason, options = {}) {
4133
4170
  // policy is not evaluated (we never reached the gate).
4134
4171
  identityVerified: false,
4135
4172
  policyAllowed: false,
4136
- // v2.3.9 (defect #30): denials grant `'none'`, NEVER a positive band.
4137
- // Adapters additionally short-circuit on `!identityVerified ||
4138
- // !policyAllowed` before the gate check, but the access level still has
4139
- // to be honest at the data layer so downstream consumers (SDK adapters
4140
- // in other languages, custom integrations) inherit the correct
4141
- // semantics.
4142
- accessLevel: "none",
4143
4173
  guidance,
4144
4174
  denialReasons: reason ? [reason] : ["No valid agent credentials provided"],
4145
4175
  // Round-10 (#47, O5): on API-error fallback, surface a typed failure so
@@ -4162,6 +4192,11 @@ function createGuidanceResponse(_config, reason, options = {}) {
4162
4192
  // 4.0.0: typed marker so adapters render the misconfig envelope (503 +
4163
4193
  // MERCHANT_VERIFICATION_MISCONFIGURED) without string-matching.
4164
4194
  ...isMisconfig && { misconfigured: true },
4195
+ // 4.6.0: a transient api_error is retryable — mark it so consumers surface
4196
+ // "temporarily unavailable, retry" (recommendation 'error') instead of
4197
+ // coercing the absent recommendation to a policy 'deny'. Misconfig is
4198
+ // deterministic and intentionally NOT marked retryable.
4199
+ ...isApiError && { retryable: true },
4165
4200
  correlationId: options.correlationId,
4166
4201
  attemptId: options.attemptId,
4167
4202
  verifiedAt: /* @__PURE__ */ new Date()
@@ -4228,7 +4263,6 @@ async function callVerifyAccessAPI(config, request) {
4228
4263
  attemptId: typeof data?.attemptId === "string" ? data.attemptId : void 0,
4229
4264
  access: {
4230
4265
  allowed: false,
4231
- accessLevel: "none",
4232
4266
  reason: "endpoint_deactivated",
4233
4267
  failures: [
4234
4268
  {
@@ -4291,7 +4325,7 @@ async function verify(config, request, options) {
4291
4325
  if (!deprecationWarningShown && (config.minTrustScore !== void 0 || config.minTrustScoreForFull !== void 0)) {
4292
4326
  deprecationWarningShown = true;
4293
4327
  console.warn(
4294
- "[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."
4328
+ "[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."
4295
4329
  );
4296
4330
  }
4297
4331
  if (mergedConfig.cacheTtl !== 0 && !options?.bypassCache) {
@@ -4337,14 +4371,6 @@ async function verify(config, request, options) {
4337
4371
  const result2 = {
4338
4372
  identityVerified: idVerifiedFromBackend,
4339
4373
  policyAllowed: false,
4340
- // v2.3.9 (defect #30): denials grant `'none'`, NEVER a positive band.
4341
- // Pre-rename this hardcoded `'guidance'`, which conflated with the
4342
- // colocated `guidance: {...}` help-payload object below and let
4343
- // denied requests pass any route gated at `'guidance'` because
4344
- // `hasMinimumAccess('guidance', 'guidance') === true`. Adapters now
4345
- // ALSO short-circuit on `!identityVerified || !policyAllowed` before
4346
- // the gate check — belt-and-braces.
4347
- accessLevel: "none",
4348
4374
  // 3.6.0: the server now emits top-level denialReasons on every deny
4349
4375
  // path — prefer it verbatim; the failure-message reconstruction remains
4350
4376
  // as the fallback for older backends.
@@ -4393,7 +4419,6 @@ async function verify(config, request, options) {
4393
4419
  trustScore: apiResponse.organization.trustScore
4394
4420
  } : void 0;
4395
4421
  const verificationContext = apiResponse.verificationContext;
4396
- const accessLevel = apiResponse.access?.accessLevel ?? "standard";
4397
4422
  const result = {
4398
4423
  // 4.5.0 (probe F1): read idVerified from verificationContext with the
4399
4424
  // SAME absent⇒false default as the deny branch. The previous `!== false`
@@ -4405,7 +4430,6 @@ async function verify(config, request, options) {
4405
4430
  // this load-bearing must never be defaulted on.
4406
4431
  identityVerified: apiResponse.verificationContext?.idVerified === true,
4407
4432
  policyAllowed: true,
4408
- accessLevel,
4409
4433
  agent,
4410
4434
  developer,
4411
4435
  organization,
@@ -4432,7 +4456,6 @@ async function verify(config, request, options) {
4432
4456
  };
4433
4457
  if (result.recommendation === "deny") {
4434
4458
  result.policyAllowed = false;
4435
- result.accessLevel = "none";
4436
4459
  result.denialReasons = serverDenialReasons ?? result.recommendationReasons ?? ["Access denied by AstraSync recommendation"];
4437
4460
  result.guidance = result.runtimeChallenge ? {
4438
4461
  message: `Verification failed: ${result.runtimeChallenge.reason || "runtime challenge failed"}`,
@@ -4545,7 +4568,6 @@ function toGatewayConfig(config) {
4545
4568
  return {
4546
4569
  apiBaseUrl: config.apiBaseUrl || "https://api.astrasync.ai",
4547
4570
  apiKey: config.apiKey,
4548
- defaultAccessLevel: config.defaultAccessLevel,
4549
4571
  minTrustScore: config.minTrustScore,
4550
4572
  minTrustScoreForFull: config.minTrustScoreForFull,
4551
4573
  cacheTtl: config.cacheTtl,
@@ -4573,7 +4595,7 @@ function toDecision(result) {
4573
4595
  if (result.identityVerified && result.policyAllowed) {
4574
4596
  return {
4575
4597
  recommendation: "ALLOW",
4576
- reason: `Verified with access level: ${result.accessLevel}`,
4598
+ reason: result.agent?.trustScore ? `Verified (trust score ${result.agent.trustScore})` : "Verified",
4577
4599
  trustScore: result.agent?.trustScore,
4578
4600
  sessionId: "sessionId" in result ? result.sessionId : void 0
4579
4601
  };