@astrasyncai/verification-gateway 5.16.0 → 5.17.1

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 +447 -25
  33. package/dist/bin/astrasync.js +470 -28
  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
@@ -442,7 +442,7 @@ function routePolicyOf(route) {
442
442
  }
443
443
 
444
444
  // src/version.ts
445
- var SDK_VERSION = "5.16.0";
445
+ var SDK_VERSION = "5.17.1";
446
446
 
447
447
  // src/http.ts
448
448
  var SDK_USER_AGENT = `astrasync-sdk/${SDK_VERSION}`;
@@ -744,6 +744,7 @@ function getCacheKey(request, counterpartyId) {
744
744
  request.enableRuntimeChallenge ? "1" : "0",
745
745
  // 5.16.0: route policy changes the verdict (owners / challenge).
746
746
  request.routePolicy ? JSON.stringify(request.routePolicy) : "",
747
+ request.approvalHeldByRoute ? "1" : "0",
747
748
  // callerMetadata fields contribute to risk model; include the ones
748
749
  // backend reads. sourceIp/userAgent/forwardedFor change per-request
749
750
  // so their inclusion effectively forces a re-check for any varying
@@ -951,6 +952,7 @@ async function callVerifyAccessAPI(config, request) {
951
952
  if (requestData.enableRuntimeChallenge)
952
953
  body.enableRuntimeChallenge = requestData.enableRuntimeChallenge;
953
954
  if (requestData.routePolicy) body.routePolicy = requestData.routePolicy;
955
+ if (requestData.approvalHeldByRoute) body.approvalHeldByRoute = true;
954
956
  if (requestData.createSession) body.createSession = requestData.createSession;
955
957
  if (requestData.durationRequired) body.durationRequired = requestData.durationRequired;
956
958
  if (requestData.counterpartyType) body.counterpartyType = requestData.counterpartyType;
@@ -1282,6 +1284,8 @@ async function verify(config, request, options) {
1282
1284
  } else if (result.recommendation === "step_up_required" && result.identityVerified) {
1283
1285
  result.requiresStepUp = true;
1284
1286
  result.denialReasons = serverDenialReasons ?? result.recommendationReasons ?? ["Step-up verification required"];
1287
+ const stepUpFailures = apiResponse.access?.failures;
1288
+ if (stepUpFailures?.length) result.failures = stepUpFailures;
1285
1289
  }
1286
1290
  const escalates = result.requiresStepUp === true || result.requiresApproval === true || result.recommendation === "step_up_required";
1287
1291
  if (mergedConfig.cacheTtl !== 0 && result.recommendation !== "deny" && !escalates) {
@@ -1516,12 +1520,31 @@ function requiresHumanApproval(result) {
1516
1520
  return result.requiresStepUp === true || result.requiresApproval === true;
1517
1521
  }
1518
1522
  function annotateApprovalRequired(result) {
1519
- result.failures = [
1520
- ...result.failures ?? [],
1521
- { dimension: "commerce.intent.approval_required", message: APPROVAL_REASON }
1522
- ];
1523
+ if (isDimensionApproval(result)) {
1524
+ result.denialReasons = [DIMENSION_APPROVAL_REASON, ...result.denialReasons ?? []];
1525
+ return;
1526
+ }
1527
+ const named = (result.failures ?? []).some(
1528
+ (f) => f.dimension === "commerce.intent.approval_required"
1529
+ );
1530
+ if (!named) {
1531
+ result.failures = [
1532
+ ...result.failures ?? [],
1533
+ { dimension: "commerce.intent.approval_required", message: APPROVAL_REASON }
1534
+ ];
1535
+ }
1523
1536
  result.denialReasons = [APPROVAL_REASON, ...result.denialReasons ?? []];
1524
1537
  }
1538
+ 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.";
1539
+ var DIMENSION_APPROVAL = /^pdlss\.[a-z_]+\.approval_required$/;
1540
+ function isDimensionApproval(result) {
1541
+ const f = result.failures ?? [];
1542
+ return f.some((x) => DIMENSION_APPROVAL.test(x.dimension)) && !f.some((x) => x.dimension === "commerce.intent.approval_required");
1543
+ }
1544
+ function onlyNeedsApproval(result) {
1545
+ if (!result.policyAllowed || !requiresHumanApproval(result)) return false;
1546
+ return (result.failures ?? []).every((f) => /\.approval_required$/.test(f.dimension));
1547
+ }
1525
1548
 
1526
1549
  // src/pdlss-pre-check.ts
1527
1550
  function performCounterpartyPreCheck(routeConfig, astraCreds, purpose) {
@@ -2485,6 +2508,7 @@ function createMiddleware(options) {
2485
2508
  const attemptHeader = req.headers["x-astra-attempt-id"];
2486
2509
  const inboundAttemptId = typeof attemptHeader === "string" && /^att_[0-9a-f]{32}$/.test(attemptHeader) ? attemptHeader : void 0;
2487
2510
  const commerceArtifacts = detectExpressCommerce(req);
2511
+ const heldByRoute = options.approvalHeldByRoute?.(req) === true;
2488
2512
  const verificationRequest = {
2489
2513
  credentials,
2490
2514
  ...commerceArtifacts && { commerceArtifacts },
@@ -2496,6 +2520,7 @@ function createMiddleware(options) {
2496
2520
  counterpartyType: config.counterpartyType || "api",
2497
2521
  enableRuntimeChallenge,
2498
2522
  ...routePolicyOf(routeConfig) && { routePolicy: routePolicyOf(routeConfig) },
2523
+ ...heldByRoute && { approvalHeldByRoute: true },
2499
2524
  durationRequired: astraCreds?.pdlss?.duration?.maxSessionDuration,
2500
2525
  ...txValue !== void 0 && { transactionValue: txValue },
2501
2526
  ...txCurrency && { currency: txCurrency },
@@ -2552,6 +2577,9 @@ function createMiddleware(options) {
2552
2577
  onDenied(result, req, res);
2553
2578
  return;
2554
2579
  }
2580
+ if (heldByRoute && !result.stepUpApproval && onlyNeedsApproval(result)) {
2581
+ return next();
2582
+ }
2555
2583
  if (requiresHumanApproval(result)) {
2556
2584
  annotateApprovalRequired(result);
2557
2585
  if (shouldRecordDecisions && sessionId) {