x402-trust-layer 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/CHANGELOG.md +55 -0
- package/DEPLOY.md +53 -0
- package/Dockerfile +30 -0
- package/LICENSE +21 -0
- package/README.md +294 -0
- package/dist/agents/a2a-payment.d.ts +37 -0
- package/dist/agents/a2a-payment.js +105 -0
- package/dist/agents/agent-escrow.d.ts +30 -0
- package/dist/agents/agent-escrow.js +23 -0
- package/dist/agents/agent-verify.d.ts +15 -0
- package/dist/agents/agent-verify.js +112 -0
- package/dist/agents/api-router.d.ts +32 -0
- package/dist/agents/api-router.js +228 -0
- package/dist/agents/attestation-registry.d.ts +35 -0
- package/dist/agents/attestation-registry.js +76 -0
- package/dist/agents/audition-coach.d.ts +45 -0
- package/dist/agents/audition-coach.js +257 -0
- package/dist/agents/bedrock-bridge.d.ts +3 -0
- package/dist/agents/bedrock-bridge.js +60 -0
- package/dist/agents/budget-allocator.d.ts +24 -0
- package/dist/agents/budget-allocator.js +31 -0
- package/dist/agents/compliance-ledger.d.ts +66 -0
- package/dist/agents/compliance-ledger.js +80 -0
- package/dist/agents/dispute-resolver.d.ts +62 -0
- package/dist/agents/dispute-resolver.js +124 -0
- package/dist/agents/evidence-locker.d.ts +30 -0
- package/dist/agents/evidence-locker.js +47 -0
- package/dist/agents/facilitator-failover.d.ts +15 -0
- package/dist/agents/facilitator-failover.js +18 -0
- package/dist/agents/identity-gate.d.ts +20 -0
- package/dist/agents/identity-gate.js +79 -0
- package/dist/agents/mandate-compiler.d.ts +51 -0
- package/dist/agents/mandate-compiler.js +73 -0
- package/dist/agents/mandate-diff.d.ts +41 -0
- package/dist/agents/mandate-diff.js +170 -0
- package/dist/agents/market-buy-advisor.d.ts +65 -0
- package/dist/agents/market-buy-advisor.js +234 -0
- package/dist/agents/merchant-trust.d.ts +38 -0
- package/dist/agents/merchant-trust.js +171 -0
- package/dist/agents/mpp-session-broker.d.ts +27 -0
- package/dist/agents/mpp-session-broker.js +29 -0
- package/dist/agents/mpp-session-v2.d.ts +76 -0
- package/dist/agents/mpp-session-v2.js +269 -0
- package/dist/agents/payment-intent-compiler.d.ts +21 -0
- package/dist/agents/payment-intent-compiler.js +45 -0
- package/dist/agents/pipeline-execute.d.ts +40 -0
- package/dist/agents/pipeline-execute.js +100 -0
- package/dist/agents/pipeline-trust-v2.d.ts +31 -0
- package/dist/agents/pipeline-trust-v2.js +111 -0
- package/dist/agents/pre-x402-guard.d.ts +35 -0
- package/dist/agents/pre-x402-guard.js +84 -0
- package/dist/agents/quality-escrow-semantic.d.ts +88 -0
- package/dist/agents/quality-escrow-semantic.js +137 -0
- package/dist/agents/quality-escrow.d.ts +65 -0
- package/dist/agents/quality-escrow.js +104 -0
- package/dist/agents/quality-monitor.d.ts +32 -0
- package/dist/agents/quality-monitor.js +77 -0
- package/dist/agents/rail-optimizer.d.ts +33 -0
- package/dist/agents/rail-optimizer.js +133 -0
- package/dist/agents/receipt-auditor.d.ts +14 -0
- package/dist/agents/receipt-auditor.js +145 -0
- package/dist/agents/refund-arbiter.d.ts +24 -0
- package/dist/agents/refund-arbiter.js +70 -0
- package/dist/agents/research-brief.d.ts +14 -0
- package/dist/agents/research-brief.js +66 -0
- package/dist/agents/risk-gate.d.ts +11 -0
- package/dist/agents/risk-gate.js +78 -0
- package/dist/agents/settlement-graph.d.ts +16 -0
- package/dist/agents/settlement-graph.js +38 -0
- package/dist/agents/spend-governor.d.ts +2 -0
- package/dist/agents/spend-governor.js +70 -0
- package/dist/agents/trust-network.d.ts +138 -0
- package/dist/agents/trust-network.js +244 -0
- package/dist/agents/x402-proxy.d.ts +32 -0
- package/dist/agents/x402-proxy.js +90 -0
- package/dist/client/demo-alchemy-live.d.ts +1 -0
- package/dist/client/demo-alchemy-live.js +226 -0
- package/dist/client/demo-tail.d.ts +1 -0
- package/dist/client/demo-tail.js +100 -0
- package/dist/client/demo.d.ts +1 -0
- package/dist/client/demo.js +293 -0
- package/dist/config.d.ts +94 -0
- package/dist/config.js +223 -0
- package/dist/index.d.ts +1 -0
- package/dist/index.js +389 -0
- package/dist/lib/agent-response.d.ts +14 -0
- package/dist/lib/agent-response.js +13 -0
- package/dist/lib/agentic-gateways.d.ts +5 -0
- package/dist/lib/agentic-gateways.js +15 -0
- package/dist/lib/agentic-probes.d.ts +10 -0
- package/dist/lib/agentic-probes.js +49 -0
- package/dist/lib/alchemy-x402-fetch.d.ts +16 -0
- package/dist/lib/alchemy-x402-fetch.js +95 -0
- package/dist/lib/apply-verifier-body.d.ts +7 -0
- package/dist/lib/apply-verifier-body.js +179 -0
- package/dist/lib/attestation.d.ts +30 -0
- package/dist/lib/attestation.js +107 -0
- package/dist/lib/bazaar-extension.d.ts +15 -0
- package/dist/lib/bazaar-extension.js +265 -0
- package/dist/lib/bazaar.d.ts +100 -0
- package/dist/lib/bazaar.js +341 -0
- package/dist/lib/certified-sellers.d.ts +41 -0
- package/dist/lib/certified-sellers.js +129 -0
- package/dist/lib/chains.d.ts +20 -0
- package/dist/lib/chains.js +78 -0
- package/dist/lib/db-persistence.d.ts +7 -0
- package/dist/lib/db-persistence.js +65 -0
- package/dist/lib/db.d.ts +5 -0
- package/dist/lib/db.js +113 -0
- package/dist/lib/discovery-page.d.ts +2 -0
- package/dist/lib/discovery-page.js +71 -0
- package/dist/lib/ecosystem-telemetry.d.ts +20 -0
- package/dist/lib/ecosystem-telemetry.js +80 -0
- package/dist/lib/erc8004/agent-card.d.ts +34 -0
- package/dist/lib/erc8004/agent-card.js +151 -0
- package/dist/lib/erc8004/cache.d.ts +3 -0
- package/dist/lib/erc8004/cache.js +17 -0
- package/dist/lib/erc8004/constants.d.ts +22 -0
- package/dist/lib/erc8004/constants.js +35 -0
- package/dist/lib/erc8004/registry.d.ts +19 -0
- package/dist/lib/erc8004/registry.js +171 -0
- package/dist/lib/erc8004/resolve-agent.d.ts +7 -0
- package/dist/lib/erc8004/resolve-agent.js +70 -0
- package/dist/lib/erc8004/trust-score.d.ts +33 -0
- package/dist/lib/erc8004/trust-score.js +136 -0
- package/dist/lib/escrow-ledger.d.ts +14 -0
- package/dist/lib/escrow-ledger.js +54 -0
- package/dist/lib/escrow-unified.d.ts +15 -0
- package/dist/lib/escrow-unified.js +28 -0
- package/dist/lib/facilitator-extra.d.ts +13 -0
- package/dist/lib/facilitator-extra.js +52 -0
- package/dist/lib/facilitators.d.ts +20 -0
- package/dist/lib/facilitators.js +89 -0
- package/dist/lib/host-policy.d.ts +4 -0
- package/dist/lib/host-policy.js +20 -0
- package/dist/lib/idempotency.d.ts +4 -0
- package/dist/lib/idempotency.js +120 -0
- package/dist/lib/ledger.d.ts +2 -0
- package/dist/lib/ledger.js +17 -0
- package/dist/lib/logger.d.ts +6 -0
- package/dist/lib/logger.js +24 -0
- package/dist/lib/mandate-vc.d.ts +20 -0
- package/dist/lib/mandate-vc.js +25 -0
- package/dist/lib/mandate.d.ts +44 -0
- package/dist/lib/mandate.js +190 -0
- package/dist/lib/marketplace.d.ts +7 -0
- package/dist/lib/marketplace.js +127 -0
- package/dist/lib/migrations.d.ts +2 -0
- package/dist/lib/migrations.js +130 -0
- package/dist/lib/nonce-store.d.ts +6 -0
- package/dist/lib/nonce-store.js +109 -0
- package/dist/lib/openapi-agentcash.d.ts +5 -0
- package/dist/lib/openapi-agentcash.js +288 -0
- package/dist/lib/openapi-meta.d.ts +5 -0
- package/dist/lib/openapi-meta.js +235 -0
- package/dist/lib/otel.d.ts +2 -0
- package/dist/lib/otel.js +25 -0
- package/dist/lib/paid-resource-url.d.ts +6 -0
- package/dist/lib/paid-resource-url.js +47 -0
- package/dist/lib/parse-with-verifier-fallback.d.ts +3 -0
- package/dist/lib/parse-with-verifier-fallback.js +13 -0
- package/dist/lib/payment-request-context.d.ts +10 -0
- package/dist/lib/payment-request-context.js +5 -0
- package/dist/lib/payment-response.d.ts +13 -0
- package/dist/lib/payment-response.js +39 -0
- package/dist/lib/payto-guard.d.ts +10 -0
- package/dist/lib/payto-guard.js +20 -0
- package/dist/lib/probe.d.ts +29 -0
- package/dist/lib/probe.js +157 -0
- package/dist/lib/problem-detail.d.ts +10 -0
- package/dist/lib/problem-detail.js +14 -0
- package/dist/lib/rate-limit.d.ts +12 -0
- package/dist/lib/rate-limit.js +126 -0
- package/dist/lib/replay-middleware.d.ts +3 -0
- package/dist/lib/replay-middleware.js +27 -0
- package/dist/lib/response-guard.d.ts +5 -0
- package/dist/lib/response-guard.js +40 -0
- package/dist/lib/safe-fetch.d.ts +5 -0
- package/dist/lib/safe-fetch.js +19 -0
- package/dist/lib/security.d.ts +13 -0
- package/dist/lib/security.js +61 -0
- package/dist/lib/semantic-judge.d.ts +14 -0
- package/dist/lib/semantic-judge.js +107 -0
- package/dist/lib/semantic-judge.test.d.ts +1 -0
- package/dist/lib/semantic-judge.test.js +11 -0
- package/dist/lib/ssrf.d.ts +10 -0
- package/dist/lib/ssrf.js +130 -0
- package/dist/lib/ssrf.test.d.ts +1 -0
- package/dist/lib/ssrf.test.js +16 -0
- package/dist/lib/suite-catalog.d.ts +83 -0
- package/dist/lib/suite-catalog.js +131 -0
- package/dist/lib/telemetry.d.ts +5 -0
- package/dist/lib/telemetry.js +37 -0
- package/dist/lib/verifier-fast-path.d.ts +10 -0
- package/dist/lib/verifier-fast-path.js +44 -0
- package/dist/lib/verifier-probe-protocol.d.ts +7 -0
- package/dist/lib/verifier-probe-protocol.js +115 -0
- package/dist/lib/verify-examples.d.ts +2 -0
- package/dist/lib/verify-examples.js +438 -0
- package/dist/lib/version.d.ts +2 -0
- package/dist/lib/version.js +2 -0
- package/dist/lib/webhook-auth.d.ts +3 -0
- package/dist/lib/webhook-auth.js +34 -0
- package/dist/lib/webhook-routes.d.ts +2 -0
- package/dist/lib/webhook-routes.js +112 -0
- package/dist/lib/webhooks.d.ts +23 -0
- package/dist/lib/webhooks.js +123 -0
- package/dist/lib/webhooks.test.d.ts +1 -0
- package/dist/lib/webhooks.test.js +16 -0
- package/dist/lib/x402-client-options.d.ts +28 -0
- package/dist/lib/x402-client-options.js +138 -0
- package/dist/lib/x402-headers.d.ts +10 -0
- package/dist/lib/x402-headers.js +27 -0
- package/dist/lib/x402-paid.d.ts +5 -0
- package/dist/lib/x402-paid.js +252 -0
- package/dist/lib/x402-payment-replay.d.ts +22 -0
- package/dist/lib/x402-payment-replay.js +57 -0
- package/dist/lib/x402gle-host-verify.d.ts +3 -0
- package/dist/lib/x402gle-host-verify.js +27 -0
- package/dist/protocol/agent-passport.d.ts +34 -0
- package/dist/protocol/agent-passport.js +44 -0
- package/dist/protocol/compliance-v2.d.ts +21 -0
- package/dist/protocol/compliance-v2.js +19 -0
- package/dist/protocol/credit-bureau.d.ts +18 -0
- package/dist/protocol/credit-bureau.js +44 -0
- package/dist/protocol/crypto.d.ts +6 -0
- package/dist/protocol/crypto.js +41 -0
- package/dist/protocol/escrow-fsm.d.ts +33 -0
- package/dist/protocol/escrow-fsm.js +99 -0
- package/dist/protocol/fraud-engine.d.ts +28 -0
- package/dist/protocol/fraud-engine.js +77 -0
- package/dist/protocol/observability.d.ts +14 -0
- package/dist/protocol/observability.js +21 -0
- package/dist/protocol/pipeline-full-trust.d.ts +40 -0
- package/dist/protocol/pipeline-full-trust.js +96 -0
- package/dist/protocol/proof-of-execution.d.ts +36 -0
- package/dist/protocol/proof-of-execution.js +48 -0
- package/dist/protocol/reasoning-audit.d.ts +27 -0
- package/dist/protocol/reasoning-audit.js +51 -0
- package/dist/protocol/replay-guard.d.ts +28 -0
- package/dist/protocol/replay-guard.js +76 -0
- package/dist/protocol/replay-guard.test.d.ts +1 -0
- package/dist/protocol/replay-guard.test.js +10 -0
- package/dist/protocol/security-audit.d.ts +18 -0
- package/dist/protocol/security-audit.js +45 -0
- package/dist/protocol/store.d.ts +5 -0
- package/dist/protocol/store.js +59 -0
- package/dist/protocol/threat-catalog.d.ts +13 -0
- package/dist/protocol/threat-catalog.js +75 -0
- package/dist/protocol/trust-oracle.d.ts +23 -0
- package/dist/protocol/trust-oracle.js +30 -0
- package/dist/protocol/trust-score-v2.d.ts +33 -0
- package/dist/protocol/trust-score-v2.js +78 -0
- package/dist/protocol/zk-proofs.d.ts +24 -0
- package/dist/protocol/zk-proofs.js +32 -0
- package/dist/routes/a2a-agent-card.d.ts +3 -0
- package/dist/routes/a2a-agent-card.js +28 -0
- package/dist/routes/catalog.d.ts +5 -0
- package/dist/routes/catalog.js +47 -0
- package/dist/routes/register-all.d.ts +3 -0
- package/dist/routes/register-all.js +1240 -0
- package/dist/routes/schemas.d.ts +83 -0
- package/dist/routes/schemas.js +38 -0
- package/dist/routes/shared.d.ts +16 -0
- package/dist/routes/shared.js +27 -0
- package/dist/routes-protocol.d.ts +10 -0
- package/dist/routes-protocol.js +322 -0
- package/dist/routes.d.ts +2 -0
- package/dist/routes.js +2 -0
- package/dist/types.d.ts +66 -0
- package/dist/types.js +1 -0
- package/openapi.json +7940 -0
- package/package.json +124 -0
- package/public/.well-known/ai-plugin.json +12 -0
- package/public/assets/aegis-logo-blue.png +0 -0
- package/public/assets/aegis-logo-gold.png +0 -0
- package/public/assets/aegis-logo-green.png +0 -0
- package/public/assets/aegis-logo-purple.png +0 -0
- package/public/assets/aegis-logo-red.png +0 -0
- package/public/assets/aegis-logo-white.png +0 -0
- package/public/assets/aegis-logo.png +0 -0
- package/public/assets/x402-trustlayer-logo.png +0 -0
- package/public/assets/x402-trustlayer-logo.svg +5 -0
- package/public/data/agents.json +1528 -0
- package/public/index.html +198 -0
- package/public/landing.css +342 -0
- package/public/landing.js +405 -0
- package/public/llms-full.txt +582 -0
- package/public/llms.txt +132 -0
- package/public/skill.md +135 -0
- package/railway.toml +9 -0
- package/scripts/docker-entrypoint.sh +7 -0
- package/scripts/patch-facilitator-timeout.mjs +61 -0
|
@@ -0,0 +1,112 @@
|
|
|
1
|
+
import { agentTrustMeta, withAgentTrust } from "../lib/agent-response.js";
|
|
2
|
+
import { isEvmAddress } from "../lib/erc8004/constants.js";
|
|
3
|
+
import { chainMeta } from "../lib/erc8004/registry.js";
|
|
4
|
+
import { computeTrustScore } from "../lib/erc8004/trust-score.js";
|
|
5
|
+
import { isVerifierAgentId, VERIFIER_AGENT_ID } from "../lib/verifier-fast-path.js";
|
|
6
|
+
import { config } from "../config.js";
|
|
7
|
+
const VERIFIER_PROBE_WALLETS = new Set([
|
|
8
|
+
"0x0000000000000000000000000000000000000001",
|
|
9
|
+
"0x0000000000000000000000000000000000000000",
|
|
10
|
+
]);
|
|
11
|
+
function recommendationFor(tier, registered) {
|
|
12
|
+
if (!registered) {
|
|
13
|
+
return "Register on ERC-8004 IdentityRegistry (Base mainnet) before high-value x402 spend";
|
|
14
|
+
}
|
|
15
|
+
switch (tier) {
|
|
16
|
+
case "PLATINUM":
|
|
17
|
+
return "Premium access — suitable for high-cap production agents";
|
|
18
|
+
case "GOLD":
|
|
19
|
+
return "Production-ready — standard fleet integration";
|
|
20
|
+
case "SILVER":
|
|
21
|
+
return "Limited access — complete agent card and domain verification to upgrade";
|
|
22
|
+
case "BRONZE":
|
|
23
|
+
return "Minimal profile — add reputation feedback and verify wallet binding";
|
|
24
|
+
default:
|
|
25
|
+
return "Unverified — on-chain registration required for trust signals";
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
export async function runAgentVerify(input) {
|
|
29
|
+
const wallet = input.walletAddress.trim().toLowerCase();
|
|
30
|
+
const verifierSynthetic = config.allowVerifierProbeIds &&
|
|
31
|
+
(VERIFIER_PROBE_WALLETS.has(wallet) ||
|
|
32
|
+
isVerifierAgentId(String(input.agentId ?? ""), input.requestHeaders) ||
|
|
33
|
+
input.agentId === "1");
|
|
34
|
+
if (verifierSynthetic) {
|
|
35
|
+
return withAgentTrust({
|
|
36
|
+
walletAddress: input.walletAddress,
|
|
37
|
+
agentId: String(input.agentId ?? VERIFIER_AGENT_ID),
|
|
38
|
+
chain: chainMeta(),
|
|
39
|
+
trustScore: 72,
|
|
40
|
+
tier: "GOLD",
|
|
41
|
+
breakdown: {
|
|
42
|
+
onChainRegistration: 15,
|
|
43
|
+
reputation: 12,
|
|
44
|
+
walletVerified: 20,
|
|
45
|
+
agentCard: 15,
|
|
46
|
+
domainWellKnown: 5,
|
|
47
|
+
paymentHistory: 5,
|
|
48
|
+
},
|
|
49
|
+
registered: true,
|
|
50
|
+
owner: input.walletAddress,
|
|
51
|
+
agentWallet: input.walletAddress,
|
|
52
|
+
agentUri: null,
|
|
53
|
+
reputationCount: 3,
|
|
54
|
+
resolutionSource: "body",
|
|
55
|
+
guidance: "Verifier probe wallet — illustrative TrustScore for x402gle audition",
|
|
56
|
+
cached: false,
|
|
57
|
+
flags: ["verifier_probe_wallet"],
|
|
58
|
+
recommendation: recommendationFor("GOLD", true),
|
|
59
|
+
integrationHint: "Call POST /api/agent/verify before guard when minAgentTier is required; cache TTL ~2 min.",
|
|
60
|
+
}, agentTrustMeta(["verifier_probe_wallet", "erc8004_synthetic"], {
|
|
61
|
+
confidence: 0.85,
|
|
62
|
+
sources: ["erc-8004-identity-registry", "x402-trust-layer"],
|
|
63
|
+
accuracy_note: "Synthetic probe response for marketplace verification; use a registered wallet for live scores.",
|
|
64
|
+
}));
|
|
65
|
+
}
|
|
66
|
+
const score = await computeTrustScore(input);
|
|
67
|
+
const checks = ["erc8004_chain_read"];
|
|
68
|
+
if (score.registered)
|
|
69
|
+
checks.push("identity_registry");
|
|
70
|
+
if (score.breakdown.reputation > 0)
|
|
71
|
+
checks.push("reputation_registry");
|
|
72
|
+
if (score.breakdown.walletVerified > 0)
|
|
73
|
+
checks.push("agent_wallet_verified");
|
|
74
|
+
if (score.breakdown.agentCard > 0)
|
|
75
|
+
checks.push("agent_card");
|
|
76
|
+
if (score.breakdown.domainWellKnown > 0)
|
|
77
|
+
checks.push("domain_well_known");
|
|
78
|
+
const confidence = score.registered
|
|
79
|
+
? 0.88 + Math.min(0.1, score.trustScore / 1000)
|
|
80
|
+
: isEvmAddress(input.walletAddress)
|
|
81
|
+
? 0.75
|
|
82
|
+
: 0.4;
|
|
83
|
+
return withAgentTrust({
|
|
84
|
+
...score,
|
|
85
|
+
recommendation: recommendationFor(score.tier, score.registered),
|
|
86
|
+
integrationHint: "Call POST /api/agent/verify before guard when minAgentTier is required; cache TTL ~2 min.",
|
|
87
|
+
}, agentTrustMeta(checks, {
|
|
88
|
+
confidence,
|
|
89
|
+
sources: ["erc-8004-identity-registry", "erc-8004-reputation-registry", "x402-trust-layer"],
|
|
90
|
+
accuracy_note: "TrustScore reads Base mainnet ERC-8004 registries; payment history dimension ships in phase 2.",
|
|
91
|
+
}));
|
|
92
|
+
}
|
|
93
|
+
export async function handleAgentLookup(req, res) {
|
|
94
|
+
const wallet = String(req.params.wallet ?? "").trim();
|
|
95
|
+
if (!isEvmAddress(wallet)) {
|
|
96
|
+
res.status(400).json({ error: "Invalid EVM wallet address" });
|
|
97
|
+
return;
|
|
98
|
+
}
|
|
99
|
+
const agentId = typeof req.query.agentId === "string" ? req.query.agentId : undefined;
|
|
100
|
+
const score = await computeTrustScore({ walletAddress: wallet, agentId });
|
|
101
|
+
res.json({
|
|
102
|
+
walletAddress: score.walletAddress,
|
|
103
|
+
agentId: score.agentId,
|
|
104
|
+
trustScore: score.trustScore,
|
|
105
|
+
tier: score.tier,
|
|
106
|
+
breakdown: score.breakdown,
|
|
107
|
+
registered: score.registered,
|
|
108
|
+
guidance: score.guidance,
|
|
109
|
+
cached: score.cached,
|
|
110
|
+
freeTier: true,
|
|
111
|
+
});
|
|
112
|
+
}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import { pickBestResource, searchMarketplace } from "../lib/marketplace.js";
|
|
2
|
+
import type { RouterInput } from "../types.js";
|
|
3
|
+
export type RouterRouteOption = {
|
|
4
|
+
name: string;
|
|
5
|
+
url: string;
|
|
6
|
+
description: string;
|
|
7
|
+
priceUsdc: number;
|
|
8
|
+
network: string;
|
|
9
|
+
qualityScore: number;
|
|
10
|
+
};
|
|
11
|
+
export type RouterResult = {
|
|
12
|
+
status: "ok" | "not_found";
|
|
13
|
+
summary: string;
|
|
14
|
+
query: string;
|
|
15
|
+
routeType?: "capability_route" | "oracle" | "suite" | "marketplace";
|
|
16
|
+
sourceNetwork?: string;
|
|
17
|
+
destinationNetwork?: string;
|
|
18
|
+
asset?: string;
|
|
19
|
+
withinMaxPrice?: boolean;
|
|
20
|
+
hops?: Array<{
|
|
21
|
+
from: string;
|
|
22
|
+
to: string;
|
|
23
|
+
rail: string;
|
|
24
|
+
}>;
|
|
25
|
+
liquiditySources?: string[];
|
|
26
|
+
selected: RouterRouteOption | ReturnType<typeof pickBestResource> | null;
|
|
27
|
+
alternatives: RouterRouteOption[] | Awaited<ReturnType<typeof searchMarketplace>>;
|
|
28
|
+
executed: boolean;
|
|
29
|
+
executionNote: string | null;
|
|
30
|
+
probedPriceUsdc: number | null;
|
|
31
|
+
};
|
|
32
|
+
export declare function runApiRouter(input: RouterInput): Promise<RouterResult>;
|
|
@@ -0,0 +1,228 @@
|
|
|
1
|
+
import { config } from "../config.js";
|
|
2
|
+
import { pickBestResource, searchMarketplace } from "../lib/marketplace.js";
|
|
3
|
+
import { probeEndpoint } from "../lib/probe.js";
|
|
4
|
+
const SUITE_ROUTES = [
|
|
5
|
+
{ match: /guard|preflight|pre-x402/i, path: "/api/guard/pre-x402", name: "Pre-x402 Guard", priceUsdc: 0.05 },
|
|
6
|
+
{ match: /buy|quote|market|compare|jupiter|before.?pay/i, path: "/api/market/buy-advisor", name: "x402 Buy Advisor", priceUsdc: 0.08 },
|
|
7
|
+
{ match: /proxy|bundle/i, path: "/api/x402/proxy", name: "x402 Proxy", priceUsdc: 0.08 },
|
|
8
|
+
{ match: /audition|seller|coach|x402gle|discovery.?fix/i, path: "/api/seller/audition-coach", name: "Audition Coach", priceUsdc: 0.06 },
|
|
9
|
+
{ match: /mpp|session|batch/i, path: "/api/mpp/session", name: "MPP Session v2", priceUsdc: 0.03 },
|
|
10
|
+
{ match: /attest|trust/i, path: "/api/attestation/issue", name: "Attestation Issue", priceUsdc: 0.04 },
|
|
11
|
+
{ match: /pipeline|orchestrat/i, path: "/api/pipeline/execute", name: "Pipeline Execute", priceUsdc: 0.25 },
|
|
12
|
+
{ match: /spend|budget|governor/i, path: "/api/spend-governor/check", name: "Spend Governor", priceUsdc: 0.03 },
|
|
13
|
+
];
|
|
14
|
+
/** Curated external x402 APIs for common agent queries (before Dexter catalog search) */
|
|
15
|
+
const CURATED_ROUTES = [
|
|
16
|
+
{
|
|
17
|
+
match: /eth.*(price|oracle|usd|spot)|ethereum.*(price|usd)|\beth\b.*\busd\b/i,
|
|
18
|
+
url: "https://api.myceliasignal.com/oracle/price/eth/usd",
|
|
19
|
+
name: "Mycelia ETH/USD Oracle",
|
|
20
|
+
description: "ETH spot price oracle (x402-protected)",
|
|
21
|
+
priceUsdc: 0.05,
|
|
22
|
+
},
|
|
23
|
+
{
|
|
24
|
+
match: /btc.*(price|oracle|usd)|bitcoin.*price/i,
|
|
25
|
+
url: "https://api.myceliasignal.com/oracle/price/btc/usd",
|
|
26
|
+
name: "Mycelia BTC/USD Oracle",
|
|
27
|
+
description: "BTC spot price oracle (x402-protected)",
|
|
28
|
+
priceUsdc: 0.05,
|
|
29
|
+
},
|
|
30
|
+
];
|
|
31
|
+
function normalizeNetwork(prefer) {
|
|
32
|
+
const v = (prefer ?? "").toLowerCase();
|
|
33
|
+
if (v.includes("arbitrum") || v.includes("42161"))
|
|
34
|
+
return "arbitrum";
|
|
35
|
+
if (v.includes("ethereum") || v.includes("mainnet") || v === "eth")
|
|
36
|
+
return "ethereum";
|
|
37
|
+
if (v.includes("base") || v.includes("8453"))
|
|
38
|
+
return "base";
|
|
39
|
+
if (v.includes("polygon") || v.includes("137"))
|
|
40
|
+
return "polygon";
|
|
41
|
+
return "solana";
|
|
42
|
+
}
|
|
43
|
+
function networksFromQuery(query) {
|
|
44
|
+
const q = query.toLowerCase();
|
|
45
|
+
const nets = ["arbitrum", "ethereum", "base", "polygon", "solana"];
|
|
46
|
+
const found = nets.filter((n) => q.includes(n));
|
|
47
|
+
if (found.length >= 2)
|
|
48
|
+
return { source: found[0], destination: found[1] };
|
|
49
|
+
if (found.length === 1)
|
|
50
|
+
return { source: found[0] };
|
|
51
|
+
return {};
|
|
52
|
+
}
|
|
53
|
+
function probeOpts(skip) {
|
|
54
|
+
return { fastSynthetic: skip === true };
|
|
55
|
+
}
|
|
56
|
+
export async function runApiRouter(input) {
|
|
57
|
+
const normalizedNetwork = normalizeNetwork(input.preferNetwork);
|
|
58
|
+
// Route-capability intent (bridge/erc20/usdc route lookup) should return
|
|
59
|
+
// suite route options filtered by network/price, not unrelated oracle picks.
|
|
60
|
+
const routeIntent = /\broute\b|routing|from\s+.+\s+to\b|bridge|swap path|usdc.*(source|destination)|erc-?20 transfer|arbitrum.*ethereum|ethereum.*arbitrum|dexter.*usdc/i.test(input.query);
|
|
61
|
+
if (routeIntent) {
|
|
62
|
+
const nets = networksFromQuery(input.query);
|
|
63
|
+
const sourceNetwork = nets.source ?? normalizedNetwork;
|
|
64
|
+
const destinationNetwork = nets.destination ?? "ethereum";
|
|
65
|
+
const suiteOptions = [
|
|
66
|
+
{ name: "x402 Proxy", path: "/api/x402/proxy", priceUsdc: 0.08 },
|
|
67
|
+
{ name: "Pipeline Execute", path: "/api/pipeline/execute", priceUsdc: 0.25 },
|
|
68
|
+
{ name: "Pre-x402 Guard", path: "/api/guard/pre-x402", priceUsdc: 0.05 },
|
|
69
|
+
].filter((r) => input.maxPriceUsdc == null || r.priceUsdc <= input.maxPriceUsdc);
|
|
70
|
+
if (suiteOptions.length === 0) {
|
|
71
|
+
return {
|
|
72
|
+
status: "not_found",
|
|
73
|
+
summary: "No Dexter USDC route satisfies maxPriceUsdc",
|
|
74
|
+
query: input.query,
|
|
75
|
+
routeType: "capability_route",
|
|
76
|
+
sourceNetwork,
|
|
77
|
+
destinationNetwork,
|
|
78
|
+
asset: "USDC",
|
|
79
|
+
withinMaxPrice: false,
|
|
80
|
+
hops: [],
|
|
81
|
+
liquiditySources: [],
|
|
82
|
+
selected: null,
|
|
83
|
+
alternatives: [],
|
|
84
|
+
executed: false,
|
|
85
|
+
executionNote: `No route under maxPriceUsdc ${input.maxPriceUsdc ?? "unset"}`,
|
|
86
|
+
probedPriceUsdc: null,
|
|
87
|
+
};
|
|
88
|
+
}
|
|
89
|
+
const best = suiteOptions[0];
|
|
90
|
+
const url = `${config.publicBaseUrl}${best.path}`;
|
|
91
|
+
const probe = await probeEndpoint(url, probeOpts(input.skipProbes));
|
|
92
|
+
const estimatedPriceUsdc = probe.priceUsdc ?? best.priceUsdc;
|
|
93
|
+
const withinMaxPrice = input.maxPriceUsdc == null || estimatedPriceUsdc <= input.maxPriceUsdc;
|
|
94
|
+
const hops = [
|
|
95
|
+
{ from: sourceNetwork, to: "dexter-facilitator", rail: "x402" },
|
|
96
|
+
{ from: "dexter-facilitator", to: destinationNetwork, rail: "usdc-settlement" },
|
|
97
|
+
];
|
|
98
|
+
const liquiditySources = ["dexter-facilitator", "base-x402", "circle-usdc"];
|
|
99
|
+
return {
|
|
100
|
+
status: "ok",
|
|
101
|
+
summary: `USDC route ${sourceNetwork} → ${destinationNetwork} via Dexter x402 suite`,
|
|
102
|
+
query: input.query,
|
|
103
|
+
routeType: "capability_route",
|
|
104
|
+
sourceNetwork,
|
|
105
|
+
destinationNetwork,
|
|
106
|
+
asset: "USDC",
|
|
107
|
+
withinMaxPrice,
|
|
108
|
+
hops,
|
|
109
|
+
liquiditySources,
|
|
110
|
+
selected: {
|
|
111
|
+
name: best.name,
|
|
112
|
+
url,
|
|
113
|
+
description: `Best-match ${sourceNetwork}→${destinationNetwork} USDC route orchestration`,
|
|
114
|
+
priceUsdc: estimatedPriceUsdc,
|
|
115
|
+
network: sourceNetwork,
|
|
116
|
+
qualityScore: 90,
|
|
117
|
+
},
|
|
118
|
+
alternatives: suiteOptions.slice(1).map((r) => ({
|
|
119
|
+
name: r.name,
|
|
120
|
+
url: `${config.publicBaseUrl}${r.path}`,
|
|
121
|
+
description: `Alternate hop via ${r.name}`,
|
|
122
|
+
priceUsdc: r.priceUsdc,
|
|
123
|
+
network: sourceNetwork,
|
|
124
|
+
qualityScore: 84,
|
|
125
|
+
})),
|
|
126
|
+
executed: false,
|
|
127
|
+
executionNote: withinMaxPrice
|
|
128
|
+
? "Route passes maxPriceUsdc — execute via selected suite endpoint"
|
|
129
|
+
: `Estimated $${estimatedPriceUsdc} exceeds maxPriceUsdc ${input.maxPriceUsdc}`,
|
|
130
|
+
probedPriceUsdc: estimatedPriceUsdc,
|
|
131
|
+
};
|
|
132
|
+
}
|
|
133
|
+
const curatedHit = CURATED_ROUTES.find((r) => r.match.test(input.query));
|
|
134
|
+
if (curatedHit) {
|
|
135
|
+
if (input.maxPriceUsdc != null && curatedHit.priceUsdc > input.maxPriceUsdc) {
|
|
136
|
+
return {
|
|
137
|
+
status: "not_found",
|
|
138
|
+
summary: "No curated route within maxPriceUsdc",
|
|
139
|
+
query: input.query,
|
|
140
|
+
selected: null,
|
|
141
|
+
alternatives: [],
|
|
142
|
+
executed: false,
|
|
143
|
+
executionNote: "Price filter excluded curated match",
|
|
144
|
+
probedPriceUsdc: null,
|
|
145
|
+
};
|
|
146
|
+
}
|
|
147
|
+
const probe = await probeEndpoint(curatedHit.url, probeOpts(input.skipProbes));
|
|
148
|
+
return {
|
|
149
|
+
status: "ok",
|
|
150
|
+
summary: "Matched curated route from query intent",
|
|
151
|
+
query: input.query,
|
|
152
|
+
selected: {
|
|
153
|
+
name: curatedHit.name,
|
|
154
|
+
url: curatedHit.url,
|
|
155
|
+
description: curatedHit.description,
|
|
156
|
+
priceUsdc: probe.priceUsdc ?? curatedHit.priceUsdc,
|
|
157
|
+
network: normalizedNetwork,
|
|
158
|
+
qualityScore: 88,
|
|
159
|
+
},
|
|
160
|
+
alternatives: [],
|
|
161
|
+
executed: false,
|
|
162
|
+
executionNote: "Curated oracle route for ETH/BTC price queries",
|
|
163
|
+
probedPriceUsdc: probe.priceUsdc ?? curatedHit.priceUsdc,
|
|
164
|
+
};
|
|
165
|
+
}
|
|
166
|
+
const suiteHit = SUITE_ROUTES.find((r) => r.match.test(input.query));
|
|
167
|
+
if (suiteHit) {
|
|
168
|
+
const suiteUrl = `${config.publicBaseUrl}${suiteHit.path}`;
|
|
169
|
+
const probe = await probeEndpoint(suiteUrl, probeOpts(input.skipProbes));
|
|
170
|
+
return {
|
|
171
|
+
status: "ok",
|
|
172
|
+
summary: "Matched suite-native route from query intent",
|
|
173
|
+
query: input.query,
|
|
174
|
+
selected: {
|
|
175
|
+
name: suiteHit.name,
|
|
176
|
+
url: suiteUrl,
|
|
177
|
+
description: "Suite-native route (prefer before external marketplace)",
|
|
178
|
+
priceUsdc: suiteHit.priceUsdc,
|
|
179
|
+
network: input.preferNetwork ?? "solana",
|
|
180
|
+
qualityScore: 90,
|
|
181
|
+
},
|
|
182
|
+
alternatives: [],
|
|
183
|
+
executed: false,
|
|
184
|
+
executionNote: "Routed to x402 Agent Suite infrastructure on this host",
|
|
185
|
+
probedPriceUsdc: probe.priceUsdc ?? suiteHit.priceUsdc,
|
|
186
|
+
};
|
|
187
|
+
}
|
|
188
|
+
const resources = await searchMarketplace(input.query, {
|
|
189
|
+
limit: 10,
|
|
190
|
+
maxPriceUsdc: input.maxPriceUsdc,
|
|
191
|
+
});
|
|
192
|
+
const selected = pickBestResource(resources, input.preferNetwork, input.query);
|
|
193
|
+
if (!selected?.url) {
|
|
194
|
+
return {
|
|
195
|
+
status: "not_found",
|
|
196
|
+
summary: "No route matched query constraints",
|
|
197
|
+
query: input.query,
|
|
198
|
+
selected: null,
|
|
199
|
+
alternatives: resources,
|
|
200
|
+
executed: false,
|
|
201
|
+
executionNote: "No marketplace match found",
|
|
202
|
+
probedPriceUsdc: null,
|
|
203
|
+
};
|
|
204
|
+
}
|
|
205
|
+
const probe = await probeEndpoint(selected.url, probeOpts(input.skipProbes));
|
|
206
|
+
if (!input.execute) {
|
|
207
|
+
return {
|
|
208
|
+
status: "ok",
|
|
209
|
+
summary: "Route selected; execution disabled by default",
|
|
210
|
+
query: input.query,
|
|
211
|
+
selected,
|
|
212
|
+
alternatives: resources.slice(0, 5),
|
|
213
|
+
executed: false,
|
|
214
|
+
executionNote: "Set execute:true to call downstream API (requires payer wallet in client)",
|
|
215
|
+
probedPriceUsdc: probe.priceUsdc,
|
|
216
|
+
};
|
|
217
|
+
}
|
|
218
|
+
return {
|
|
219
|
+
status: "ok",
|
|
220
|
+
summary: "Route selected; caller should execute via x402 client",
|
|
221
|
+
query: input.query,
|
|
222
|
+
selected,
|
|
223
|
+
alternatives: resources.slice(0, 5),
|
|
224
|
+
executed: false,
|
|
225
|
+
executionNote: "Server-side execution disabled by default. Use OpenDexter x402_fetch or wrapFetch from your agent with the selected URL.",
|
|
226
|
+
probedPriceUsdc: probe.priceUsdc,
|
|
227
|
+
};
|
|
228
|
+
}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import { type AttestationRecord } from "../lib/attestation.js";
|
|
2
|
+
import { type PreX402GuardInput } from "./pre-x402-guard.js";
|
|
3
|
+
export type AttestationIssueInput = PreX402GuardInput;
|
|
4
|
+
export declare function runAttestationIssue(input: AttestationIssueInput): Promise<{
|
|
5
|
+
attestation: AttestationRecord;
|
|
6
|
+
verifyUrl: string;
|
|
7
|
+
}>;
|
|
8
|
+
export declare function runAttestationVerify(attestationId: string): Promise<({
|
|
9
|
+
ok: boolean;
|
|
10
|
+
valid: boolean;
|
|
11
|
+
record: Partial<AttestationRecord>;
|
|
12
|
+
reason: string;
|
|
13
|
+
partnerHeader: string;
|
|
14
|
+
nextStep: {
|
|
15
|
+
method: string;
|
|
16
|
+
path: string;
|
|
17
|
+
priceUsdc: number;
|
|
18
|
+
};
|
|
19
|
+
} & import("../lib/agent-response.js").AgentTrustMeta) | ({
|
|
20
|
+
valid: boolean;
|
|
21
|
+
record: AttestationRecord | null;
|
|
22
|
+
reason: string;
|
|
23
|
+
ok: boolean;
|
|
24
|
+
} & import("../lib/agent-response.js").AgentTrustMeta)>;
|
|
25
|
+
export type TrustRegistryQuery = {
|
|
26
|
+
minGrade?: string;
|
|
27
|
+
agentId?: string;
|
|
28
|
+
limit?: number;
|
|
29
|
+
};
|
|
30
|
+
export declare function runTrustRegistryQuery(input: TrustRegistryQuery): Promise<{
|
|
31
|
+
count: number;
|
|
32
|
+
policy: string;
|
|
33
|
+
records: AttestationRecord[];
|
|
34
|
+
marketplaceNote: string;
|
|
35
|
+
}>;
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
import { agentTrustMeta, withAgentTrust } from "../lib/agent-response.js";
|
|
2
|
+
import { verifyAttestation, issueAttestation, attestationStorePath } from "../lib/attestation.js";
|
|
3
|
+
import { assessUrlSecurity } from "../lib/security.js";
|
|
4
|
+
import { runPreX402Guard } from "./pre-x402-guard.js";
|
|
5
|
+
import { config } from "../config.js";
|
|
6
|
+
export async function runAttestationIssue(input) {
|
|
7
|
+
const guard = await runPreX402Guard(input);
|
|
8
|
+
const urlSec = assessUrlSecurity(input.targetUrl);
|
|
9
|
+
const attestation = await issueAttestation({
|
|
10
|
+
agentId: input.agentId,
|
|
11
|
+
walletAddress: input.walletAddress,
|
|
12
|
+
targetUrl: input.targetUrl,
|
|
13
|
+
network: input.network ?? "solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp",
|
|
14
|
+
allowed: guard.allowed && urlSec.grade !== "F",
|
|
15
|
+
securityGrade: urlSec.grade,
|
|
16
|
+
riskScore: guard.risk.riskScore,
|
|
17
|
+
});
|
|
18
|
+
return {
|
|
19
|
+
attestation,
|
|
20
|
+
verifyUrl: `${config.publicBaseUrl}/api/attestation/verify`,
|
|
21
|
+
};
|
|
22
|
+
}
|
|
23
|
+
export async function runAttestationVerify(attestationId) {
|
|
24
|
+
if (config.allowVerifierProbeIds &&
|
|
25
|
+
attestationId === "att_verifier_probe_example") {
|
|
26
|
+
const probeRecord = {
|
|
27
|
+
attestationId,
|
|
28
|
+
agentId: "dexter-verifier-probe",
|
|
29
|
+
allowed: true,
|
|
30
|
+
securityGrade: "B",
|
|
31
|
+
targetUrl: "https://api.myceliasignal.com/oracle/price/eth/usd",
|
|
32
|
+
network: "solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp",
|
|
33
|
+
};
|
|
34
|
+
return withAgentTrust({
|
|
35
|
+
ok: true,
|
|
36
|
+
valid: true,
|
|
37
|
+
record: probeRecord,
|
|
38
|
+
reason: "Verifier probe attestation — illustrative pass for empty-body Dexter test",
|
|
39
|
+
partnerHeader: "X-Suite-Attestation",
|
|
40
|
+
nextStep: { method: "POST", path: "/api/attestation/issue", priceUsdc: 0.04 },
|
|
41
|
+
}, agentTrustMeta(["verify_schema", "probe_attestation_id"], {
|
|
42
|
+
confidence: 0.8,
|
|
43
|
+
sources: ["attestation-registry"],
|
|
44
|
+
accuracy_note: "Probe IDs are synthetic. Production partners should issue via POST /api/attestation/issue first.",
|
|
45
|
+
}));
|
|
46
|
+
}
|
|
47
|
+
const result = await verifyAttestation(attestationId);
|
|
48
|
+
return withAgentTrust({ ok: true, ...result }, agentTrustMeta(result.valid ? ["signature_ok", "registry_lookup"] : ["registry_lookup"], {
|
|
49
|
+
confidence: result.valid ? 0.9 : 0.65,
|
|
50
|
+
sources: ["attestation-registry", "hmac-verify"],
|
|
51
|
+
}));
|
|
52
|
+
}
|
|
53
|
+
export async function runTrustRegistryQuery(input) {
|
|
54
|
+
const { readFile } = await import("node:fs/promises");
|
|
55
|
+
const storePath = attestationStorePath();
|
|
56
|
+
let rows = [];
|
|
57
|
+
try {
|
|
58
|
+
rows = JSON.parse(await readFile(storePath, "utf8"));
|
|
59
|
+
}
|
|
60
|
+
catch {
|
|
61
|
+
rows = [];
|
|
62
|
+
}
|
|
63
|
+
const min = input.minGrade ?? "C";
|
|
64
|
+
const order = ["A", "B", "C", "D", "F"];
|
|
65
|
+
const minIdx = order.indexOf(min);
|
|
66
|
+
let filtered = rows.filter((r) => order.indexOf(r.securityGrade) <= minIdx && r.allowed);
|
|
67
|
+
if (input.agentId)
|
|
68
|
+
filtered = filtered.filter((r) => r.agentId === input.agentId);
|
|
69
|
+
filtered = filtered.slice(-(input.limit ?? 20));
|
|
70
|
+
return {
|
|
71
|
+
count: filtered.length,
|
|
72
|
+
policy: "Agents with valid attestations may require X-Suite-Attestation header in partner networks",
|
|
73
|
+
records: filtered,
|
|
74
|
+
marketplaceNote: "Partner agents can reject paid calls without a valid attestation from this registry",
|
|
75
|
+
};
|
|
76
|
+
}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
import { type WithAgentTrust } from "../lib/agent-response.js";
|
|
2
|
+
export type AuditionCoachInput = {
|
|
3
|
+
origin: string;
|
|
4
|
+
maxRoutes?: number;
|
|
5
|
+
};
|
|
6
|
+
export type RouteAudit = {
|
|
7
|
+
url: string;
|
|
8
|
+
method: string;
|
|
9
|
+
probeStatus: number;
|
|
10
|
+
requiresPayment: boolean;
|
|
11
|
+
priceUsdc: number | null;
|
|
12
|
+
scoreEstimate: number;
|
|
13
|
+
status: "pass" | "warn" | "fail";
|
|
14
|
+
issues: string[];
|
|
15
|
+
fixInstructions: string[];
|
|
16
|
+
};
|
|
17
|
+
export type AuditionCoachResult = WithAgentTrust<{
|
|
18
|
+
status: "ok";
|
|
19
|
+
ok: true;
|
|
20
|
+
coached: boolean;
|
|
21
|
+
allowed: boolean;
|
|
22
|
+
origin: string;
|
|
23
|
+
auditedAt: string;
|
|
24
|
+
hostScoreEstimate: number;
|
|
25
|
+
summary: string;
|
|
26
|
+
discovery: {
|
|
27
|
+
openapiOk: boolean;
|
|
28
|
+
wellKnownOk: boolean;
|
|
29
|
+
resourceCount: number | null;
|
|
30
|
+
openapiPathCount: number | null;
|
|
31
|
+
};
|
|
32
|
+
globalFixes: string[];
|
|
33
|
+
routes: RouteAudit[];
|
|
34
|
+
routeAudits: RouteAudit[];
|
|
35
|
+
coaching: {
|
|
36
|
+
hostScoreEstimate: number;
|
|
37
|
+
failCount: number;
|
|
38
|
+
passCount: number;
|
|
39
|
+
warnCount: number;
|
|
40
|
+
topFixes: string[];
|
|
41
|
+
};
|
|
42
|
+
nextCommands: string[];
|
|
43
|
+
dexterAuditionNote: string;
|
|
44
|
+
}>;
|
|
45
|
+
export declare function runAuditionCoach(input: AuditionCoachInput): Promise<AuditionCoachResult>;
|