@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.
- package/dist/adapter-interface/interface.d.mts +2 -2
- package/dist/adapter-interface/interface.d.ts +2 -2
- package/dist/adapters/express.d.mts +2 -2
- package/dist/adapters/express.d.ts +2 -2
- package/dist/adapters/express.js +25 -35
- package/dist/adapters/express.js.map +1 -1
- package/dist/adapters/express.mjs +25 -35
- package/dist/adapters/express.mjs.map +1 -1
- package/dist/adapters/mcp.d.mts +2 -2
- package/dist/adapters/mcp.d.ts +2 -2
- package/dist/adapters/mcp.js +42 -67
- package/dist/adapters/mcp.js.map +1 -1
- package/dist/adapters/mcp.mjs +41 -66
- package/dist/adapters/mcp.mjs.map +1 -1
- package/dist/adapters/nextjs.d.mts +2 -2
- package/dist/adapters/nextjs.d.ts +2 -2
- package/dist/adapters/nextjs.js +23 -32
- package/dist/adapters/nextjs.js.map +1 -1
- package/dist/adapters/nextjs.mjs +23 -32
- package/dist/adapters/nextjs.mjs.map +1 -1
- package/dist/adapters/sdk.d.mts +2 -2
- package/dist/adapters/sdk.d.ts +2 -2
- package/dist/adapters/sdk.js +22 -126
- package/dist/adapters/sdk.js.map +1 -1
- package/dist/adapters/sdk.mjs +22 -124
- package/dist/adapters/sdk.mjs.map +1 -1
- package/dist/agent/index.d.mts +2 -2
- package/dist/agent/index.d.ts +2 -2
- package/dist/agent/index.js +1 -1
- package/dist/agent/index.js.map +1 -1
- package/dist/agent/index.mjs +1 -1
- package/dist/agent/index.mjs.map +1 -1
- package/dist/bin/astrasync-claude-hook.js +23 -31
- package/dist/bin/astrasync-codex-hook.js +23 -31
- package/dist/bin/astrasync-guard.js +23 -31
- package/dist/bin/astrasync.js +28 -36
- package/dist/browser/background.js +23 -31
- package/dist/browser/background.js.map +1 -1
- package/dist/browser/background.mjs +23 -31
- package/dist/browser/background.mjs.map +1 -1
- package/dist/browser/browser-adapter.d.mts +2 -2
- package/dist/browser/browser-adapter.d.ts +2 -2
- package/dist/claude-code/claude-code-adapter.d.mts +2 -2
- package/dist/claude-code/claude-code-adapter.d.ts +2 -2
- package/dist/cli/index.d.mts +2 -2
- package/dist/cli/index.d.ts +2 -2
- package/dist/cli/index.js +1 -1
- package/dist/cli/index.js.map +1 -1
- package/dist/cli/index.mjs +1 -1
- package/dist/cli/index.mjs.map +1 -1
- package/dist/codex/index.d.mts +2 -2
- package/dist/codex/index.d.ts +2 -2
- package/dist/codex/index.js +23 -31
- package/dist/codex/index.js.map +1 -1
- package/dist/codex/index.mjs +23 -31
- package/dist/codex/index.mjs.map +1 -1
- package/dist/cursor/cursor-adapter.d.mts +2 -2
- package/dist/cursor/cursor-adapter.d.ts +2 -2
- package/dist/cursor/extension.d.mts +2 -2
- package/dist/cursor/extension.d.ts +2 -2
- package/dist/cursor/extension.js +23 -31
- package/dist/cursor/extension.js.map +1 -1
- package/dist/cursor/extension.mjs +23 -31
- package/dist/cursor/extension.mjs.map +1 -1
- package/dist/edge-config.d.mts +1 -1
- package/dist/edge-config.d.ts +1 -1
- package/dist/edge-config.js +1 -1
- package/dist/edge-config.js.map +1 -1
- package/dist/edge-config.mjs +1 -1
- package/dist/edge-config.mjs.map +1 -1
- package/dist/edge-core/index.d.mts +12 -3
- package/dist/edge-core/index.d.ts +12 -3
- package/dist/edge-core/index.js +42 -36
- package/dist/edge-core/index.js.map +1 -1
- package/dist/edge-core/index.mjs +42 -36
- package/dist/edge-core/index.mjs.map +1 -1
- package/dist/{express-DBtPKXOL.d.mts → express-KkBZBMqi.d.mts} +1 -1
- package/dist/{express-D-8Ks2Uo.d.ts → express-xK8pRrmj.d.ts} +1 -1
- package/dist/gateway/gateway.d.mts +2 -2
- package/dist/gateway/gateway.d.ts +2 -2
- package/dist/gateway/gateway.js +23 -31
- package/dist/gateway/gateway.js.map +1 -1
- package/dist/gateway/gateway.mjs +23 -31
- package/dist/gateway/gateway.mjs.map +1 -1
- package/dist/git-trigger/git-hooks.d.mts +2 -2
- package/dist/git-trigger/git-hooks.d.ts +2 -2
- package/dist/{index-kGCGWd5x.d.mts → index-DIRzR5IS.d.mts} +1 -1
- package/dist/{index-DlZORQsb.d.ts → index-DLQ4Rcuc.d.ts} +1 -1
- package/dist/{index-CUfmJ1Dq.d.mts → index-GPDn_EGI.d.mts} +1 -1
- package/dist/{index-BND3kQev.d.ts → index-Hnz5VyMR.d.ts} +1 -1
- package/dist/index.d.mts +14 -10
- package/dist/index.d.ts +14 -10
- package/dist/index.js +44 -219
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +44 -212
- package/dist/index.mjs.map +1 -1
- package/dist/local-evaluator/evaluator.d.mts +2 -2
- package/dist/local-evaluator/evaluator.d.ts +2 -2
- package/dist/local-evaluator/evaluator.js.map +1 -1
- package/dist/local-evaluator/evaluator.mjs.map +1 -1
- package/dist/{mcp-DToTlwIn.d.ts → mcp-DPpu4xQz.d.ts} +53 -52
- package/dist/{mcp-ZRN4kY3b.d.mts → mcp-Dju_Sr1o.d.mts} +53 -52
- package/dist/{nextjs-C0KASOy_.d.mts → nextjs-BuoDBN4g.d.mts} +1 -1
- package/dist/{nextjs-lwNvWYWT.d.ts → nextjs-rZKzY_8o.d.ts} +1 -1
- package/dist/registration/index.js +1 -1
- package/dist/registration/index.js.map +1 -1
- package/dist/registration/index.mjs +1 -1
- package/dist/registration/index.mjs.map +1 -1
- package/dist/sdk-CdO6TIEf.d.mts +142 -0
- package/dist/sdk-DxHuIJBm.d.ts +142 -0
- package/dist/transport/index.d.mts +2 -2
- package/dist/transport/index.d.ts +2 -2
- package/dist/transport/index.js +1 -1
- package/dist/transport/index.js.map +1 -1
- package/dist/transport/index.mjs +1 -1
- package/dist/transport/index.mjs.map +1 -1
- package/dist/{types-DhhJxKIC.d.ts → types-3UV7IZx7.d.ts} +1 -3
- package/dist/{types-CGPU7HLi.d.ts → types-CNBaZKxY.d.ts} +24 -50
- package/dist/{types-Cx9hTpKI.d.mts → types-CSHcByFX.d.mts} +24 -50
- package/dist/{types-CfSJLS4i.d.mts → types-CoDjpbVY.d.mts} +1 -3
- package/dist/ui/index.d.mts +2 -17
- package/dist/ui/index.d.ts +2 -17
- package/dist/ui/index.js +1 -43
- package/dist/ui/index.js.map +1 -1
- package/dist/ui/index.mjs +1 -42
- package/dist/ui/index.mjs.map +1 -1
- package/dist/verify.d.mts +3 -4
- package/dist/verify.d.ts +3 -4
- package/dist/verify.js +22 -30
- package/dist/verify.js.map +1 -1
- package/dist/verify.mjs +22 -30
- package/dist/verify.mjs.map +1 -1
- package/package.json +1 -1
- package/dist/sdk-B4aodEwj.d.ts +0 -215
- package/dist/sdk-B9dSwum7.d.mts +0 -215
package/dist/edge-core/index.mjs
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
// src/version.ts
|
|
2
|
-
var SDK_VERSION = "
|
|
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/
|
|
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
|
|
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
|
|
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
|
}
|