@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
@@ -514,9 +514,9 @@ var LocalEvaluator = class {
514
514
  if (scopeBlock) {
515
515
  return { recommendation: "DENY", reason: scopeBlock };
516
516
  }
517
- const limitViolation = this.checkLimits(context);
518
- if (limitViolation) {
519
- return { recommendation: "DENY", reason: limitViolation };
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
- if (limits.maxTransactionAmount !== void 0 && context.transactionValue !== void 0) {
585
- if (context.transactionValue > limits.maxTransactionAmount) {
586
- return `Transaction value ${context.transactionValue} exceeds limit ${limits.maxTransactionAmount}`;
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 `Rate limit exceeded: ${entry.count}/${limits.maxRequestsPerHour} requests per hour`;
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({ path: `${path}.blockedPatterns`, message: "blockedPatterns must be an array of strings" });
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({ path: `${path}.requiresApproval`, message: "requiresApproval must be a boolean" });
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({ path: `${path}.maxTransactionAmount`, message: "maxTransactionAmount must be a number" });
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({ path: `${path}.maxRequestsPerHour`, message: "maxRequestsPerHour must be a number" });
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({ path: `${path}.${range}`, message: `${range} is required and must be an object with min and max` });
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/access-levels.ts
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 = "4.5.1";
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-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."
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 with access level: ${result.accessLevel}`,
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
  };