@scriptmasterlabs/mcp-x402 2.1.1 → 2.1.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.
- package/.well-known/agentcard.json +34 -0
- package/.well-known/ai.txt +32 -0
- package/CONTRIBUTING.md +76 -0
- package/LICENSE +21 -57
- package/README.md +304 -262
- package/agents.json +81 -0
- package/ai/faq.json +74 -0
- package/ai/summary.json +157 -0
- package/dist/lib/chains/base.d.ts +10 -0
- package/dist/lib/chains/base.d.ts.map +1 -0
- package/dist/lib/chains/base.js +75 -0
- package/dist/lib/chains/base.js.map +1 -0
- package/dist/lib/chains/solana.d.ts +10 -0
- package/dist/lib/chains/solana.d.ts.map +1 -0
- package/dist/lib/chains/solana.js +49 -0
- package/dist/lib/chains/solana.js.map +1 -0
- package/dist/lib/chains/xrpl.d.ts +10 -0
- package/dist/lib/chains/xrpl.d.ts.map +1 -0
- package/dist/lib/chains/xrpl.js +55 -0
- package/dist/lib/chains/xrpl.js.map +1 -0
- package/dist/lib/credit/bureau.d.ts +16 -0
- package/dist/lib/credit/bureau.d.ts.map +1 -0
- package/dist/lib/credit/bureau.js +88 -0
- package/dist/lib/credit/bureau.js.map +1 -0
- package/dist/lib/sml-api/agentcard.d.ts +17 -0
- package/dist/lib/sml-api/agentcard.d.ts.map +1 -0
- package/dist/lib/sml-api/agentcard.js +30 -0
- package/dist/lib/sml-api/agentcard.js.map +1 -0
- package/dist/lib/sml-api/backtest.d.ts +22 -0
- package/dist/lib/sml-api/backtest.d.ts.map +1 -0
- package/dist/lib/sml-api/backtest.js +28 -0
- package/dist/lib/sml-api/backtest.js.map +1 -0
- package/dist/lib/sml-api/brokers.d.ts +40 -0
- package/dist/lib/sml-api/brokers.d.ts.map +1 -0
- package/dist/lib/sml-api/brokers.js +128 -0
- package/dist/lib/sml-api/brokers.js.map +1 -0
- package/dist/lib/sml-api/copytrader.d.ts +11 -0
- package/dist/lib/sml-api/copytrader.d.ts.map +1 -0
- package/dist/lib/sml-api/copytrader.js +30 -0
- package/dist/lib/sml-api/copytrader.js.map +1 -0
- package/dist/lib/sml-api/crawl.d.ts +20 -0
- package/dist/lib/sml-api/crawl.d.ts.map +1 -0
- package/dist/lib/sml-api/crawl.js +32 -0
- package/dist/lib/sml-api/crawl.js.map +1 -0
- package/dist/lib/sml-api/echo.d.ts +10 -0
- package/dist/lib/sml-api/echo.d.ts.map +1 -0
- package/dist/lib/sml-api/echo.js +23 -0
- package/dist/lib/sml-api/echo.js.map +1 -0
- package/dist/lib/sml-api/forge.d.ts +11 -0
- package/dist/lib/sml-api/forge.d.ts.map +1 -0
- package/dist/lib/sml-api/forge.js +29 -0
- package/dist/lib/sml-api/forge.js.map +1 -0
- package/dist/lib/sml-api/ftd.d.ts +18 -0
- package/dist/lib/sml-api/ftd.d.ts.map +1 -0
- package/dist/lib/sml-api/ftd.js +43 -0
- package/dist/lib/sml-api/ftd.js.map +1 -0
- package/dist/lib/sml-api/ghost.d.ts +13 -0
- package/dist/lib/sml-api/ghost.d.ts.map +1 -0
- package/dist/lib/sml-api/ghost.js +29 -0
- package/dist/lib/sml-api/ghost.js.map +1 -0
- package/dist/lib/sml-api/launchpad.d.ts +20 -0
- package/dist/lib/sml-api/launchpad.d.ts.map +1 -0
- package/dist/lib/sml-api/launchpad.js +31 -0
- package/dist/lib/sml-api/launchpad.js.map +1 -0
- package/dist/lib/sml-api/leviathan.d.ts +22 -0
- package/dist/lib/sml-api/leviathan.d.ts.map +1 -0
- package/dist/lib/sml-api/leviathan.js +33 -0
- package/dist/lib/sml-api/leviathan.js.map +1 -0
- package/dist/lib/sml-api/nexus.d.ts +18 -0
- package/dist/lib/sml-api/nexus.d.ts.map +1 -0
- package/dist/lib/sml-api/nexus.js +40 -0
- package/dist/lib/sml-api/nexus.js.map +1 -0
- package/dist/lib/sml-api/proof402.d.ts +6 -0
- package/dist/lib/sml-api/proof402.d.ts.map +1 -0
- package/dist/lib/sml-api/proof402.js +30 -0
- package/dist/lib/sml-api/proof402.js.map +1 -0
- package/dist/lib/sml-api/rails.d.ts +12 -0
- package/dist/lib/sml-api/rails.d.ts.map +1 -0
- package/dist/lib/sml-api/rails.js +29 -0
- package/dist/lib/sml-api/rails.js.map +1 -0
- package/dist/lib/sml-api/shadow.d.ts +15 -0
- package/dist/lib/sml-api/shadow.d.ts.map +1 -0
- package/dist/lib/sml-api/shadow.js +27 -0
- package/dist/lib/sml-api/shadow.js.map +1 -0
- package/dist/lib/sml-api/squeezeos.d.ts +21 -0
- package/dist/lib/sml-api/squeezeos.d.ts.map +1 -0
- package/dist/lib/sml-api/squeezeos.js +97 -0
- package/dist/lib/sml-api/squeezeos.js.map +1 -0
- package/dist/lib/sml-api/xdeo.d.ts +13 -0
- package/dist/lib/sml-api/xdeo.d.ts.map +1 -0
- package/dist/lib/sml-api/xdeo.js +34 -0
- package/dist/lib/sml-api/xdeo.js.map +1 -0
- package/dist/lib/sml-api/xmit.d.ts +13 -0
- package/dist/lib/sml-api/xmit.d.ts.map +1 -0
- package/dist/lib/sml-api/xmit.js +34 -0
- package/dist/lib/sml-api/xmit.js.map +1 -0
- package/dist/server/apm/capabilities.d.ts +31 -0
- package/dist/server/apm/capabilities.d.ts.map +1 -0
- package/dist/server/apm/capabilities.js +157 -0
- package/dist/server/apm/capabilities.js.map +1 -0
- package/dist/server/apm/execute.d.ts +18 -0
- package/dist/server/apm/execute.d.ts.map +1 -0
- package/dist/server/apm/execute.js +37 -0
- package/dist/server/apm/execute.js.map +1 -0
- package/dist/server/apm/matcher.d.ts +17 -0
- package/dist/server/apm/matcher.d.ts.map +1 -0
- package/dist/server/apm/matcher.js +71 -0
- package/dist/server/apm/matcher.js.map +1 -0
- package/dist/server/apm/quote.d.ts +53 -0
- package/dist/server/apm/quote.d.ts.map +1 -0
- package/dist/server/apm/quote.js +82 -0
- package/dist/server/apm/quote.js.map +1 -0
- package/dist/server/apm/schema.d.ts +109 -0
- package/dist/server/apm/schema.d.ts.map +1 -0
- package/dist/server/apm/schema.js +31 -0
- package/dist/server/apm/schema.js.map +1 -0
- package/dist/server/health.d.ts +16 -0
- package/dist/server/health.d.ts.map +1 -0
- package/dist/server/health.js +39 -0
- package/dist/server/health.js.map +1 -0
- package/dist/server/index.d.ts +3 -0
- package/dist/server/index.d.ts.map +1 -0
- package/dist/server/index.js +322 -0
- package/dist/server/index.js.map +1 -0
- package/dist/server/payments/agent-payment.d.ts +71 -0
- package/dist/server/payments/agent-payment.d.ts.map +1 -0
- package/dist/server/payments/agent-payment.js +112 -0
- package/dist/server/payments/agent-payment.js.map +1 -0
- package/dist/server/payments/ap2.d.ts +17 -0
- package/dist/server/payments/ap2.d.ts.map +1 -0
- package/dist/server/payments/ap2.js +77 -0
- package/dist/server/payments/ap2.js.map +1 -0
- package/dist/server/payments/receipt.d.ts +28 -0
- package/dist/server/payments/receipt.d.ts.map +1 -0
- package/dist/server/payments/receipt.js +60 -0
- package/dist/server/payments/receipt.js.map +1 -0
- package/dist/server/payments/router.d.ts +23 -0
- package/dist/server/payments/router.d.ts.map +1 -0
- package/dist/server/payments/router.js +69 -0
- package/dist/server/payments/router.js.map +1 -0
- package/dist/server/payments/wallet.d.ts +18 -0
- package/dist/server/payments/wallet.d.ts.map +1 -0
- package/dist/server/payments/wallet.js +107 -0
- package/dist/server/payments/wallet.js.map +1 -0
- package/dist/server/payments/x402.d.ts +55 -0
- package/dist/server/payments/x402.d.ts.map +1 -0
- package/dist/server/payments/x402.js +247 -0
- package/dist/server/payments/x402.js.map +1 -0
- package/dist/server/registry/backends.d.ts +29 -0
- package/dist/server/registry/backends.d.ts.map +1 -0
- package/dist/server/registry/backends.js +61 -0
- package/dist/server/registry/backends.js.map +1 -0
- package/dist/server/registry/catalog.d.ts +12 -0
- package/dist/server/registry/catalog.d.ts.map +1 -0
- package/dist/server/registry/catalog.js +55 -0
- package/dist/server/registry/catalog.js.map +1 -0
- package/dist/server/registry/discovery.d.ts +16 -0
- package/dist/server/registry/discovery.d.ts.map +1 -0
- package/dist/server/registry/discovery.js +33 -0
- package/dist/server/registry/discovery.js.map +1 -0
- package/dist/server/registry/pricing.d.ts +10 -0
- package/dist/server/registry/pricing.d.ts.map +1 -0
- package/dist/server/registry/pricing.js +124 -0
- package/dist/server/registry/pricing.js.map +1 -0
- package/dist/server/security/acl.d.ts +28 -0
- package/dist/server/security/acl.d.ts.map +1 -0
- package/dist/server/security/acl.js +36 -0
- package/dist/server/security/acl.js.map +1 -0
- package/dist/server/security/audit.d.ts +15 -0
- package/dist/server/security/audit.d.ts.map +1 -0
- package/dist/server/security/audit.js +77 -0
- package/dist/server/security/audit.js.map +1 -0
- package/dist/server/security/rate-limit.d.ts +12 -0
- package/dist/server/security/rate-limit.d.ts.map +1 -0
- package/dist/server/security/rate-limit.js +72 -0
- package/dist/server/security/rate-limit.js.map +1 -0
- package/dist/server/security/sandbox.d.ts +7 -0
- package/dist/server/security/sandbox.d.ts.map +1 -0
- package/dist/server/security/sandbox.js +42 -0
- package/dist/server/security/sandbox.js.map +1 -0
- package/dist/server/tools/agentcard.d.ts +3 -0
- package/dist/server/tools/agentcard.d.ts.map +1 -0
- package/dist/server/tools/agentcard.js +118 -0
- package/dist/server/tools/agentcard.js.map +1 -0
- package/dist/server/tools/apm-execute.d.ts +3 -0
- package/dist/server/tools/apm-execute.d.ts.map +1 -0
- package/dist/server/tools/apm-execute.js +94 -0
- package/dist/server/tools/apm-execute.js.map +1 -0
- package/dist/server/tools/apm.d.ts +3 -0
- package/dist/server/tools/apm.d.ts.map +1 -0
- package/dist/server/tools/apm.js +135 -0
- package/dist/server/tools/apm.js.map +1 -0
- package/dist/server/tools/backtest.d.ts +3 -0
- package/dist/server/tools/backtest.d.ts.map +1 -0
- package/dist/server/tools/backtest.js +112 -0
- package/dist/server/tools/backtest.js.map +1 -0
- package/dist/server/tools/brokers.d.ts +3 -0
- package/dist/server/tools/brokers.d.ts.map +1 -0
- package/dist/server/tools/brokers.js +223 -0
- package/dist/server/tools/brokers.js.map +1 -0
- package/dist/server/tools/copytrader.d.ts +3 -0
- package/dist/server/tools/copytrader.d.ts.map +1 -0
- package/dist/server/tools/copytrader.js +90 -0
- package/dist/server/tools/copytrader.js.map +1 -0
- package/dist/server/tools/crawl.d.ts +3 -0
- package/dist/server/tools/crawl.d.ts.map +1 -0
- package/dist/server/tools/crawl.js +60 -0
- package/dist/server/tools/crawl.js.map +1 -0
- package/dist/server/tools/discovery.d.ts +3 -0
- package/dist/server/tools/discovery.d.ts.map +1 -0
- package/dist/server/tools/discovery.js +181 -0
- package/dist/server/tools/discovery.js.map +1 -0
- package/dist/server/tools/echo.d.ts +3 -0
- package/dist/server/tools/echo.d.ts.map +1 -0
- package/dist/server/tools/echo.js +48 -0
- package/dist/server/tools/echo.js.map +1 -0
- package/dist/server/tools/forge.d.ts +3 -0
- package/dist/server/tools/forge.d.ts.map +1 -0
- package/dist/server/tools/forge.js +77 -0
- package/dist/server/tools/forge.js.map +1 -0
- package/dist/server/tools/ftd.d.ts +3 -0
- package/dist/server/tools/ftd.d.ts.map +1 -0
- package/dist/server/tools/ftd.js +70 -0
- package/dist/server/tools/ftd.js.map +1 -0
- package/dist/server/tools/ghost.d.ts +3 -0
- package/dist/server/tools/ghost.d.ts.map +1 -0
- package/dist/server/tools/ghost.js +83 -0
- package/dist/server/tools/ghost.js.map +1 -0
- package/dist/server/tools/index.d.ts +3 -0
- package/dist/server/tools/index.d.ts.map +1 -0
- package/dist/server/tools/index.js +48 -0
- package/dist/server/tools/index.js.map +1 -0
- package/dist/server/tools/launchpad.d.ts +3 -0
- package/dist/server/tools/launchpad.d.ts.map +1 -0
- package/dist/server/tools/launchpad.js +151 -0
- package/dist/server/tools/launchpad.js.map +1 -0
- package/dist/server/tools/leviathan.d.ts +3 -0
- package/dist/server/tools/leviathan.d.ts.map +1 -0
- package/dist/server/tools/leviathan.js +73 -0
- package/dist/server/tools/leviathan.js.map +1 -0
- package/dist/server/tools/nexus.d.ts +3 -0
- package/dist/server/tools/nexus.d.ts.map +1 -0
- package/dist/server/tools/nexus.js +65 -0
- package/dist/server/tools/nexus.js.map +1 -0
- package/dist/server/tools/proof402.d.ts +3 -0
- package/dist/server/tools/proof402.d.ts.map +1 -0
- package/dist/server/tools/proof402.js +74 -0
- package/dist/server/tools/proof402.js.map +1 -0
- package/dist/server/tools/rails.d.ts +3 -0
- package/dist/server/tools/rails.d.ts.map +1 -0
- package/dist/server/tools/rails.js +82 -0
- package/dist/server/tools/rails.js.map +1 -0
- package/dist/server/tools/shadow.d.ts +3 -0
- package/dist/server/tools/shadow.d.ts.map +1 -0
- package/dist/server/tools/shadow.js +114 -0
- package/dist/server/tools/shadow.js.map +1 -0
- package/dist/server/tools/squeezeos.d.ts +3 -0
- package/dist/server/tools/squeezeos.d.ts.map +1 -0
- package/dist/server/tools/squeezeos.js +249 -0
- package/dist/server/tools/squeezeos.js.map +1 -0
- package/dist/server/tools/xdeo.d.ts +3 -0
- package/dist/server/tools/xdeo.d.ts.map +1 -0
- package/dist/server/tools/xdeo.js +58 -0
- package/dist/server/tools/xdeo.js.map +1 -0
- package/dist/server/tools/xmit.d.ts +3 -0
- package/dist/server/tools/xmit.d.ts.map +1 -0
- package/dist/server/tools/xmit.js +59 -0
- package/dist/server/tools/xmit.js.map +1 -0
- package/eslint.config.mjs +28 -0
- package/llms.txt +170 -108
- package/package.json +78 -65
- package/server.json +24 -0
- package/.well-known/x402.json +0 -37
- package/dist/index.d.ts +0 -12
- package/dist/index.d.ts.map +0 -1
- package/dist/index.js +0 -9
- package/dist/index.js.map +0 -1
- package/dist/mcp-wrapper.d.ts +0 -71
- package/dist/mcp-wrapper.d.ts.map +0 -1
- package/dist/mcp-wrapper.js +0 -104
- package/dist/mcp-wrapper.js.map +0 -1
- package/dist/x402-middleware.d.ts +0 -76
- package/dist/x402-middleware.d.ts.map +0 -1
- package/dist/x402-middleware.js +0 -113
- package/dist/x402-middleware.js.map +0 -1
- package/dist/xrpl-facilitator.d.ts +0 -77
- package/dist/xrpl-facilitator.d.ts.map +0 -1
- package/dist/xrpl-facilitator.js +0 -156
- package/dist/xrpl-facilitator.js.map +0 -1
- package/schema.jsonld +0 -97
|
@@ -0,0 +1,247 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.PaymentConfigSchema = void 0;
|
|
4
|
+
exports.getPaymentReceiver = getPaymentReceiver;
|
|
5
|
+
exports.executeX402Payment = executeX402Payment;
|
|
6
|
+
exports.executeBrokeredPayment = executeBrokeredPayment;
|
|
7
|
+
const zod_1 = require("zod");
|
|
8
|
+
const audit_js_1 = require("../security/audit.js");
|
|
9
|
+
const ap2_js_1 = require("./ap2.js");
|
|
10
|
+
const wallet_js_1 = require("./wallet.js");
|
|
11
|
+
const router_js_1 = require("./router.js");
|
|
12
|
+
const receipt_js_1 = require("./receipt.js");
|
|
13
|
+
const bureau_js_1 = require("../../lib/credit/bureau.js");
|
|
14
|
+
const pricing_js_1 = require("../registry/pricing.js");
|
|
15
|
+
const agent_payment_js_1 = require("./agent-payment.js");
|
|
16
|
+
exports.PaymentConfigSchema = zod_1.z.object({
|
|
17
|
+
price: zod_1.z.string().regex(/^\d+(\.\d+)?$/),
|
|
18
|
+
currency: zod_1.z.enum(['USDC', 'RLUSD']),
|
|
19
|
+
toolName: zod_1.z.string(),
|
|
20
|
+
walletAddress: zod_1.z.string().optional(),
|
|
21
|
+
// Agent's on-chain payment proof. When agent-pays enforcement is on, the tool is
|
|
22
|
+
// only served once this verifies via 402Proof.
|
|
23
|
+
paymentProof: zod_1.z.object({ txHash: zod_1.z.string() }).optional(),
|
|
24
|
+
});
|
|
25
|
+
const AUTO_APPROVE_THRESHOLD = parseFloat(process.env['AUTO_APPROVE_THRESHOLD_USD'] ?? '1.0');
|
|
26
|
+
const DAILY_SPEND_CAP = parseFloat(process.env['DAILY_SPEND_CAP_USD'] ?? '50.0');
|
|
27
|
+
// SML's published Base USDC receiving address (public — see agents.json, llms.txt,
|
|
28
|
+
// x402-paywall.html). Used as the default so the gateway COLLECTS even when
|
|
29
|
+
// SML_PAYMENT_RECEIVER isn't set in the environment. Override via env to redirect.
|
|
30
|
+
// The private key (WALLET_SEED) is never stored here.
|
|
31
|
+
const SML_DEFAULT_RECEIVER = '0x4e14B249D9A4c9c9352D780eCEB508A8eB7a7700';
|
|
32
|
+
/** Resolve the address that collects USDC for paid tool calls. */
|
|
33
|
+
function getPaymentReceiver() {
|
|
34
|
+
return process.env['SML_PAYMENT_RECEIVER'] ?? SML_DEFAULT_RECEIVER;
|
|
35
|
+
}
|
|
36
|
+
const dailySpend = new Map();
|
|
37
|
+
function getTodayKey() {
|
|
38
|
+
return new Date().toISOString().slice(0, 10);
|
|
39
|
+
}
|
|
40
|
+
function getDailySpend(wallet) {
|
|
41
|
+
const today = getTodayKey();
|
|
42
|
+
const entry = dailySpend.get(wallet);
|
|
43
|
+
if (!entry || entry.date !== today)
|
|
44
|
+
return 0;
|
|
45
|
+
return entry.amount;
|
|
46
|
+
}
|
|
47
|
+
function addDailySpend(wallet, amount) {
|
|
48
|
+
const today = getTodayKey();
|
|
49
|
+
const current = getDailySpend(wallet);
|
|
50
|
+
dailySpend.set(wallet, { amount: current + amount, date: today });
|
|
51
|
+
}
|
|
52
|
+
async function executeX402Payment(config) {
|
|
53
|
+
const audit = audit_js_1.AuditLogger.getInstance();
|
|
54
|
+
// Agent-pays enforcement (flag-gated, OFF by default). When on, the AGENT must
|
|
55
|
+
// pay and we verify via 402Proof — no gateway self-transfer. Fails CLOSED.
|
|
56
|
+
if ((0, agent_payment_js_1.isAgentPaymentEnforced)()) {
|
|
57
|
+
const gate = await (0, agent_payment_js_1.enforceAgentPayment)({
|
|
58
|
+
toolName: config.toolName,
|
|
59
|
+
price: config.price,
|
|
60
|
+
paymentProof: config.paymentProof,
|
|
61
|
+
});
|
|
62
|
+
if (gate.status === 'unconfigured') {
|
|
63
|
+
audit.error('agent_payment_unconfigured', { tool: config.toolName });
|
|
64
|
+
throw new Error(`Agent payment enforcement is on but no 402Proof endpoint is configured for ${config.toolName}. Set PROOF402_ENDPOINT_${config.toolName.toUpperCase()}.`);
|
|
65
|
+
}
|
|
66
|
+
if (gate.status === 'payment_required')
|
|
67
|
+
throw new agent_payment_js_1.PaymentRequiredError(gate);
|
|
68
|
+
if (gate.status === 'payment_invalid')
|
|
69
|
+
throw new agent_payment_js_1.PaymentUnverifiedError(gate);
|
|
70
|
+
// gate.status === 'paid' — agent payment verified on-chain. Record receipt, no self-transfer.
|
|
71
|
+
const w = await wallet_js_1.WalletManager.getInstance().getOrCreateWallet();
|
|
72
|
+
const receipt = await receipt_js_1.ReceiptStore.getInstance().create({
|
|
73
|
+
txHash: gate.txHash, chain: 'verified', amount: config.price,
|
|
74
|
+
currency: config.currency, tool: config.toolName, wallet: config.walletAddress ?? w.address,
|
|
75
|
+
});
|
|
76
|
+
audit.info('agent_payment_verified', { tool: config.toolName, txHash: gate.txHash, receiptId: receipt.id });
|
|
77
|
+
return {
|
|
78
|
+
receiptId: receipt.id, txHash: gate.txHash, chain: 'verified',
|
|
79
|
+
amountPaid: config.price, currency: config.currency, timestamp: Date.now(),
|
|
80
|
+
walletAddress: config.walletAddress ?? w.address,
|
|
81
|
+
};
|
|
82
|
+
}
|
|
83
|
+
const wallet = await wallet_js_1.WalletManager.getInstance().getOrCreateWallet();
|
|
84
|
+
const walletAddress = wallet.address;
|
|
85
|
+
// Enforce daily spend cap (N9)
|
|
86
|
+
const priceNum = parseFloat(config.price);
|
|
87
|
+
const currentSpend = getDailySpend(walletAddress);
|
|
88
|
+
if (currentSpend + priceNum > DAILY_SPEND_CAP) {
|
|
89
|
+
audit.warn('spend_cap_exceeded', {
|
|
90
|
+
wallet: walletAddress,
|
|
91
|
+
current: currentSpend,
|
|
92
|
+
requested: priceNum,
|
|
93
|
+
cap: DAILY_SPEND_CAP,
|
|
94
|
+
});
|
|
95
|
+
throw new Error(`Daily spend cap of $${DAILY_SPEND_CAP} exceeded. Current: $${currentSpend.toFixed(4)}`);
|
|
96
|
+
}
|
|
97
|
+
// Verify price cache freshness (N12)
|
|
98
|
+
const cachedPrice = await pricing_js_1.PriceRegistry.getInstance().getPrice(config.toolName);
|
|
99
|
+
if (!cachedPrice) {
|
|
100
|
+
throw new Error('Price data stale or unavailable. Rejecting payment.');
|
|
101
|
+
}
|
|
102
|
+
if (cachedPrice !== config.price) {
|
|
103
|
+
throw new Error(`Price mismatch: expected ${cachedPrice}, got ${config.price}. Cache may be stale.`);
|
|
104
|
+
}
|
|
105
|
+
// Credit Bureau check (N8)
|
|
106
|
+
const score = await bureau_js_1.CreditBureau.getInstance().getScore(walletAddress);
|
|
107
|
+
const autoApprove = priceNum <= AUTO_APPROVE_THRESHOLD && score >= 300;
|
|
108
|
+
audit.info('payment_attempt', {
|
|
109
|
+
tool: config.toolName,
|
|
110
|
+
price: config.price,
|
|
111
|
+
currency: config.currency,
|
|
112
|
+
wallet: walletAddress,
|
|
113
|
+
bureauScore: score,
|
|
114
|
+
autoApprove,
|
|
115
|
+
});
|
|
116
|
+
if (!autoApprove && score < 300) {
|
|
117
|
+
throw new Error(`Credit Bureau score ${score} below minimum 300. Payment requires manual approval.`);
|
|
118
|
+
}
|
|
119
|
+
// AP2 mandate verification (N6)
|
|
120
|
+
const ap2 = ap2_js_1.AP2Client.getInstance();
|
|
121
|
+
const mandateValid = await ap2.verifyMandate(walletAddress, {
|
|
122
|
+
maxAmount: config.price,
|
|
123
|
+
currency: config.currency,
|
|
124
|
+
toolName: config.toolName,
|
|
125
|
+
});
|
|
126
|
+
if (!mandateValid) {
|
|
127
|
+
audit.warn('ap2_mandate_rejected', { wallet: walletAddress, tool: config.toolName });
|
|
128
|
+
throw new Error('AP2 mandate verification failed. Agent not authorized for this payment.');
|
|
129
|
+
}
|
|
130
|
+
// Route payment to cheapest/fastest chain (N13)
|
|
131
|
+
// Receiver defaults to SML's published address; only empty if explicitly set to ''.
|
|
132
|
+
const receiver = getPaymentReceiver();
|
|
133
|
+
let txResult;
|
|
134
|
+
if (!receiver) {
|
|
135
|
+
audit.warn('payment_receiver_unset', { tool: config.toolName, amount: config.price, note: 'SML_PAYMENT_RECEIVER explicitly empty — logging only' });
|
|
136
|
+
txResult = { txHash: `pending-${Date.now()}`, chain: 'none', latencyMs: 0 };
|
|
137
|
+
}
|
|
138
|
+
else {
|
|
139
|
+
try {
|
|
140
|
+
const router = router_js_1.ChainRouter.getInstance();
|
|
141
|
+
txResult = await router.route({
|
|
142
|
+
amount: config.price,
|
|
143
|
+
currency: config.currency,
|
|
144
|
+
from: walletAddress,
|
|
145
|
+
to: receiver,
|
|
146
|
+
timeoutMs: 500,
|
|
147
|
+
});
|
|
148
|
+
}
|
|
149
|
+
catch (err) {
|
|
150
|
+
// Log payment failure but don't block tool execution
|
|
151
|
+
audit.warn('payment_tx_failed', { tool: config.toolName, amount: config.price, error: String(err), note: 'Server wallet may be unfunded — tool served anyway' });
|
|
152
|
+
txResult = { txHash: `failed-${Date.now()}`, chain: 'none', latencyMs: 0 };
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
addDailySpend(walletAddress, priceNum);
|
|
156
|
+
// Generate 402Proof receipt (N7)
|
|
157
|
+
const receipt = await receipt_js_1.ReceiptStore.getInstance().create({
|
|
158
|
+
txHash: txResult.txHash,
|
|
159
|
+
chain: txResult.chain,
|
|
160
|
+
amount: config.price,
|
|
161
|
+
currency: config.currency,
|
|
162
|
+
tool: config.toolName,
|
|
163
|
+
wallet: walletAddress,
|
|
164
|
+
});
|
|
165
|
+
audit.info('payment_success', {
|
|
166
|
+
receiptId: receipt.id,
|
|
167
|
+
txHash: txResult.txHash,
|
|
168
|
+
chain: txResult.chain,
|
|
169
|
+
tool: config.toolName,
|
|
170
|
+
wallet: walletAddress,
|
|
171
|
+
});
|
|
172
|
+
return {
|
|
173
|
+
receiptId: receipt.id,
|
|
174
|
+
txHash: txResult.txHash,
|
|
175
|
+
chain: txResult.chain,
|
|
176
|
+
amountPaid: config.price,
|
|
177
|
+
currency: config.currency,
|
|
178
|
+
timestamp: Date.now(),
|
|
179
|
+
walletAddress,
|
|
180
|
+
};
|
|
181
|
+
}
|
|
182
|
+
/**
|
|
183
|
+
* Brokered payment for APM-executed tools (apm_execute). The amount is the
|
|
184
|
+
* price-locked quote value + brokerage; its integrity is guaranteed by the
|
|
185
|
+
* SML-signed quote verified upstream — NOT by the price registry. Mirrors the
|
|
186
|
+
* settlement steps of executeX402Payment (cap, credit, AP2, route, receipt).
|
|
187
|
+
* Never call without a verified, unexpired quote.
|
|
188
|
+
*/
|
|
189
|
+
async function executeBrokeredPayment(params) {
|
|
190
|
+
const { amount, toolName } = params;
|
|
191
|
+
const currency = 'USDC';
|
|
192
|
+
const audit = audit_js_1.AuditLogger.getInstance();
|
|
193
|
+
const wallet = await wallet_js_1.WalletManager.getInstance().getOrCreateWallet();
|
|
194
|
+
const walletAddress = wallet.address;
|
|
195
|
+
// Daily spend cap (N9)
|
|
196
|
+
const amountNum = parseFloat(amount);
|
|
197
|
+
const currentSpend = getDailySpend(walletAddress);
|
|
198
|
+
if (currentSpend + amountNum > DAILY_SPEND_CAP) {
|
|
199
|
+
audit.warn('spend_cap_exceeded', { wallet: walletAddress, current: currentSpend, requested: amountNum, cap: DAILY_SPEND_CAP });
|
|
200
|
+
throw new Error(`Daily spend cap of $${DAILY_SPEND_CAP} exceeded. Current: $${currentSpend.toFixed(4)}`);
|
|
201
|
+
}
|
|
202
|
+
// Credit Bureau check (N8)
|
|
203
|
+
const score = await bureau_js_1.CreditBureau.getInstance().getScore(walletAddress);
|
|
204
|
+
const autoApprove = amountNum <= AUTO_APPROVE_THRESHOLD && score >= 300;
|
|
205
|
+
audit.info('brokered_payment_attempt', { tool: toolName, amount, wallet: walletAddress, bureauScore: score, autoApprove });
|
|
206
|
+
if (!autoApprove && score < 300) {
|
|
207
|
+
throw new Error(`Credit Bureau score ${score} below minimum 300. Payment requires manual approval.`);
|
|
208
|
+
}
|
|
209
|
+
// AP2 mandate verification (N6)
|
|
210
|
+
const ap2 = ap2_js_1.AP2Client.getInstance();
|
|
211
|
+
const mandateValid = await ap2.verifyMandate(walletAddress, { maxAmount: amount, currency, toolName });
|
|
212
|
+
if (!mandateValid) {
|
|
213
|
+
audit.warn('ap2_mandate_rejected', { wallet: walletAddress, tool: toolName });
|
|
214
|
+
throw new Error('AP2 mandate verification failed. Agent not authorized for this payment.');
|
|
215
|
+
}
|
|
216
|
+
// Route payment (N13)
|
|
217
|
+
const receiver = getPaymentReceiver();
|
|
218
|
+
let txResult;
|
|
219
|
+
if (!receiver) {
|
|
220
|
+
audit.warn('payment_receiver_unset', { tool: toolName, amount, note: 'SML_PAYMENT_RECEIVER explicitly empty — logging only' });
|
|
221
|
+
txResult = { txHash: `pending-${Date.now()}`, chain: 'none', latencyMs: 0 };
|
|
222
|
+
}
|
|
223
|
+
else {
|
|
224
|
+
try {
|
|
225
|
+
const router = router_js_1.ChainRouter.getInstance();
|
|
226
|
+
txResult = await router.route({ amount, currency, from: walletAddress, to: receiver, timeoutMs: 500 });
|
|
227
|
+
}
|
|
228
|
+
catch (err) {
|
|
229
|
+
audit.warn('payment_tx_failed', { tool: toolName, amount, error: String(err), note: 'Server wallet may be unfunded — tool served anyway' });
|
|
230
|
+
txResult = { txHash: `failed-${Date.now()}`, chain: 'none', latencyMs: 0 };
|
|
231
|
+
}
|
|
232
|
+
}
|
|
233
|
+
addDailySpend(walletAddress, amountNum);
|
|
234
|
+
// 402Proof receipt (N7)
|
|
235
|
+
const receipt = await receipt_js_1.ReceiptStore.getInstance().create({ txHash: txResult.txHash, chain: txResult.chain, amount, currency, tool: toolName, wallet: walletAddress });
|
|
236
|
+
audit.info('brokered_payment_success', { receiptId: receipt.id, txHash: txResult.txHash, chain: txResult.chain, tool: toolName, wallet: walletAddress });
|
|
237
|
+
return {
|
|
238
|
+
receiptId: receipt.id,
|
|
239
|
+
txHash: txResult.txHash,
|
|
240
|
+
chain: txResult.chain,
|
|
241
|
+
amountPaid: amount,
|
|
242
|
+
currency,
|
|
243
|
+
timestamp: Date.now(),
|
|
244
|
+
walletAddress,
|
|
245
|
+
};
|
|
246
|
+
}
|
|
247
|
+
//# sourceMappingURL=x402.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"x402.js","sourceRoot":"","sources":["../../../src/server/payments/x402.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Canonical list of SML product backends + a shared health checker.
|
|
3
|
+
*
|
|
4
|
+
* Single source of truth for "which backend serves which product" and "is it live".
|
|
5
|
+
* Used by the `sml_status` tool and by APM (so APM never recommends a suspended product).
|
|
6
|
+
*/
|
|
7
|
+
export interface BackendDef {
|
|
8
|
+
/** Display name (as shown in sml_status). */
|
|
9
|
+
name: string;
|
|
10
|
+
/** Product key — must match the `product` field used in the APM capability index. */
|
|
11
|
+
product: string;
|
|
12
|
+
/** Health-check URL. */
|
|
13
|
+
url: string;
|
|
14
|
+
}
|
|
15
|
+
export declare const BACKENDS: readonly BackendDef[];
|
|
16
|
+
export type BackendStatus = 'online' | 'degraded' | 'offline';
|
|
17
|
+
export interface BackendHealth {
|
|
18
|
+
name: string;
|
|
19
|
+
product: string;
|
|
20
|
+
status: BackendStatus;
|
|
21
|
+
http?: number;
|
|
22
|
+
latency_ms: number;
|
|
23
|
+
error?: string;
|
|
24
|
+
}
|
|
25
|
+
/** Hit every backend's health endpoint in parallel. Never throws. */
|
|
26
|
+
export declare function checkBackends(timeoutMs?: number): Promise<BackendHealth[]>;
|
|
27
|
+
/** Set of product keys whose backend is currently `online`. */
|
|
28
|
+
export declare function liveProducts(timeoutMs?: number): Promise<Set<string>>;
|
|
29
|
+
//# sourceMappingURL=backends.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"backends.d.ts","sourceRoot":"","sources":["../../../src/server/registry/backends.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,MAAM,WAAW,UAAU;IACzB,6CAA6C;IAC7C,IAAI,EAAE,MAAM,CAAC;IACb,qFAAqF;IACrF,OAAO,EAAE,MAAM,CAAC;IAChB,wBAAwB;IACxB,GAAG,EAAE,MAAM,CAAC;CACb;AAED,eAAO,MAAM,QAAQ,EAAE,SAAS,UAAU,EAShC,CAAC;AAEX,MAAM,MAAM,aAAa,GAAG,QAAQ,GAAG,UAAU,GAAG,SAAS,CAAC;AAE9D,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,aAAa,CAAC;IACtB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,UAAU,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,qEAAqE;AACrE,wBAAsB,aAAa,CAAC,SAAS,SAAO,GAAG,OAAO,CAAC,aAAa,EAAE,CAAC,CAoC9E;AAED,+DAA+D;AAC/D,wBAAsB,YAAY,CAAC,SAAS,SAAO,GAAG,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAGzE"}
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Canonical list of SML product backends + a shared health checker.
|
|
4
|
+
*
|
|
5
|
+
* Single source of truth for "which backend serves which product" and "is it live".
|
|
6
|
+
* Used by the `sml_status` tool and by APM (so APM never recommends a suspended product).
|
|
7
|
+
*/
|
|
8
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
9
|
+
exports.BACKENDS = void 0;
|
|
10
|
+
exports.checkBackends = checkBackends;
|
|
11
|
+
exports.liveProducts = liveProducts;
|
|
12
|
+
exports.BACKENDS = [
|
|
13
|
+
{ name: 'SqueezeOS', product: 'SqueezeOS', url: 'https://squeezeos-api.onrender.com/api/status' },
|
|
14
|
+
{ name: 'Ghost Layer', product: 'Ghost Layer', url: 'https://ghost-layer.onrender.com/api/status' },
|
|
15
|
+
{ name: '402Proof', product: '402Proof', url: 'https://four02proof.onrender.com/health' },
|
|
16
|
+
{ name: 'RLUSD Rails', product: 'RLUSD Rails', url: 'https://sml-rails.onrender.com/health' },
|
|
17
|
+
{ name: 'Copy-Trader', product: 'Copy-Trader', url: 'https://sml-copytrader.onrender.com/health' },
|
|
18
|
+
{ name: 'Launchpad', product: 'Launchpad', url: 'https://sml-launchpad.onrender.com/health' },
|
|
19
|
+
{ name: 'Shadow Desk', product: 'Shadow Desk', url: 'https://shadow-desk.onrender.com/health' },
|
|
20
|
+
{ name: 'Forge Gateway', product: 'Forge Gateway', url: 'https://forge-gateway-a822.onrender.com/health' },
|
|
21
|
+
];
|
|
22
|
+
/** Hit every backend's health endpoint in parallel. Never throws. */
|
|
23
|
+
async function checkBackends(timeoutMs = 5000) {
|
|
24
|
+
const results = await Promise.allSettled(exports.BACKENDS.map(async (b) => {
|
|
25
|
+
const start = Date.now();
|
|
26
|
+
try {
|
|
27
|
+
const res = await fetch(b.url, { signal: AbortSignal.timeout(timeoutMs) });
|
|
28
|
+
return {
|
|
29
|
+
name: b.name,
|
|
30
|
+
product: b.product,
|
|
31
|
+
status: res.ok ? 'online' : 'degraded',
|
|
32
|
+
http: res.status,
|
|
33
|
+
latency_ms: Date.now() - start,
|
|
34
|
+
};
|
|
35
|
+
}
|
|
36
|
+
catch (err) {
|
|
37
|
+
return {
|
|
38
|
+
name: b.name,
|
|
39
|
+
product: b.product,
|
|
40
|
+
status: 'offline',
|
|
41
|
+
error: String(err),
|
|
42
|
+
latency_ms: Date.now() - start,
|
|
43
|
+
};
|
|
44
|
+
}
|
|
45
|
+
}));
|
|
46
|
+
return results.map((r, i) => r.status === 'fulfilled'
|
|
47
|
+
? r.value
|
|
48
|
+
: {
|
|
49
|
+
name: exports.BACKENDS[i].name,
|
|
50
|
+
product: exports.BACKENDS[i].product,
|
|
51
|
+
status: 'offline',
|
|
52
|
+
error: 'health_check_failed',
|
|
53
|
+
latency_ms: 0,
|
|
54
|
+
});
|
|
55
|
+
}
|
|
56
|
+
/** Set of product keys whose backend is currently `online`. */
|
|
57
|
+
async function liveProducts(timeoutMs = 5000) {
|
|
58
|
+
const health = await checkBackends(timeoutMs);
|
|
59
|
+
return new Set(health.filter((h) => h.status === 'online').map((h) => h.product));
|
|
60
|
+
}
|
|
61
|
+
//# sourceMappingURL=backends.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"backends.js","sourceRoot":"","sources":["../../../src/server/registry/backends.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
export interface ToolMeta {
|
|
2
|
+
name: string;
|
|
3
|
+
description: string;
|
|
4
|
+
price: string;
|
|
5
|
+
currency: 'USDC' | 'RLUSD';
|
|
6
|
+
freeTier?: string;
|
|
7
|
+
ap2Required: boolean;
|
|
8
|
+
cacheTtl?: number;
|
|
9
|
+
}
|
|
10
|
+
export declare const CATALOG: ToolMeta[];
|
|
11
|
+
export declare function getToolMeta(name: string): ToolMeta | undefined;
|
|
12
|
+
//# sourceMappingURL=catalog.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"catalog.d.ts","sourceRoot":"","sources":["../../../src/server/registry/catalog.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,QAAQ;IACvB,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC;IAC3B,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,OAAO,CAAC;IACrB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,eAAO,MAAM,OAAO,EAAE,QAAQ,EA8C7B,CAAC;AAEF,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,QAAQ,GAAG,SAAS,CAE9D"}
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.CATALOG = void 0;
|
|
4
|
+
exports.getToolMeta = getToolMeta;
|
|
5
|
+
exports.CATALOG = [
|
|
6
|
+
{
|
|
7
|
+
name: 'leviathan_signal',
|
|
8
|
+
description: 'Institutional-grade squeeze signals. Multi-engine verdict for any ticker.',
|
|
9
|
+
price: '0.05',
|
|
10
|
+
currency: 'USDC',
|
|
11
|
+
ap2Required: true,
|
|
12
|
+
},
|
|
13
|
+
{
|
|
14
|
+
name: 'xmit_edgar_decode',
|
|
15
|
+
description: 'Parse SEC DEF 14A / 13F / 13D filings. Raw text never leaves SML servers.',
|
|
16
|
+
price: '0.02',
|
|
17
|
+
currency: 'USDC',
|
|
18
|
+
ap2Required: true,
|
|
19
|
+
},
|
|
20
|
+
{
|
|
21
|
+
name: 'xdeo_earnings_estimate',
|
|
22
|
+
description: 'Decentralized earnings oracle. +2 bureau_score on success.',
|
|
23
|
+
price: '0.02',
|
|
24
|
+
currency: 'USDC',
|
|
25
|
+
ap2Required: true,
|
|
26
|
+
},
|
|
27
|
+
{
|
|
28
|
+
name: 'ftd_threshold_scan',
|
|
29
|
+
description: 'SEC Reg SHO FTD data. Alerts free; full data 0.05 USDC. 15-min cache.',
|
|
30
|
+
price: '0.05',
|
|
31
|
+
currency: 'USDC',
|
|
32
|
+
ap2Required: false,
|
|
33
|
+
freeTier: 'alerts_only',
|
|
34
|
+
cacheTtl: 900,
|
|
35
|
+
},
|
|
36
|
+
{
|
|
37
|
+
name: 'nexus_agent_hire',
|
|
38
|
+
description: 'Agent marketplace. Query free; hire charges 5% commission.',
|
|
39
|
+
price: '0.00',
|
|
40
|
+
currency: 'USDC',
|
|
41
|
+
ap2Required: false,
|
|
42
|
+
freeTier: 'query_only',
|
|
43
|
+
},
|
|
44
|
+
{
|
|
45
|
+
name: 'crawl_paid_fetch',
|
|
46
|
+
description: 'Pay-per-fetch scraping. Humans bypass free.',
|
|
47
|
+
price: '0.005',
|
|
48
|
+
currency: 'USDC',
|
|
49
|
+
ap2Required: false,
|
|
50
|
+
},
|
|
51
|
+
];
|
|
52
|
+
function getToolMeta(name) {
|
|
53
|
+
return exports.CATALOG.find((t) => t.name === name);
|
|
54
|
+
}
|
|
55
|
+
//# sourceMappingURL=catalog.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"catalog.js","sourceRoot":"","sources":["../../../src/server/registry/catalog.ts"],"names":[],"mappings":";;;AA0DA,kCAEC;AAlDY,QAAA,OAAO,GAAe;IACjC;QACE,IAAI,EAAE,kBAAkB;QACxB,WAAW,EAAE,2EAA2E;QACxF,KAAK,EAAE,MAAM;QACb,QAAQ,EAAE,MAAM;QAChB,WAAW,EAAE,IAAI;KAClB;IACD;QACE,IAAI,EAAE,mBAAmB;QACzB,WAAW,EAAE,2EAA2E;QACxF,KAAK,EAAE,MAAM;QACb,QAAQ,EAAE,MAAM;QAChB,WAAW,EAAE,IAAI;KAClB;IACD;QACE,IAAI,EAAE,wBAAwB;QAC9B,WAAW,EAAE,4DAA4D;QACzE,KAAK,EAAE,MAAM;QACb,QAAQ,EAAE,MAAM;QAChB,WAAW,EAAE,IAAI;KAClB;IACD;QACE,IAAI,EAAE,oBAAoB;QAC1B,WAAW,EAAE,uEAAuE;QACpF,KAAK,EAAE,MAAM;QACb,QAAQ,EAAE,MAAM;QAChB,WAAW,EAAE,KAAK;QAClB,QAAQ,EAAE,aAAa;QACvB,QAAQ,EAAE,GAAG;KACd;IACD;QACE,IAAI,EAAE,kBAAkB;QACxB,WAAW,EAAE,4DAA4D;QACzE,KAAK,EAAE,MAAM;QACb,QAAQ,EAAE,MAAM;QAChB,WAAW,EAAE,KAAK;QAClB,QAAQ,EAAE,YAAY;KACvB;IACD;QACE,IAAI,EAAE,kBAAkB;QACxB,WAAW,EAAE,6CAA6C;QAC1D,KAAK,EAAE,OAAO;QACd,QAAQ,EAAE,MAAM;QAChB,WAAW,EAAE,KAAK;KACnB;CACF,CAAC;AAEF,SAAgB,WAAW,CAAC,IAAY;IACtC,OAAO,eAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,CAAC;AAC9C,CAAC"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
interface AgentsJson {
|
|
2
|
+
schema_version: string;
|
|
3
|
+
name: string;
|
|
4
|
+
tools: unknown[];
|
|
5
|
+
}
|
|
6
|
+
export declare class Discovery {
|
|
7
|
+
private static instance;
|
|
8
|
+
private agentsJson;
|
|
9
|
+
private llmsTxt;
|
|
10
|
+
private constructor();
|
|
11
|
+
static getInstance(): Discovery;
|
|
12
|
+
getAgentsJson(): AgentsJson;
|
|
13
|
+
getLlmsTxt(): string;
|
|
14
|
+
}
|
|
15
|
+
export {};
|
|
16
|
+
//# sourceMappingURL=discovery.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"discovery.d.ts","sourceRoot":"","sources":["../../../src/server/registry/discovery.ts"],"names":[],"mappings":"AAGA,UAAU,UAAU;IAClB,cAAc,EAAE,MAAM,CAAC;IACvB,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,OAAO,EAAE,CAAC;CAClB;AAED,qBAAa,SAAS;IACpB,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAY;IACnC,OAAO,CAAC,UAAU,CAA2B;IAC7C,OAAO,CAAC,OAAO,CAAuB;IAEtC,OAAO;IAEP,MAAM,CAAC,WAAW,IAAI,SAAS;IAO/B,aAAa,IAAI,UAAU;IAQ3B,UAAU,IAAI,MAAM;CAOrB"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.Discovery = void 0;
|
|
4
|
+
const fs_1 = require("fs");
|
|
5
|
+
const path_1 = require("path");
|
|
6
|
+
class Discovery {
|
|
7
|
+
static instance;
|
|
8
|
+
agentsJson = null;
|
|
9
|
+
llmsTxt = null;
|
|
10
|
+
constructor() { }
|
|
11
|
+
static getInstance() {
|
|
12
|
+
if (!Discovery.instance) {
|
|
13
|
+
Discovery.instance = new Discovery();
|
|
14
|
+
}
|
|
15
|
+
return Discovery.instance;
|
|
16
|
+
}
|
|
17
|
+
getAgentsJson() {
|
|
18
|
+
if (!this.agentsJson) {
|
|
19
|
+
const path = (0, path_1.join)(process.cwd(), 'agents.json');
|
|
20
|
+
this.agentsJson = JSON.parse((0, fs_1.readFileSync)(path, 'utf8'));
|
|
21
|
+
}
|
|
22
|
+
return this.agentsJson;
|
|
23
|
+
}
|
|
24
|
+
getLlmsTxt() {
|
|
25
|
+
if (!this.llmsTxt) {
|
|
26
|
+
const path = (0, path_1.join)(process.cwd(), 'llms.txt');
|
|
27
|
+
this.llmsTxt = (0, fs_1.readFileSync)(path, 'utf8');
|
|
28
|
+
}
|
|
29
|
+
return this.llmsTxt;
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
exports.Discovery = Discovery;
|
|
33
|
+
//# sourceMappingURL=discovery.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"discovery.js","sourceRoot":"","sources":["../../../src/server/registry/discovery.ts"],"names":[],"mappings":";;;AAAA,2BAAkC;AAClC,+BAA4B;AAQ5B,MAAa,SAAS;IACZ,MAAM,CAAC,QAAQ,CAAY;IAC3B,UAAU,GAAsB,IAAI,CAAC;IACrC,OAAO,GAAkB,IAAI,CAAC;IAEtC,gBAAuB,CAAC;IAExB,MAAM,CAAC,WAAW;QAChB,IAAI,CAAC,SAAS,CAAC,QAAQ,EAAE,CAAC;YACxB,SAAS,CAAC,QAAQ,GAAG,IAAI,SAAS,EAAE,CAAC;QACvC,CAAC;QACD,OAAO,SAAS,CAAC,QAAQ,CAAC;IAC5B,CAAC;IAED,aAAa;QACX,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,CAAC;YACrB,MAAM,IAAI,GAAG,IAAA,WAAI,EAAC,OAAO,CAAC,GAAG,EAAE,EAAE,aAAa,CAAC,CAAC;YAChD,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,KAAK,CAAC,IAAA,iBAAY,EAAC,IAAI,EAAE,MAAM,CAAC,CAAe,CAAC;QACzE,CAAC;QACD,OAAO,IAAI,CAAC,UAAU,CAAC;IACzB,CAAC;IAED,UAAU;QACR,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC;YAClB,MAAM,IAAI,GAAG,IAAA,WAAI,EAAC,OAAO,CAAC,GAAG,EAAE,EAAE,UAAU,CAAC,CAAC;YAC7C,IAAI,CAAC,OAAO,GAAG,IAAA,iBAAY,EAAC,IAAI,EAAE,MAAM,CAAC,CAAC;QAC5C,CAAC;QACD,OAAO,IAAI,CAAC,OAAO,CAAC;IACtB,CAAC;CACF;AA7BD,8BA6BC"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
export declare class PriceRegistry {
|
|
2
|
+
private static instance;
|
|
3
|
+
private readonly cache;
|
|
4
|
+
private readonly baseUrl;
|
|
5
|
+
private constructor();
|
|
6
|
+
static getInstance(): PriceRegistry;
|
|
7
|
+
getPrice(toolName: string): Promise<string | null>;
|
|
8
|
+
seedDefaults(): void;
|
|
9
|
+
}
|
|
10
|
+
//# sourceMappingURL=pricing.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pricing.d.ts","sourceRoot":"","sources":["../../../src/server/registry/pricing.ts"],"names":[],"mappings":"AAyEA,qBAAa,aAAa;IACxB,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAgB;IACvC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAkC;IACxD,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAS;IAEjC,OAAO;IAIP,MAAM,CAAC,WAAW,IAAI,aAAa;IAO7B,QAAQ,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;IAoCxD,YAAY,IAAI,IAAI;CAQrB"}
|
|
@@ -0,0 +1,124 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.PriceRegistry = void 0;
|
|
4
|
+
const PRICE_CACHE_TTL = parseInt(process.env['PRICE_CACHE_TTL_MS'] ?? '60000', 10);
|
|
5
|
+
// Keys MUST match the toolName each tool passes to getPrice()/executeX402Payment().
|
|
6
|
+
// Paid-tool prices MUST equal what sml_discover advertises (advertised == charged).
|
|
7
|
+
// A drift-guard test (tests/unit/pricing-drift.test.ts) enforces both.
|
|
8
|
+
const BASE_PRICES = {
|
|
9
|
+
// Discovery (free)
|
|
10
|
+
sml_discover: '0.00',
|
|
11
|
+
sml_status: '0.00',
|
|
12
|
+
// APM — Agent Preference Manifest (free preview, paid contract)
|
|
13
|
+
apm_negotiate: '0.02',
|
|
14
|
+
// SqueezeOS signals
|
|
15
|
+
leviathan_signal: '0.05',
|
|
16
|
+
squeezeos_council: '0.10',
|
|
17
|
+
squeezeos_scan: '0.05',
|
|
18
|
+
squeezeos_options: '0.05',
|
|
19
|
+
squeezeos_iwm: '0.03',
|
|
20
|
+
squeezeos_preview: '0.00',
|
|
21
|
+
squeezeos_status: '0.00',
|
|
22
|
+
// SEC / Earnings
|
|
23
|
+
xmit_edgar_decode: '0.02',
|
|
24
|
+
xdeo_earnings_estimate: '0.02',
|
|
25
|
+
// FTD
|
|
26
|
+
ftd_threshold_scan: '0.05',
|
|
27
|
+
// Crawl
|
|
28
|
+
crawl_paid_fetch: '0.005',
|
|
29
|
+
// Agent marketplace
|
|
30
|
+
nexus_agent_hire: '0.00',
|
|
31
|
+
// Ghost Layer (cross-chain)
|
|
32
|
+
ghost_route: '0.01',
|
|
33
|
+
ghost_status: '0.00',
|
|
34
|
+
// RLUSD Rails
|
|
35
|
+
rails_transfer: '0.01',
|
|
36
|
+
rails_status: '0.00',
|
|
37
|
+
// Launchpad
|
|
38
|
+
launchpad_create: '0.10',
|
|
39
|
+
launchpad_buy: '0.01',
|
|
40
|
+
launchpad_list: '0.00',
|
|
41
|
+
launchpad_status: '0.00',
|
|
42
|
+
// Copy-Trader
|
|
43
|
+
copytrader_subscribe: '0.05',
|
|
44
|
+
copytrader_status: '0.00',
|
|
45
|
+
// Backtest
|
|
46
|
+
backtest_run: '0.05',
|
|
47
|
+
backtest_validate: '0.05',
|
|
48
|
+
backtest_status: '0.00',
|
|
49
|
+
// Brokers (Tradier + Robinhood order execution)
|
|
50
|
+
tradier_order: '0.01',
|
|
51
|
+
robinhood_order: '0.01',
|
|
52
|
+
// Shadow Desk
|
|
53
|
+
shadow_query: '0.02',
|
|
54
|
+
shadow_ingest: '0.01',
|
|
55
|
+
shadow_status: '0.00',
|
|
56
|
+
// Forge (LLM gateway)
|
|
57
|
+
forge_llm: '0.02',
|
|
58
|
+
forge_status: '0.00',
|
|
59
|
+
// Proof402 (free)
|
|
60
|
+
proof_invoice: '0.00',
|
|
61
|
+
proof_verify: '0.00',
|
|
62
|
+
proof_credit_score: '0.00',
|
|
63
|
+
// Echo (pattern matching)
|
|
64
|
+
echo_pattern_match: '0.05',
|
|
65
|
+
// Agent card / identity
|
|
66
|
+
agentcard_mint: '0.01',
|
|
67
|
+
agentcard_verify: '0.00',
|
|
68
|
+
agentcard_lookup: '0.00',
|
|
69
|
+
};
|
|
70
|
+
class PriceRegistry {
|
|
71
|
+
static instance;
|
|
72
|
+
cache = new Map();
|
|
73
|
+
baseUrl;
|
|
74
|
+
constructor() {
|
|
75
|
+
this.baseUrl = process.env['SML_API_BASE'] ?? 'https://squeezeos-api.onrender.com';
|
|
76
|
+
}
|
|
77
|
+
static getInstance() {
|
|
78
|
+
if (!PriceRegistry.instance) {
|
|
79
|
+
PriceRegistry.instance = new PriceRegistry();
|
|
80
|
+
}
|
|
81
|
+
return PriceRegistry.instance;
|
|
82
|
+
}
|
|
83
|
+
async getPrice(toolName) {
|
|
84
|
+
const cached = this.cache.get(toolName);
|
|
85
|
+
const now = Date.now();
|
|
86
|
+
if (cached && now - cached.fetchedAt < PRICE_CACHE_TTL) {
|
|
87
|
+
return cached.price;
|
|
88
|
+
}
|
|
89
|
+
// Fetch live price from SML pricing API
|
|
90
|
+
try {
|
|
91
|
+
const res = await fetch(`${this.baseUrl}/pricing/v1/tool/${toolName}`, {
|
|
92
|
+
signal: AbortSignal.timeout(3000),
|
|
93
|
+
});
|
|
94
|
+
if (res.ok) {
|
|
95
|
+
const body = (await res.json());
|
|
96
|
+
this.cache.set(toolName, { price: body.price, fetchedAt: now });
|
|
97
|
+
return body.price;
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
catch {
|
|
101
|
+
// Fall through to hardcoded baseline
|
|
102
|
+
}
|
|
103
|
+
// Use hardcoded baseline if API unavailable
|
|
104
|
+
const fallback = BASE_PRICES[toolName];
|
|
105
|
+
if (fallback !== undefined) {
|
|
106
|
+
this.cache.set(toolName, { price: fallback, fetchedAt: now - PRICE_CACHE_TTL / 2 });
|
|
107
|
+
return fallback;
|
|
108
|
+
}
|
|
109
|
+
// Unknown tool — reject rather than silently treat as free.
|
|
110
|
+
// Returning '0.00' here would let any unknown/mistyped tool name be served
|
|
111
|
+
// for free (revenue + safety leak). Callers that charge must get null and stop.
|
|
112
|
+
return null;
|
|
113
|
+
}
|
|
114
|
+
seedDefaults() {
|
|
115
|
+
const now = Date.now();
|
|
116
|
+
for (const [tool, price] of Object.entries(BASE_PRICES)) {
|
|
117
|
+
if (!this.cache.has(tool)) {
|
|
118
|
+
this.cache.set(tool, { price, fetchedAt: now });
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
exports.PriceRegistry = PriceRegistry;
|
|
124
|
+
//# sourceMappingURL=pricing.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pricing.js","sourceRoot":"","sources":["../../../src/server/registry/pricing.ts"],"names":[],"mappings":"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"}
|