@astrasyncai/verification-gateway 5.17.0 → 5.17.2

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 (94) hide show
  1. package/README.md +94 -18
  2. package/dist/adapters/express.d.mts +1 -1
  3. package/dist/adapters/express.d.ts +1 -1
  4. package/dist/adapters/express.js +33 -5
  5. package/dist/adapters/express.js.map +1 -1
  6. package/dist/adapters/express.mjs +33 -5
  7. package/dist/adapters/express.mjs.map +1 -1
  8. package/dist/adapters/mcp.d.mts +1 -1
  9. package/dist/adapters/mcp.d.ts +1 -1
  10. package/dist/adapters/mcp.js +24 -5
  11. package/dist/adapters/mcp.js.map +1 -1
  12. package/dist/adapters/mcp.mjs +24 -5
  13. package/dist/adapters/mcp.mjs.map +1 -1
  14. package/dist/adapters/nextjs.d.mts +1 -1
  15. package/dist/adapters/nextjs.d.ts +1 -1
  16. package/dist/adapters/nextjs.js +24 -5
  17. package/dist/adapters/nextjs.js.map +1 -1
  18. package/dist/adapters/nextjs.mjs +24 -5
  19. package/dist/adapters/nextjs.mjs.map +1 -1
  20. package/dist/adapters/sdk.d.mts +1 -1
  21. package/dist/adapters/sdk.d.ts +1 -1
  22. package/dist/adapters/sdk.js +5 -1
  23. package/dist/adapters/sdk.js.map +1 -1
  24. package/dist/adapters/sdk.mjs +5 -1
  25. package/dist/adapters/sdk.mjs.map +1 -1
  26. package/dist/agent/index.js +1 -1
  27. package/dist/agent/index.js.map +1 -1
  28. package/dist/agent/index.mjs +1 -1
  29. package/dist/agent/index.mjs.map +1 -1
  30. package/dist/bin/astrasync-claude-hook.js +5 -1
  31. package/dist/bin/astrasync-codex-hook.js +5 -1
  32. package/dist/bin/astrasync-guard.js +34 -7
  33. package/dist/bin/astrasync.js +34 -7
  34. package/dist/browser/background.js +5 -1
  35. package/dist/browser/background.js.map +1 -1
  36. package/dist/browser/background.mjs +5 -1
  37. package/dist/browser/background.mjs.map +1 -1
  38. package/dist/cli/index.js +1 -1
  39. package/dist/cli/index.js.map +1 -1
  40. package/dist/cli/index.mjs +1 -1
  41. package/dist/cli/index.mjs.map +1 -1
  42. package/dist/codex/index.js +5 -1
  43. package/dist/codex/index.js.map +1 -1
  44. package/dist/codex/index.mjs +5 -1
  45. package/dist/codex/index.mjs.map +1 -1
  46. package/dist/cursor/extension.js +5 -1
  47. package/dist/cursor/extension.js.map +1 -1
  48. package/dist/cursor/extension.mjs +5 -1
  49. package/dist/cursor/extension.mjs.map +1 -1
  50. package/dist/edge-config.d.mts +1 -1
  51. package/dist/edge-config.d.ts +1 -1
  52. package/dist/edge-config.js +1 -1
  53. package/dist/edge-config.js.map +1 -1
  54. package/dist/edge-config.mjs +1 -1
  55. package/dist/edge-config.mjs.map +1 -1
  56. package/dist/edge-core/index.d.mts +1 -1
  57. package/dist/edge-core/index.d.ts +1 -1
  58. package/dist/edge-core/index.js +5 -1
  59. package/dist/edge-core/index.js.map +1 -1
  60. package/dist/edge-core/index.mjs +5 -1
  61. package/dist/edge-core/index.mjs.map +1 -1
  62. package/dist/gateway/gateway.js +5 -1
  63. package/dist/gateway/gateway.js.map +1 -1
  64. package/dist/gateway/gateway.mjs +5 -1
  65. package/dist/gateway/gateway.mjs.map +1 -1
  66. package/dist/git-trigger/git-hooks.d.mts +1 -1
  67. package/dist/git-trigger/git-hooks.d.ts +1 -1
  68. package/dist/index.d.mts +16 -2
  69. package/dist/index.d.ts +16 -2
  70. package/dist/index.js +33 -5
  71. package/dist/index.js.map +1 -1
  72. package/dist/index.mjs +33 -5
  73. package/dist/index.mjs.map +1 -1
  74. package/dist/registration/index.js +1 -1
  75. package/dist/registration/index.js.map +1 -1
  76. package/dist/registration/index.mjs +1 -1
  77. package/dist/registration/index.mjs.map +1 -1
  78. package/dist/transport/index.js +1 -1
  79. package/dist/transport/index.js.map +1 -1
  80. package/dist/transport/index.mjs +1 -1
  81. package/dist/transport/index.mjs.map +1 -1
  82. package/dist/{types-Bm1QvGqI.d.ts → types-DA8LzAOB.d.ts} +6 -0
  83. package/dist/{types-Blz520bR.d.mts → types-DRb_plOh.d.mts} +14 -0
  84. package/dist/{types-Blz520bR.d.ts → types-DRb_plOh.d.ts} +14 -0
  85. package/dist/{types-DBe4hgfT.d.mts → types-vNBvYD7Z.d.mts} +6 -0
  86. package/dist/ui/index.d.mts +1 -1
  87. package/dist/ui/index.d.ts +1 -1
  88. package/dist/verify.d.mts +1 -1
  89. package/dist/verify.d.ts +1 -1
  90. package/dist/verify.js +5 -1
  91. package/dist/verify.js.map +1 -1
  92. package/dist/verify.mjs +5 -1
  93. package/dist/verify.mjs.map +1 -1
  94. package/package.json +1 -1
package/dist/index.mjs CHANGED
@@ -30,7 +30,7 @@ function getTrustLevel(score) {
30
30
  }
31
31
 
32
32
  // src/version.ts
33
- var SDK_VERSION = "5.17.0";
33
+ var SDK_VERSION = "5.17.2";
34
34
 
35
35
  // src/http.ts
36
36
  var SDK_USER_AGENT = `astrasync-sdk/${SDK_VERSION}`;
@@ -266,6 +266,7 @@ function getCacheKey(request, counterpartyId) {
266
266
  request.enableRuntimeChallenge ? "1" : "0",
267
267
  // 5.16.0: route policy changes the verdict (owners / challenge).
268
268
  request.routePolicy ? JSON.stringify(request.routePolicy) : "",
269
+ request.approvalHeldByRoute ? "1" : "0",
269
270
  // callerMetadata fields contribute to risk model; include the ones
270
271
  // backend reads. sourceIp/userAgent/forwardedFor change per-request
271
272
  // so their inclusion effectively forces a re-check for any varying
@@ -479,6 +480,7 @@ async function callVerifyAccessAPI(config, request) {
479
480
  if (requestData.enableRuntimeChallenge)
480
481
  body.enableRuntimeChallenge = requestData.enableRuntimeChallenge;
481
482
  if (requestData.routePolicy) body.routePolicy = requestData.routePolicy;
483
+ if (requestData.approvalHeldByRoute) body.approvalHeldByRoute = true;
482
484
  if (requestData.createSession) body.createSession = requestData.createSession;
483
485
  if (requestData.durationRequired) body.durationRequired = requestData.durationRequired;
484
486
  if (requestData.counterpartyType) body.counterpartyType = requestData.counterpartyType;
@@ -810,6 +812,8 @@ async function verify(config, request, options) {
810
812
  } else if (result.recommendation === "step_up_required" && result.identityVerified) {
811
813
  result.requiresStepUp = true;
812
814
  result.denialReasons = serverDenialReasons ?? result.recommendationReasons ?? ["Step-up verification required"];
815
+ const stepUpFailures = apiResponse.access?.failures;
816
+ if (stepUpFailures?.length) result.failures = stepUpFailures;
813
817
  }
814
818
  const escalates = result.requiresStepUp === true || result.requiresApproval === true || result.recommendation === "step_up_required";
815
819
  if (mergedConfig.cacheTtl !== 0 && result.recommendation !== "deny" && !escalates) {
@@ -1009,12 +1013,31 @@ function requiresHumanApproval(result) {
1009
1013
  return result.requiresStepUp === true || result.requiresApproval === true;
1010
1014
  }
1011
1015
  function annotateApprovalRequired(result) {
1012
- result.failures = [
1013
- ...result.failures ?? [],
1014
- { dimension: "commerce.intent.approval_required", message: APPROVAL_REASON }
1015
- ];
1016
+ if (isDimensionApproval(result)) {
1017
+ result.denialReasons = [DIMENSION_APPROVAL_REASON, ...result.denialReasons ?? []];
1018
+ return;
1019
+ }
1020
+ const named = (result.failures ?? []).some(
1021
+ (f) => f.dimension === "commerce.intent.approval_required"
1022
+ );
1023
+ if (!named) {
1024
+ result.failures = [
1025
+ ...result.failures ?? [],
1026
+ { dimension: "commerce.intent.approval_required", message: APPROVAL_REASON }
1027
+ ];
1028
+ }
1016
1029
  result.denialReasons = [APPROVAL_REASON, ...result.denialReasons ?? []];
1017
1030
  }
1031
+ var DIMENSION_APPROVAL_REASON = "The agent's owner asked to approve this kind of request. The owner can approve or deny it in the AstraSync dashboard.";
1032
+ var DIMENSION_APPROVAL = /^pdlss\.[a-z_]+\.approval_required$/;
1033
+ function isDimensionApproval(result) {
1034
+ const f = result.failures ?? [];
1035
+ return f.some((x) => DIMENSION_APPROVAL.test(x.dimension)) && !f.some((x) => x.dimension === "commerce.intent.approval_required");
1036
+ }
1037
+ function onlyNeedsApproval(result) {
1038
+ if (!result.policyAllowed || !requiresHumanApproval(result)) return false;
1039
+ return (result.failures ?? []).every((f) => /\.approval_required$/.test(f.dimension));
1040
+ }
1018
1041
 
1019
1042
  // src/settlement.ts
1020
1043
  async function authorizeSettlement(config, req) {
@@ -2690,6 +2713,7 @@ function createMiddleware(options) {
2690
2713
  const attemptHeader = req.headers["x-astra-attempt-id"];
2691
2714
  const inboundAttemptId = typeof attemptHeader === "string" && /^att_[0-9a-f]{32}$/.test(attemptHeader) ? attemptHeader : void 0;
2692
2715
  const commerceArtifacts = detectExpressCommerce(req);
2716
+ const heldByRoute = options.approvalHeldByRoute?.(req) === true;
2693
2717
  const verificationRequest = {
2694
2718
  credentials,
2695
2719
  ...commerceArtifacts && { commerceArtifacts },
@@ -2701,6 +2725,7 @@ function createMiddleware(options) {
2701
2725
  counterpartyType: config.counterpartyType || "api",
2702
2726
  enableRuntimeChallenge,
2703
2727
  ...routePolicyOf(routeConfig) && { routePolicy: routePolicyOf(routeConfig) },
2728
+ ...heldByRoute && { approvalHeldByRoute: true },
2704
2729
  durationRequired: astraCreds?.pdlss?.duration?.maxSessionDuration,
2705
2730
  ...txValue !== void 0 && { transactionValue: txValue },
2706
2731
  ...txCurrency && { currency: txCurrency },
@@ -2757,6 +2782,9 @@ function createMiddleware(options) {
2757
2782
  onDenied(result, req, res);
2758
2783
  return;
2759
2784
  }
2785
+ if (heldByRoute && !result.stepUpApproval && onlyNeedsApproval(result)) {
2786
+ return next();
2787
+ }
2760
2788
  if (requiresHumanApproval(result)) {
2761
2789
  annotateApprovalRequired(result);
2762
2790
  if (shouldRecordDecisions && sessionId) {