@astrasyncai/verification-gateway 4.6.0 → 5.1.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 (135) hide show
  1. package/dist/adapter-interface/interface.d.mts +2 -2
  2. package/dist/adapter-interface/interface.d.ts +2 -2
  3. package/dist/adapters/express.d.mts +2 -2
  4. package/dist/adapters/express.d.ts +2 -2
  5. package/dist/adapters/express.js +25 -35
  6. package/dist/adapters/express.js.map +1 -1
  7. package/dist/adapters/express.mjs +25 -35
  8. package/dist/adapters/express.mjs.map +1 -1
  9. package/dist/adapters/mcp.d.mts +2 -2
  10. package/dist/adapters/mcp.d.ts +2 -2
  11. package/dist/adapters/mcp.js +42 -67
  12. package/dist/adapters/mcp.js.map +1 -1
  13. package/dist/adapters/mcp.mjs +41 -66
  14. package/dist/adapters/mcp.mjs.map +1 -1
  15. package/dist/adapters/nextjs.d.mts +2 -2
  16. package/dist/adapters/nextjs.d.ts +2 -2
  17. package/dist/adapters/nextjs.js +23 -32
  18. package/dist/adapters/nextjs.js.map +1 -1
  19. package/dist/adapters/nextjs.mjs +23 -32
  20. package/dist/adapters/nextjs.mjs.map +1 -1
  21. package/dist/adapters/sdk.d.mts +2 -2
  22. package/dist/adapters/sdk.d.ts +2 -2
  23. package/dist/adapters/sdk.js +22 -126
  24. package/dist/adapters/sdk.js.map +1 -1
  25. package/dist/adapters/sdk.mjs +22 -124
  26. package/dist/adapters/sdk.mjs.map +1 -1
  27. package/dist/agent/index.d.mts +2 -2
  28. package/dist/agent/index.d.ts +2 -2
  29. package/dist/agent/index.js +1 -1
  30. package/dist/agent/index.js.map +1 -1
  31. package/dist/agent/index.mjs +1 -1
  32. package/dist/agent/index.mjs.map +1 -1
  33. package/dist/bin/astrasync-claude-hook.js +23 -31
  34. package/dist/bin/astrasync-codex-hook.js +23 -31
  35. package/dist/bin/astrasync-guard.js +23 -31
  36. package/dist/bin/astrasync.js +28 -36
  37. package/dist/browser/background.js +23 -31
  38. package/dist/browser/background.js.map +1 -1
  39. package/dist/browser/background.mjs +23 -31
  40. package/dist/browser/background.mjs.map +1 -1
  41. package/dist/browser/browser-adapter.d.mts +2 -2
  42. package/dist/browser/browser-adapter.d.ts +2 -2
  43. package/dist/claude-code/claude-code-adapter.d.mts +2 -2
  44. package/dist/claude-code/claude-code-adapter.d.ts +2 -2
  45. package/dist/cli/index.d.mts +2 -2
  46. package/dist/cli/index.d.ts +2 -2
  47. package/dist/cli/index.js +1 -1
  48. package/dist/cli/index.js.map +1 -1
  49. package/dist/cli/index.mjs +1 -1
  50. package/dist/cli/index.mjs.map +1 -1
  51. package/dist/codex/index.d.mts +2 -2
  52. package/dist/codex/index.d.ts +2 -2
  53. package/dist/codex/index.js +23 -31
  54. package/dist/codex/index.js.map +1 -1
  55. package/dist/codex/index.mjs +23 -31
  56. package/dist/codex/index.mjs.map +1 -1
  57. package/dist/cursor/cursor-adapter.d.mts +2 -2
  58. package/dist/cursor/cursor-adapter.d.ts +2 -2
  59. package/dist/cursor/extension.d.mts +2 -2
  60. package/dist/cursor/extension.d.ts +2 -2
  61. package/dist/cursor/extension.js +23 -31
  62. package/dist/cursor/extension.js.map +1 -1
  63. package/dist/cursor/extension.mjs +23 -31
  64. package/dist/cursor/extension.mjs.map +1 -1
  65. package/dist/edge-config.d.mts +1 -1
  66. package/dist/edge-config.d.ts +1 -1
  67. package/dist/edge-config.js +1 -1
  68. package/dist/edge-config.js.map +1 -1
  69. package/dist/edge-config.mjs +1 -1
  70. package/dist/edge-config.mjs.map +1 -1
  71. package/dist/edge-core/index.d.mts +12 -3
  72. package/dist/edge-core/index.d.ts +12 -3
  73. package/dist/edge-core/index.js +42 -36
  74. package/dist/edge-core/index.js.map +1 -1
  75. package/dist/edge-core/index.mjs +42 -36
  76. package/dist/edge-core/index.mjs.map +1 -1
  77. package/dist/{express-DBtPKXOL.d.mts → express-KkBZBMqi.d.mts} +1 -1
  78. package/dist/{express-D-8Ks2Uo.d.ts → express-xK8pRrmj.d.ts} +1 -1
  79. package/dist/gateway/gateway.d.mts +2 -2
  80. package/dist/gateway/gateway.d.ts +2 -2
  81. package/dist/gateway/gateway.js +23 -31
  82. package/dist/gateway/gateway.js.map +1 -1
  83. package/dist/gateway/gateway.mjs +23 -31
  84. package/dist/gateway/gateway.mjs.map +1 -1
  85. package/dist/git-trigger/git-hooks.d.mts +2 -2
  86. package/dist/git-trigger/git-hooks.d.ts +2 -2
  87. package/dist/{index-kGCGWd5x.d.mts → index-DIRzR5IS.d.mts} +1 -1
  88. package/dist/{index-DlZORQsb.d.ts → index-DLQ4Rcuc.d.ts} +1 -1
  89. package/dist/{index-CUfmJ1Dq.d.mts → index-GPDn_EGI.d.mts} +1 -1
  90. package/dist/{index-BND3kQev.d.ts → index-Hnz5VyMR.d.ts} +1 -1
  91. package/dist/index.d.mts +14 -10
  92. package/dist/index.d.ts +14 -10
  93. package/dist/index.js +44 -219
  94. package/dist/index.js.map +1 -1
  95. package/dist/index.mjs +44 -212
  96. package/dist/index.mjs.map +1 -1
  97. package/dist/local-evaluator/evaluator.d.mts +2 -2
  98. package/dist/local-evaluator/evaluator.d.ts +2 -2
  99. package/dist/local-evaluator/evaluator.js.map +1 -1
  100. package/dist/local-evaluator/evaluator.mjs.map +1 -1
  101. package/dist/{mcp-DToTlwIn.d.ts → mcp-DPpu4xQz.d.ts} +53 -52
  102. package/dist/{mcp-ZRN4kY3b.d.mts → mcp-Dju_Sr1o.d.mts} +53 -52
  103. package/dist/{nextjs-C0KASOy_.d.mts → nextjs-BuoDBN4g.d.mts} +1 -1
  104. package/dist/{nextjs-lwNvWYWT.d.ts → nextjs-rZKzY_8o.d.ts} +1 -1
  105. package/dist/registration/index.js +1 -1
  106. package/dist/registration/index.js.map +1 -1
  107. package/dist/registration/index.mjs +1 -1
  108. package/dist/registration/index.mjs.map +1 -1
  109. package/dist/sdk-CdO6TIEf.d.mts +142 -0
  110. package/dist/sdk-DxHuIJBm.d.ts +142 -0
  111. package/dist/transport/index.d.mts +2 -2
  112. package/dist/transport/index.d.ts +2 -2
  113. package/dist/transport/index.js +1 -1
  114. package/dist/transport/index.js.map +1 -1
  115. package/dist/transport/index.mjs +1 -1
  116. package/dist/transport/index.mjs.map +1 -1
  117. package/dist/{types-DhhJxKIC.d.ts → types-3UV7IZx7.d.ts} +1 -3
  118. package/dist/{types-CGPU7HLi.d.ts → types-CNBaZKxY.d.ts} +24 -50
  119. package/dist/{types-Cx9hTpKI.d.mts → types-CSHcByFX.d.mts} +24 -50
  120. package/dist/{types-CfSJLS4i.d.mts → types-CoDjpbVY.d.mts} +1 -3
  121. package/dist/ui/index.d.mts +2 -17
  122. package/dist/ui/index.d.ts +2 -17
  123. package/dist/ui/index.js +1 -43
  124. package/dist/ui/index.js.map +1 -1
  125. package/dist/ui/index.mjs +1 -42
  126. package/dist/ui/index.mjs.map +1 -1
  127. package/dist/verify.d.mts +3 -4
  128. package/dist/verify.d.ts +3 -4
  129. package/dist/verify.js +22 -30
  130. package/dist/verify.js.map +1 -1
  131. package/dist/verify.mjs +22 -30
  132. package/dist/verify.mjs.map +1 -1
  133. package/package.json +1 -1
  134. package/dist/sdk-B4aodEwj.d.ts +0 -215
  135. package/dist/sdk-B9dSwum7.d.mts +0 -215
@@ -1,5 +1,5 @@
1
1
  // src/version.ts
2
- var SDK_VERSION = "4.6.0";
2
+ var SDK_VERSION = "5.0.0";
3
3
 
4
4
  // src/http.ts
5
5
  var SDK_USER_AGENT = `astrasync-sdk/${SDK_VERSION}`;
@@ -310,7 +310,7 @@ function detectPlatformFingerprint(input) {
310
310
  return matchPlatformSignature(PLATFORM_AGENT_SIGNATURES, input);
311
311
  }
312
312
 
313
- // src/access-levels.ts
313
+ // src/trust-levels.ts
314
314
  function getTrustLevel(score) {
315
315
  if (score >= 80) return "PLATINUM";
316
316
  if (score >= 60) return "GOLD";
@@ -328,11 +328,6 @@ function getCachedWellKnownUrls(apiBaseUrl) {
328
328
  // src/verify.ts
329
329
  var DEFAULT_CONFIG = {
330
330
  apiBaseUrl: "https://astrasync.ai/api",
331
- // v2.3.9 (defect #30): default for unconfigured callers is `'none'` (no
332
- // access). Pre-rename this defaulted to `'guidance'`, which combined with
333
- // a route gated at `'guidance'` to silently let unverified traffic
334
- // through (`hasMinimumAccess('guidance', 'guidance') === true`).
335
- defaultAccessLevel: "none",
336
331
  // minTrustScore + minTrustScoreForFull deprecated in v2.3.0 — server decides.
337
332
  // cacheTtl deliberately unset. When undefined, cacheResult applies the 60s
338
333
  // default; the caller's explicit value is honoured for cacheable results.
@@ -489,6 +484,14 @@ function extractCredentials(headers, query) {
489
484
  }
490
485
  return credentials;
491
486
  }
487
+ function mcpGuidance(urls) {
488
+ if (!urls?.mcpEndpoint) return void 0;
489
+ return {
490
+ endpoint: urls.mcpEndpoint,
491
+ discoveryUrl: urls.mcpDiscoveryUrl,
492
+ message: "If you are operating inside an MCP-capable host (Claude, ChatGPT, Cursor, or any MCP client), add the AstraSync MCP connector instead of integrating these URLs by hand: registration through the connector is KEYLESS and HUMAN-APPROVED \u2014 your human approves in an in-chat card, and you never see, hold, or transmit an API key, password, or private key."
493
+ };
494
+ }
492
495
  function createGuidanceResponse(_config, reason, options = {}) {
493
496
  const source = options.source ?? "no_credentials";
494
497
  const isApiError = source === "api_error";
@@ -515,11 +518,17 @@ function createGuidanceResponse(_config, reason, options = {}) {
515
518
  registrationUrl: urls?.registrationUrl ?? "",
516
519
  documentationUrl: urls?.documentationUrl ?? "",
517
520
  steps: [
521
+ // MCP steering leads when the hosted bridge is advertised — the
522
+ // connector is the agent-actionable path (keyless, human-approved).
523
+ ...urls?.mcpEndpoint ? [
524
+ `Fastest path (inside an MCP host): add the AstraSync MCP connector at ${urls.mcpEndpoint} \u2014 keyless, human-approved registration`
525
+ ] : [],
518
526
  "Register for an AstraSync account",
519
527
  "Create and register your agent",
520
528
  "Add your ASTRA-ID to request headers",
521
529
  "Retry your request"
522
- ]
530
+ ],
531
+ ...mcpGuidance(urls) && { mcp: mcpGuidance(urls) }
523
532
  };
524
533
  return {
525
534
  // Round-18 G4: createGuidanceResponse fires for unverified-agent path or
@@ -527,13 +536,6 @@ function createGuidanceResponse(_config, reason, options = {}) {
527
536
  // policy is not evaluated (we never reached the gate).
528
537
  identityVerified: false,
529
538
  policyAllowed: false,
530
- // v2.3.9 (defect #30): denials grant `'none'`, NEVER a positive band.
531
- // Adapters additionally short-circuit on `!identityVerified ||
532
- // !policyAllowed` before the gate check, but the access level still has
533
- // to be honest at the data layer so downstream consumers (SDK adapters
534
- // in other languages, custom integrations) inherit the correct
535
- // semantics.
536
- accessLevel: "none",
537
539
  guidance,
538
540
  denialReasons: reason ? [reason] : ["No valid agent credentials provided"],
539
541
  // Round-10 (#47, O5): on API-error fallback, surface a typed failure so
@@ -627,7 +629,6 @@ async function callVerifyAccessAPI(config, request) {
627
629
  attemptId: typeof data?.attemptId === "string" ? data.attemptId : void 0,
628
630
  access: {
629
631
  allowed: false,
630
- accessLevel: "none",
631
632
  reason: "endpoint_deactivated",
632
633
  failures: [
633
634
  {
@@ -690,7 +691,7 @@ async function verify(config, request, options) {
690
691
  if (!deprecationWarningShown && (config.minTrustScore !== void 0 || config.minTrustScoreForFull !== void 0)) {
691
692
  deprecationWarningShown = true;
692
693
  console.warn(
693
- "[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."
694
+ "[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."
694
695
  );
695
696
  }
696
697
  if (mergedConfig.cacheTtl !== 0 && !options?.bypassCache) {
@@ -736,14 +737,6 @@ async function verify(config, request, options) {
736
737
  const result2 = {
737
738
  identityVerified: idVerifiedFromBackend,
738
739
  policyAllowed: false,
739
- // v2.3.9 (defect #30): denials grant `'none'`, NEVER a positive band.
740
- // Pre-rename this hardcoded `'guidance'`, which conflated with the
741
- // colocated `guidance: {...}` help-payload object below and let
742
- // denied requests pass any route gated at `'guidance'` because
743
- // `hasMinimumAccess('guidance', 'guidance') === true`. Adapters now
744
- // ALSO short-circuit on `!identityVerified || !policyAllowed` before
745
- // the gate check — belt-and-braces.
746
- accessLevel: "none",
747
740
  // 3.6.0: the server now emits top-level denialReasons on every deny
748
741
  // path — prefer it verbatim; the failure-message reconstruction remains
749
742
  // as the fallback for older backends.
@@ -754,7 +747,10 @@ async function verify(config, request, options) {
754
747
  guidance: {
755
748
  message: apiResponse.access?.reason || "Access denied by PDLSS policy",
756
749
  registrationUrl: urls?.registrationUrl ?? "",
757
- documentationUrl: urls?.documentationUrl ?? ""
750
+ documentationUrl: urls?.documentationUrl ?? "",
751
+ // 5.1.0: anonymous callers land on this branch — steer MCP-hosted
752
+ // agents to the connector (this is what the edge deny body surfaces).
753
+ ...mcpGuidance(urls) && { mcp: mcpGuidance(urls) }
758
754
  },
759
755
  verifiedAt: /* @__PURE__ */ new Date(),
760
756
  // Extract sessionId so decisions can be recorded for denials too
@@ -792,7 +788,6 @@ async function verify(config, request, options) {
792
788
  trustScore: apiResponse.organization.trustScore
793
789
  } : void 0;
794
790
  const verificationContext = apiResponse.verificationContext;
795
- const accessLevel = apiResponse.access?.accessLevel ?? "standard";
796
791
  const result = {
797
792
  // 4.5.0 (probe F1): read idVerified from verificationContext with the
798
793
  // SAME absent⇒false default as the deny branch. The previous `!== false`
@@ -804,7 +799,6 @@ async function verify(config, request, options) {
804
799
  // this load-bearing must never be defaulted on.
805
800
  identityVerified: apiResponse.verificationContext?.idVerified === true,
806
801
  policyAllowed: true,
807
- accessLevel,
808
802
  agent,
809
803
  developer,
810
804
  organization,
@@ -831,7 +825,6 @@ async function verify(config, request, options) {
831
825
  };
832
826
  if (result.recommendation === "deny") {
833
827
  result.policyAllowed = false;
834
- result.accessLevel = "none";
835
828
  result.denialReasons = serverDenialReasons ?? result.recommendationReasons ?? ["Access denied by AstraSync recommendation"];
836
829
  result.guidance = result.runtimeChallenge ? {
837
830
  message: `Verification failed: ${result.runtimeChallenge.reason || "runtime challenge failed"}`,
@@ -1120,8 +1113,17 @@ var PROTOCOL_MESSAGES = {
1120
1113
  "platform-ua": "This traffic was identified as a platform AI agent without AstraSync credentials. Register the agent to access this property with a verified identity.",
1121
1114
  "x-astra": "The presented AstraSync credentials failed verification or were denied by this property\u2019s access policy."
1122
1115
  };
1116
+ function fallbackMcpEndpoint(origin) {
1117
+ try {
1118
+ const host = new URL(origin).hostname.replace(/^www\./, "");
1119
+ if (host === "astrasync.ai" || host.endsWith(".astrasync.ai")) return `https://mcp.${host}/mcp`;
1120
+ } catch {
1121
+ }
1122
+ return void 0;
1123
+ }
1123
1124
  function buildDenyBody(outcome, apiBaseUrl) {
1124
1125
  const origin = apiBaseUrl.replace(/\/api\/?$/, "");
1126
+ const mcpEndpoint = outcome.guidance?.mcp?.endpoint || fallbackMcpEndpoint(origin);
1125
1127
  const protocolMessage = (outcome.protocol && PROTOCOL_MESSAGES[outcome.protocol]) ?? "This request could not be verified by AstraSync.";
1126
1128
  return {
1127
1129
  success: false,
@@ -1138,7 +1140,14 @@ function buildDenyBody(outcome, apiBaseUrl) {
1138
1140
  // well-known cache is cold — empty means "use the fallback".
1139
1141
  message: outcome.guidance?.message || "Register this agent with AstraSync to receive verifiable credentials.",
1140
1142
  registrationUrl: outcome.guidance?.registrationUrl || `${origin}/register`,
1141
- documentationUrl: outcome.guidance?.documentationUrl || `${origin}/docs/edge-adapter`
1143
+ documentationUrl: outcome.guidance?.documentationUrl || `${origin}/docs/edge-adapter`,
1144
+ ...mcpEndpoint && {
1145
+ mcp: {
1146
+ endpoint: mcpEndpoint,
1147
+ discoveryUrl: outcome.guidance?.mcp?.discoveryUrl || `${mcpEndpoint.replace(/\/mcp$/, "")}/.well-known/mcp.json`,
1148
+ message: outcome.guidance?.mcp?.message || "Inside an MCP host? Add the AstraSync MCP connector at this endpoint instead of the registration URL \u2014 registration through the connector is keyless and human-approved (your human approves in an in-chat card; you never handle credentials)."
1149
+ }
1150
+ }
1142
1151
  }
1143
1152
  }
1144
1153
  };
@@ -1178,7 +1187,6 @@ var ASAT_HEADERS = {
1178
1187
  trustScore: "X-AstraSync-Trust-Score",
1179
1188
  agentId: "X-AstraSync-Agent-Id",
1180
1189
  developerId: "X-AstraSync-Developer-Id",
1181
- permissions: "X-AstraSync-Permissions",
1182
1190
  observedDecision: "X-AstraSync-Observed-Decision"
1183
1191
  };
1184
1192
  var STRIP_HEADER_PREFIXES = ["x-astrasync-", "x-astra-verified-hop"];
@@ -1227,12 +1235,11 @@ function applyOutcome(options, outcome, policy) {
1227
1235
  }
1228
1236
  function asatHeaders(outcome) {
1229
1237
  if (!outcome.asat) return {};
1230
- const { trustScore, agentId, developerId, accessLevel } = outcome.asat;
1238
+ const { trustScore, agentId, developerId } = outcome.asat;
1231
1239
  return {
1232
1240
  ...trustScore !== void 0 && { [ASAT_HEADERS.trustScore]: String(trustScore) },
1233
1241
  ...agentId && { [ASAT_HEADERS.agentId]: agentId },
1234
- ...developerId && { [ASAT_HEADERS.developerId]: developerId },
1235
- ...accessLevel && { [ASAT_HEADERS.permissions]: accessLevel }
1242
+ ...developerId && { [ASAT_HEADERS.developerId]: developerId }
1236
1243
  };
1237
1244
  }
1238
1245
  function verifiedHopHeader(outcome) {
@@ -1440,8 +1447,7 @@ function outcomeFromVerifyResult(classification, result) {
1440
1447
  outcome.asat = {
1441
1448
  trustScore: result.agent?.trustScore,
1442
1449
  agentId: result.agent?.astraId,
1443
- developerId: result.developer?.astradId,
1444
- accessLevel: result.accessLevel
1450
+ developerId: result.developer?.astradId
1445
1451
  };
1446
1452
  return outcome;
1447
1453
  }