@itachisol/plugin-x402-swarms 0.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/LICENSE +21 -0
- package/README.md +323 -0
- package/dist/actions/delegateToSwarm.d.ts +8 -0
- package/dist/actions/delegateToSwarm.d.ts.map +1 -0
- package/dist/actions/delegateToSwarm.js +296 -0
- package/dist/actions/delegateToSwarm.js.map +1 -0
- package/dist/actions/delegateToSwarmWithPayment.d.ts +8 -0
- package/dist/actions/delegateToSwarmWithPayment.d.ts.map +1 -0
- package/dist/actions/delegateToSwarmWithPayment.js +323 -0
- package/dist/actions/delegateToSwarmWithPayment.js.map +1 -0
- package/dist/actions/discoverServices.d.ts +3 -0
- package/dist/actions/discoverServices.d.ts.map +1 -0
- package/dist/actions/discoverServices.js +63 -0
- package/dist/actions/discoverServices.js.map +1 -0
- package/dist/actions/index.d.ts +6 -0
- package/dist/actions/index.d.ts.map +1 -0
- package/dist/actions/index.js +6 -0
- package/dist/actions/index.js.map +1 -0
- package/dist/actions/payForService.d.ts +3 -0
- package/dist/actions/payForService.d.ts.map +1 -0
- package/dist/actions/payForService.js +115 -0
- package/dist/actions/payForService.js.map +1 -0
- package/dist/actions/runSwarmAgent.d.ts +7 -0
- package/dist/actions/runSwarmAgent.d.ts.map +1 -0
- package/dist/actions/runSwarmAgent.js +131 -0
- package/dist/actions/runSwarmAgent.js.map +1 -0
- package/dist/client/index.d.ts +512 -0
- package/dist/client/index.d.ts.map +1 -0
- package/dist/client/index.js +469 -0
- package/dist/client/index.js.map +1 -0
- package/dist/evaluators/paymentEvaluator.d.ts +7 -0
- package/dist/evaluators/paymentEvaluator.d.ts.map +1 -0
- package/dist/evaluators/paymentEvaluator.js +104 -0
- package/dist/evaluators/paymentEvaluator.js.map +1 -0
- package/dist/index.d.ts +29 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +60 -0
- package/dist/index.js.map +1 -0
- package/dist/marketing/index.d.ts +7 -0
- package/dist/marketing/index.d.ts.map +1 -0
- package/dist/marketing/index.js +7 -0
- package/dist/marketing/index.js.map +1 -0
- package/dist/marketing/milestoneAgent.d.ts +54 -0
- package/dist/marketing/milestoneAgent.d.ts.map +1 -0
- package/dist/marketing/milestoneAgent.js +121 -0
- package/dist/marketing/milestoneAgent.js.map +1 -0
- package/dist/marketing/tweetTemplates.d.ts +32 -0
- package/dist/marketing/tweetTemplates.d.ts.map +1 -0
- package/dist/marketing/tweetTemplates.js +60 -0
- package/dist/marketing/tweetTemplates.js.map +1 -0
- package/dist/marketing/xMonitor.d.ts +51 -0
- package/dist/marketing/xMonitor.d.ts.map +1 -0
- package/dist/marketing/xMonitor.js +141 -0
- package/dist/marketing/xMonitor.js.map +1 -0
- package/dist/providers/x402Provider.d.ts +7 -0
- package/dist/providers/x402Provider.d.ts.map +1 -0
- package/dist/providers/x402Provider.js +72 -0
- package/dist/providers/x402Provider.js.map +1 -0
- package/dist/providers/x402ServerProvider.d.ts +7 -0
- package/dist/providers/x402ServerProvider.d.ts.map +1 -0
- package/dist/providers/x402ServerProvider.js +48 -0
- package/dist/providers/x402ServerProvider.js.map +1 -0
- package/dist/routes/advancedRoutes.d.ts +5 -0
- package/dist/routes/advancedRoutes.d.ts.map +1 -0
- package/dist/routes/advancedRoutes.js +869 -0
- package/dist/routes/advancedRoutes.js.map +1 -0
- package/dist/routes/batchRoutes.d.ts +13 -0
- package/dist/routes/batchRoutes.d.ts.map +1 -0
- package/dist/routes/batchRoutes.js +496 -0
- package/dist/routes/batchRoutes.js.map +1 -0
- package/dist/routes/codeAuditRoutes.d.ts +6 -0
- package/dist/routes/codeAuditRoutes.d.ts.map +1 -0
- package/dist/routes/codeAuditRoutes.js +415 -0
- package/dist/routes/codeAuditRoutes.js.map +1 -0
- package/dist/routes/contentRoutes.d.ts +5 -0
- package/dist/routes/contentRoutes.d.ts.map +1 -0
- package/dist/routes/contentRoutes.js +370 -0
- package/dist/routes/contentRoutes.js.map +1 -0
- package/dist/routes/cryptoAnalysisRoutes.d.ts +5 -0
- package/dist/routes/cryptoAnalysisRoutes.d.ts.map +1 -0
- package/dist/routes/cryptoAnalysisRoutes.js +641 -0
- package/dist/routes/cryptoAnalysisRoutes.js.map +1 -0
- package/dist/routes/cryptoRoutes.d.ts +5 -0
- package/dist/routes/cryptoRoutes.d.ts.map +1 -0
- package/dist/routes/cryptoRoutes.js +1225 -0
- package/dist/routes/cryptoRoutes.js.map +1 -0
- package/dist/routes/heliusDataRoutes.d.ts +14 -0
- package/dist/routes/heliusDataRoutes.d.ts.map +1 -0
- package/dist/routes/heliusDataRoutes.js +388 -0
- package/dist/routes/heliusDataRoutes.js.map +1 -0
- package/dist/routes/taskRoutes.d.ts +5 -0
- package/dist/routes/taskRoutes.d.ts.map +1 -0
- package/dist/routes/taskRoutes.js +574 -0
- package/dist/routes/taskRoutes.js.map +1 -0
- package/dist/routes/tradingRoutes.d.ts +5 -0
- package/dist/routes/tradingRoutes.d.ts.map +1 -0
- package/dist/routes/tradingRoutes.js +500 -0
- package/dist/routes/tradingRoutes.js.map +1 -0
- package/dist/routes/walletAnalyzerRoutes.d.ts +12 -0
- package/dist/routes/walletAnalyzerRoutes.d.ts.map +1 -0
- package/dist/routes/walletAnalyzerRoutes.js +316 -0
- package/dist/routes/walletAnalyzerRoutes.js.map +1 -0
- package/dist/routes/x402Routes.d.ts +9 -0
- package/dist/routes/x402Routes.d.ts.map +1 -0
- package/dist/routes/x402Routes.js +474 -0
- package/dist/routes/x402Routes.js.map +1 -0
- package/dist/schemas/budgetState.d.ts +250 -0
- package/dist/schemas/budgetState.d.ts.map +1 -0
- package/dist/schemas/budgetState.js +20 -0
- package/dist/schemas/budgetState.js.map +1 -0
- package/dist/schemas/endpointScores.d.ts +182 -0
- package/dist/schemas/endpointScores.d.ts.map +1 -0
- package/dist/schemas/endpointScores.js +17 -0
- package/dist/schemas/endpointScores.js.map +1 -0
- package/dist/schemas/index.d.ts +4 -0
- package/dist/schemas/index.d.ts.map +1 -0
- package/dist/schemas/index.js +4 -0
- package/dist/schemas/index.js.map +1 -0
- package/dist/schemas/paymentHistory.d.ts +284 -0
- package/dist/schemas/paymentHistory.d.ts.map +1 -0
- package/dist/schemas/paymentHistory.js +24 -0
- package/dist/schemas/paymentHistory.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 +3 -0
- package/dist/server/index.js.map +1 -0
- package/dist/server/x402Gate.d.ts +56 -0
- package/dist/server/x402Gate.d.ts.map +1 -0
- package/dist/server/x402Gate.js +240 -0
- package/dist/server/x402Gate.js.map +1 -0
- package/dist/server/x402ServerService.d.ts +30 -0
- package/dist/server/x402ServerService.d.ts.map +1 -0
- package/dist/server/x402ServerService.js +79 -0
- package/dist/server/x402ServerService.js.map +1 -0
- package/dist/services/paymentMemoryService.d.ts +73 -0
- package/dist/services/paymentMemoryService.d.ts.map +1 -0
- package/dist/services/paymentMemoryService.js +247 -0
- package/dist/services/paymentMemoryService.js.map +1 -0
- package/dist/services/swarmsService.d.ts +66 -0
- package/dist/services/swarmsService.d.ts.map +1 -0
- package/dist/services/swarmsService.js +102 -0
- package/dist/services/swarmsService.js.map +1 -0
- package/dist/services/x402WalletService.d.ts +57 -0
- package/dist/services/x402WalletService.d.ts.map +1 -0
- package/dist/services/x402WalletService.js +258 -0
- package/dist/services/x402WalletService.js.map +1 -0
- package/dist/templates/index.d.ts +24 -0
- package/dist/templates/index.d.ts.map +1 -0
- package/dist/templates/index.js +51 -0
- package/dist/templates/index.js.map +1 -0
- package/dist/templates/swarmTemplates.d.ts +22 -0
- package/dist/templates/swarmTemplates.d.ts.map +1 -0
- package/dist/templates/swarmTemplates.js +225 -0
- package/dist/templates/swarmTemplates.js.map +1 -0
- package/dist/types.d.ts +197 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +2 -0
- package/dist/types.js.map +1 -0
- package/dist/utils/cache.d.ts +17 -0
- package/dist/utils/cache.d.ts.map +1 -0
- package/dist/utils/cache.js +32 -0
- package/dist/utils/cache.js.map +1 -0
- package/dist/utils/llm.d.ts +16 -0
- package/dist/utils/llm.d.ts.map +1 -0
- package/dist/utils/llm.js +32 -0
- package/dist/utils/llm.js.map +1 -0
- package/dist/utils/reportStore.d.ts +45 -0
- package/dist/utils/reportStore.d.ts.map +1 -0
- package/dist/utils/reportStore.js +164 -0
- package/dist/utils/reportStore.js.map +1 -0
- package/dist/utils/taskQueue.d.ts +54 -0
- package/dist/utils/taskQueue.d.ts.map +1 -0
- package/dist/utils/taskQueue.js +124 -0
- package/dist/utils/taskQueue.js.map +1 -0
- package/package.json +69 -0
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
import { Service, type IAgentRuntime } from "@elizaos/core";
|
|
2
|
+
import { type BudgetAccount, type PaymentReceipt } from "@dexterai/x402/client";
|
|
3
|
+
import type { X402PaymentConfig } from "../types.js";
|
|
4
|
+
export interface PayForResourceOptions {
|
|
5
|
+
method?: string;
|
|
6
|
+
headers?: Record<string, string>;
|
|
7
|
+
body?: string;
|
|
8
|
+
}
|
|
9
|
+
export interface PayForResourceResult {
|
|
10
|
+
txHash: string;
|
|
11
|
+
network: string | undefined;
|
|
12
|
+
payer: string | undefined;
|
|
13
|
+
amountUsd: number;
|
|
14
|
+
receipt: PaymentReceipt | undefined;
|
|
15
|
+
response: Response;
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* Manages the agent's x402 payment wallet via the Dexter SDK.
|
|
19
|
+
* Uses BudgetAccount for automatic spending controls and payment tracking.
|
|
20
|
+
*/
|
|
21
|
+
export declare class X402WalletService extends Service {
|
|
22
|
+
static serviceType: string;
|
|
23
|
+
capabilityDescription: string;
|
|
24
|
+
private paymentConfig;
|
|
25
|
+
private budgetAccount;
|
|
26
|
+
private x402Fetch;
|
|
27
|
+
private agentRuntime;
|
|
28
|
+
static start(runtime: IAgentRuntime): Promise<X402WalletService>;
|
|
29
|
+
stop(): Promise<void>;
|
|
30
|
+
initialize(runtime: IAgentRuntime): Promise<void>;
|
|
31
|
+
/**
|
|
32
|
+
* Get the x402-wrapped fetch that auto-pays for 402 responses.
|
|
33
|
+
*/
|
|
34
|
+
getX402Fetch(): typeof globalThis.fetch;
|
|
35
|
+
/**
|
|
36
|
+
* Get the budget-controlled fetch for autonomous agent spending.
|
|
37
|
+
*/
|
|
38
|
+
getBudgetAccount(): BudgetAccount | null;
|
|
39
|
+
/**
|
|
40
|
+
* Pay for an x402-protected resource using the budget account.
|
|
41
|
+
* The Dexter SDK handles the 402 → sign → retry flow automatically.
|
|
42
|
+
* Supports arbitrary HTTP methods and bodies.
|
|
43
|
+
*/
|
|
44
|
+
payForResource(endpoint: string, options?: PayForResourceOptions): Promise<PayForResourceResult>;
|
|
45
|
+
private mapX402Error;
|
|
46
|
+
getPaymentHistory(): Array<{
|
|
47
|
+
amount: number;
|
|
48
|
+
domain: string;
|
|
49
|
+
network: string;
|
|
50
|
+
timestamp: number;
|
|
51
|
+
}>;
|
|
52
|
+
getTotalSpentUsd(): number;
|
|
53
|
+
getRemainingBudget(): number;
|
|
54
|
+
getHourlySpend(): number;
|
|
55
|
+
getConfig(): X402PaymentConfig;
|
|
56
|
+
}
|
|
57
|
+
//# sourceMappingURL=x402WalletService.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"x402WalletService.d.ts","sourceRoot":"","sources":["../../src/services/x402WalletService.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,KAAK,aAAa,EAAE,MAAM,eAAe,CAAC;AAC5D,OAAO,EAKL,KAAK,aAAa,EAElB,KAAK,cAAc,EACpB,MAAM,uBAAuB,CAAC;AAC/B,OAAO,KAAK,EAAE,iBAAiB,EAAwB,MAAM,aAAa,CAAC;AAG3E,MAAM,WAAW,qBAAqB;IACpC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACjC,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,oBAAoB;IACnC,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,GAAG,SAAS,CAAC;IAC5B,KAAK,EAAE,MAAM,GAAG,SAAS,CAAC;IAC1B,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,cAAc,GAAG,SAAS,CAAC;IACpC,QAAQ,EAAE,QAAQ,CAAC;CACpB;AAED;;;GAGG;AACH,qBAAa,iBAAkB,SAAQ,OAAO;IAC5C,MAAM,CAAC,WAAW,SAAiB;IACnC,qBAAqB,SACwF;IAE7G,OAAO,CAAC,aAAa,CAAqB;IAC1C,OAAO,CAAC,aAAa,CAA8B;IACnD,OAAO,CAAC,SAAS,CAAwC;IACzD,OAAO,CAAC,YAAY,CAA8B;WAErC,KAAK,CAAC,OAAO,EAAE,aAAa,GAAG,OAAO,CAAC,iBAAiB,CAAC;IAMhE,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAMrB,UAAU,CAAC,OAAO,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC;IA4GvD;;OAEG;IACH,YAAY,IAAI,OAAO,UAAU,CAAC,KAAK;IAOvC;;OAEG;IACH,gBAAgB,IAAI,aAAa,GAAG,IAAI;IAIxC;;;;OAIG;IACG,cAAc,CAClB,QAAQ,EAAE,MAAM,EAChB,OAAO,CAAC,EAAE,qBAAqB,GAC9B,OAAO,CAAC,oBAAoB,CAAC;IA4GhC,OAAO,CAAC,YAAY;IAsBpB,iBAAiB,IAAI,KAAK,CAAC;QACzB,MAAM,EAAE,MAAM,CAAC;QACf,MAAM,EAAE,MAAM,CAAC;QACf,OAAO,EAAE,MAAM,CAAC;QAChB,SAAS,EAAE,MAAM,CAAC;KACnB,CAAC;IAKF,gBAAgB,IAAI,MAAM;IAI1B,kBAAkB,IAAI,MAAM;IAI5B,cAAc,IAAI,MAAM;IAIxB,SAAS,IAAI,iBAAiB;CAG/B"}
|
|
@@ -0,0 +1,258 @@
|
|
|
1
|
+
import { Service } from "@elizaos/core";
|
|
2
|
+
import { wrapFetch, createBudgetAccount, getPaymentReceipt, X402Error, } from "@dexterai/x402/client";
|
|
3
|
+
/**
|
|
4
|
+
* Manages the agent's x402 payment wallet via the Dexter SDK.
|
|
5
|
+
* Uses BudgetAccount for automatic spending controls and payment tracking.
|
|
6
|
+
*/
|
|
7
|
+
export class X402WalletService extends Service {
|
|
8
|
+
static serviceType = "X402_WALLET";
|
|
9
|
+
capabilityDescription = "Manages x402 micropayments via Dexter SDK with budget controls, access passes, and marketplace discovery";
|
|
10
|
+
paymentConfig;
|
|
11
|
+
budgetAccount = null;
|
|
12
|
+
x402Fetch = null;
|
|
13
|
+
agentRuntime = null;
|
|
14
|
+
static async start(runtime) {
|
|
15
|
+
const instance = new X402WalletService(runtime);
|
|
16
|
+
await instance.initialize(runtime);
|
|
17
|
+
return instance;
|
|
18
|
+
}
|
|
19
|
+
async stop() {
|
|
20
|
+
this.budgetAccount = null;
|
|
21
|
+
this.x402Fetch = null;
|
|
22
|
+
this.agentRuntime = null;
|
|
23
|
+
}
|
|
24
|
+
async initialize(runtime) {
|
|
25
|
+
this.agentRuntime = runtime;
|
|
26
|
+
const networkRaw = runtime.getSetting("X402_NETWORK_ID");
|
|
27
|
+
const receiveRaw = runtime.getSetting("X402_RECEIVE_ADDRESS");
|
|
28
|
+
const maxPayRaw = runtime.getSetting("X402_MAX_AUTO_PAY_USD");
|
|
29
|
+
const solanaKey = runtime.getSetting("SOLANA_PRIVATE_KEY");
|
|
30
|
+
const evmKey = runtime.getSetting("EVM_PRIVATE_KEY");
|
|
31
|
+
const budgetRaw = runtime.getSetting("X402_BUDGET_USD");
|
|
32
|
+
const facilitatorRaw = runtime.getSetting("X402_FACILITATOR_URL");
|
|
33
|
+
const accessTierRaw = runtime.getSetting("X402_ACCESS_PASS_TIER");
|
|
34
|
+
const accessMaxSpendRaw = runtime.getSetting("X402_ACCESS_PASS_MAX_SPEND");
|
|
35
|
+
this.paymentConfig = {
|
|
36
|
+
networkId: networkRaw ?? "base-mainnet",
|
|
37
|
+
receiveAddress: receiveRaw != null ? String(receiveRaw) : "",
|
|
38
|
+
maxAutoPayUsd: parseFloat(maxPayRaw != null ? String(maxPayRaw) : "0.10"),
|
|
39
|
+
solanaPrivateKey: solanaKey != null ? String(solanaKey) : undefined,
|
|
40
|
+
evmPrivateKey: evmKey != null ? String(evmKey) : undefined,
|
|
41
|
+
accessPassTier: accessTierRaw != null ? String(accessTierRaw) : undefined,
|
|
42
|
+
accessPassMaxSpend: accessMaxSpendRaw != null ? String(accessMaxSpendRaw) : undefined,
|
|
43
|
+
};
|
|
44
|
+
const hasWallet = !!this.paymentConfig.solanaPrivateKey ||
|
|
45
|
+
!!this.paymentConfig.evmPrivateKey;
|
|
46
|
+
if (!hasWallet) {
|
|
47
|
+
runtime.logger.warn("[X402WalletService] No wallet key configured (SOLANA_PRIVATE_KEY or EVM_PRIVATE_KEY). Payment features disabled.");
|
|
48
|
+
return;
|
|
49
|
+
}
|
|
50
|
+
// Build wrapFetch options
|
|
51
|
+
const fetchOpts = {
|
|
52
|
+
verbose: false,
|
|
53
|
+
};
|
|
54
|
+
if (this.paymentConfig.solanaPrivateKey) {
|
|
55
|
+
fetchOpts.walletPrivateKey = this.paymentConfig.solanaPrivateKey;
|
|
56
|
+
}
|
|
57
|
+
if (this.paymentConfig.evmPrivateKey) {
|
|
58
|
+
fetchOpts.evmPrivateKey = this.paymentConfig.evmPrivateKey;
|
|
59
|
+
}
|
|
60
|
+
if (facilitatorRaw) {
|
|
61
|
+
fetchOpts.facilitatorUrl = String(facilitatorRaw);
|
|
62
|
+
}
|
|
63
|
+
// Access Pass configuration
|
|
64
|
+
if (this.paymentConfig.accessPassTier) {
|
|
65
|
+
fetchOpts.accessPass = {
|
|
66
|
+
preferTier: this.paymentConfig.accessPassTier,
|
|
67
|
+
maxSpend: this.paymentConfig.accessPassMaxSpend ?? "2.00",
|
|
68
|
+
autoRenew: true,
|
|
69
|
+
};
|
|
70
|
+
}
|
|
71
|
+
// Determine preferred network from config
|
|
72
|
+
const networkMap = {
|
|
73
|
+
"base-mainnet": "eip155:8453",
|
|
74
|
+
"base-sepolia": "eip155:84532",
|
|
75
|
+
"ethereum-mainnet": "eip155:1",
|
|
76
|
+
"solana-mainnet": "solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp",
|
|
77
|
+
"polygon-mainnet": "eip155:137",
|
|
78
|
+
"arbitrum-mainnet": "eip155:42161",
|
|
79
|
+
};
|
|
80
|
+
const preferred = networkMap[String(networkRaw ?? "base-mainnet")];
|
|
81
|
+
if (preferred) {
|
|
82
|
+
fetchOpts.preferredNetwork = preferred;
|
|
83
|
+
}
|
|
84
|
+
// Create BudgetAccount for spending controls
|
|
85
|
+
const totalBudget = budgetRaw != null ? String(budgetRaw) : "10.00";
|
|
86
|
+
const perRequest = String(this.paymentConfig.maxAutoPayUsd.toFixed(2));
|
|
87
|
+
this.budgetAccount = createBudgetAccount({
|
|
88
|
+
...fetchOpts,
|
|
89
|
+
budget: {
|
|
90
|
+
total: totalBudget,
|
|
91
|
+
perRequest,
|
|
92
|
+
perHour: String(Math.min(parseFloat(totalBudget), this.paymentConfig.maxAutoPayUsd * 100).toFixed(2)),
|
|
93
|
+
},
|
|
94
|
+
});
|
|
95
|
+
// Also create a plain wrapFetch for direct use
|
|
96
|
+
this.x402Fetch = wrapFetch(fetch, fetchOpts);
|
|
97
|
+
runtime.logger.info({
|
|
98
|
+
network: this.paymentConfig.networkId,
|
|
99
|
+
maxAutoPayUsd: this.paymentConfig.maxAutoPayUsd,
|
|
100
|
+
totalBudget,
|
|
101
|
+
hasSolana: !!this.paymentConfig.solanaPrivateKey,
|
|
102
|
+
hasEvm: !!this.paymentConfig.evmPrivateKey,
|
|
103
|
+
accessPass: !!this.paymentConfig.accessPassTier,
|
|
104
|
+
}, "[X402WalletService] Initialized with Dexter SDK");
|
|
105
|
+
}
|
|
106
|
+
/**
|
|
107
|
+
* Get the x402-wrapped fetch that auto-pays for 402 responses.
|
|
108
|
+
*/
|
|
109
|
+
getX402Fetch() {
|
|
110
|
+
if (!this.x402Fetch) {
|
|
111
|
+
throw new Error("X402 wallet not initialized — no wallet key configured");
|
|
112
|
+
}
|
|
113
|
+
return this.x402Fetch;
|
|
114
|
+
}
|
|
115
|
+
/**
|
|
116
|
+
* Get the budget-controlled fetch for autonomous agent spending.
|
|
117
|
+
*/
|
|
118
|
+
getBudgetAccount() {
|
|
119
|
+
return this.budgetAccount;
|
|
120
|
+
}
|
|
121
|
+
/**
|
|
122
|
+
* Pay for an x402-protected resource using the budget account.
|
|
123
|
+
* The Dexter SDK handles the 402 → sign → retry flow automatically.
|
|
124
|
+
* Supports arbitrary HTTP methods and bodies.
|
|
125
|
+
*/
|
|
126
|
+
async payForResource(endpoint, options) {
|
|
127
|
+
if (!this.budgetAccount) {
|
|
128
|
+
throw new Error("X402 wallet not initialized — no wallet key configured");
|
|
129
|
+
}
|
|
130
|
+
// Capture local references so that stop() during an in-flight payment
|
|
131
|
+
// doesn't null them out from under us.
|
|
132
|
+
const budgetAccount = this.budgetAccount;
|
|
133
|
+
const runtime = this.agentRuntime;
|
|
134
|
+
const spentBefore = budgetAccount.spentAmount;
|
|
135
|
+
let response;
|
|
136
|
+
const startTime = Date.now();
|
|
137
|
+
try {
|
|
138
|
+
const init = {};
|
|
139
|
+
if (options?.method)
|
|
140
|
+
init.method = options.method;
|
|
141
|
+
if (options?.headers)
|
|
142
|
+
init.headers = options.headers;
|
|
143
|
+
if (options?.body)
|
|
144
|
+
init.body = options.body;
|
|
145
|
+
response = await budgetAccount.fetch(endpoint, Object.keys(init).length > 0 ? init : undefined);
|
|
146
|
+
}
|
|
147
|
+
catch (err) {
|
|
148
|
+
if (err instanceof X402Error) {
|
|
149
|
+
const friendly = this.mapX402Error(err);
|
|
150
|
+
throw new Error(friendly);
|
|
151
|
+
}
|
|
152
|
+
throw err;
|
|
153
|
+
}
|
|
154
|
+
const responseTimeMs = Date.now() - startTime;
|
|
155
|
+
const spentAfter = budgetAccount.spentAmount;
|
|
156
|
+
const amountPaid = spentAfter - spentBefore;
|
|
157
|
+
// Extract real on-chain receipt from response
|
|
158
|
+
const receipt = getPaymentReceipt(response);
|
|
159
|
+
const result = {
|
|
160
|
+
txHash: receipt?.transaction ?? "no-payment-required",
|
|
161
|
+
network: receipt?.network,
|
|
162
|
+
payer: receipt?.payer,
|
|
163
|
+
amountUsd: amountPaid,
|
|
164
|
+
receipt,
|
|
165
|
+
response,
|
|
166
|
+
};
|
|
167
|
+
// Log payment details
|
|
168
|
+
if (amountPaid > 0 && runtime) {
|
|
169
|
+
runtime.logger.info({
|
|
170
|
+
endpoint,
|
|
171
|
+
txHash: result.txHash,
|
|
172
|
+
network: result.network,
|
|
173
|
+
payer: result.payer,
|
|
174
|
+
amountUsd: amountPaid,
|
|
175
|
+
remainingBudget: budgetAccount.remainingAmount,
|
|
176
|
+
}, "[X402WalletService] Payment completed");
|
|
177
|
+
}
|
|
178
|
+
// Record payment in persistent memory (fire-and-forget)
|
|
179
|
+
try {
|
|
180
|
+
const memoryService = runtime?.getService("PAYMENT_MEMORY");
|
|
181
|
+
if (memoryService) {
|
|
182
|
+
let domain;
|
|
183
|
+
try {
|
|
184
|
+
domain = new URL(endpoint).hostname;
|
|
185
|
+
}
|
|
186
|
+
catch {
|
|
187
|
+
domain = "unknown";
|
|
188
|
+
}
|
|
189
|
+
const responsePreview = await response
|
|
190
|
+
.clone()
|
|
191
|
+
.text()
|
|
192
|
+
.catch(() => "")
|
|
193
|
+
.then((t) => t.slice(0, 200));
|
|
194
|
+
const record = {
|
|
195
|
+
id: crypto.randomUUID(),
|
|
196
|
+
agentId: runtime?.agentId ?? "unknown",
|
|
197
|
+
endpoint,
|
|
198
|
+
domain,
|
|
199
|
+
method: options?.method ?? "GET",
|
|
200
|
+
amountUsd: amountPaid,
|
|
201
|
+
txHash: result.txHash,
|
|
202
|
+
network: result.network,
|
|
203
|
+
payer: result.payer,
|
|
204
|
+
status: "confirmed",
|
|
205
|
+
responseStatus: response.status,
|
|
206
|
+
responseTimeMs,
|
|
207
|
+
responsePreview,
|
|
208
|
+
createdAt: Date.now(),
|
|
209
|
+
};
|
|
210
|
+
// Catch async rejection so it never becomes an unhandled promise rejection
|
|
211
|
+
void memoryService.recordPayment(record).catch(() => { });
|
|
212
|
+
}
|
|
213
|
+
}
|
|
214
|
+
catch {
|
|
215
|
+
// Recording failure must never break the payment flow
|
|
216
|
+
}
|
|
217
|
+
return result;
|
|
218
|
+
}
|
|
219
|
+
mapX402Error(err) {
|
|
220
|
+
switch (err.code) {
|
|
221
|
+
case "insufficient_balance":
|
|
222
|
+
return `Insufficient USDC balance. Fund your wallet. ${err.message}`;
|
|
223
|
+
case "amount_exceeds_max":
|
|
224
|
+
return `Payment exceeds per-request limit ($${this.paymentConfig.maxAutoPayUsd}). ${err.message}`;
|
|
225
|
+
case "payment_rejected":
|
|
226
|
+
return `Payment rejected (budget exhausted or domain blocked). ${err.message}`;
|
|
227
|
+
case "facilitator_settle_failed":
|
|
228
|
+
return `On-chain settlement failed. ${err.message}`;
|
|
229
|
+
case "facilitator_timeout":
|
|
230
|
+
case "rpc_timeout":
|
|
231
|
+
return `Network timeout during payment. Retry may succeed. ${err.message}`;
|
|
232
|
+
case "user_rejected_signature":
|
|
233
|
+
return `Payment signature rejected. ${err.message}`;
|
|
234
|
+
case "access_pass_expired":
|
|
235
|
+
return `Access pass expired. A new one will be purchased on next call. ${err.message}`;
|
|
236
|
+
default:
|
|
237
|
+
return `x402 error [${err.code}]: ${err.message}`;
|
|
238
|
+
}
|
|
239
|
+
}
|
|
240
|
+
getPaymentHistory() {
|
|
241
|
+
if (!this.budgetAccount)
|
|
242
|
+
return [];
|
|
243
|
+
return [...this.budgetAccount.ledger];
|
|
244
|
+
}
|
|
245
|
+
getTotalSpentUsd() {
|
|
246
|
+
return this.budgetAccount?.spentAmount ?? 0;
|
|
247
|
+
}
|
|
248
|
+
getRemainingBudget() {
|
|
249
|
+
return this.budgetAccount?.remainingAmount ?? 0;
|
|
250
|
+
}
|
|
251
|
+
getHourlySpend() {
|
|
252
|
+
return this.budgetAccount?.hourlySpend ?? 0;
|
|
253
|
+
}
|
|
254
|
+
getConfig() {
|
|
255
|
+
return { ...this.paymentConfig };
|
|
256
|
+
}
|
|
257
|
+
}
|
|
258
|
+
//# sourceMappingURL=x402WalletService.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"x402WalletService.js","sourceRoot":"","sources":["../../src/services/x402WalletService.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import type { SwarmTemplate } from "../types.js";
|
|
2
|
+
export { researchPipelineTemplate, analysisPanelTemplate, codeReviewTemplate, debateAndDecideTemplate, } from "./swarmTemplates.js";
|
|
3
|
+
/**
|
|
4
|
+
* Registry of all available swarm templates.
|
|
5
|
+
* Ordered by specificity — more specific patterns first to avoid false matches.
|
|
6
|
+
*/
|
|
7
|
+
export declare const SWARM_TEMPLATES: SwarmTemplate[];
|
|
8
|
+
/**
|
|
9
|
+
* Find the first matching template based on regex trigger patterns.
|
|
10
|
+
* Templates are checked in specificity order (most specific first).
|
|
11
|
+
* Returns null if no template matches.
|
|
12
|
+
*/
|
|
13
|
+
export declare function findMatchingTemplate(text: string): SwarmTemplate | null;
|
|
14
|
+
/**
|
|
15
|
+
* Register a custom swarm template at runtime.
|
|
16
|
+
* Custom templates are appended to the end of the registry (lowest priority).
|
|
17
|
+
*/
|
|
18
|
+
export declare function registerSwarmTemplate(template: SwarmTemplate): void;
|
|
19
|
+
/**
|
|
20
|
+
* Build a classification prompt listing all available templates.
|
|
21
|
+
* Used when keyword matching is ambiguous or fails.
|
|
22
|
+
*/
|
|
23
|
+
export declare function buildClassificationPrompt(userMessage: string): string;
|
|
24
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/templates/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAQjD,OAAO,EACL,wBAAwB,EACxB,qBAAqB,EACrB,kBAAkB,EAClB,uBAAuB,GACxB,MAAM,qBAAqB,CAAC;AAE7B;;;GAGG;AACH,eAAO,MAAM,eAAe,EAAE,aAAa,EAK1C,CAAC;AAEF;;;;GAIG;AACH,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,MAAM,GAAG,aAAa,GAAG,IAAI,CAQvE;AAED;;;GAGG;AACH,wBAAgB,qBAAqB,CAAC,QAAQ,EAAE,aAAa,GAAG,IAAI,CAEnE;AAED;;;GAGG;AACH,wBAAgB,yBAAyB,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,CAcrE"}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
import { codeReviewTemplate, debateAndDecideTemplate, researchPipelineTemplate, analysisPanelTemplate, } from "./swarmTemplates.js";
|
|
2
|
+
export { researchPipelineTemplate, analysisPanelTemplate, codeReviewTemplate, debateAndDecideTemplate, } from "./swarmTemplates.js";
|
|
3
|
+
/**
|
|
4
|
+
* Registry of all available swarm templates.
|
|
5
|
+
* Ordered by specificity — more specific patterns first to avoid false matches.
|
|
6
|
+
*/
|
|
7
|
+
export const SWARM_TEMPLATES = [
|
|
8
|
+
codeReviewTemplate, // Most specific triggers (code+review, audit, contract)
|
|
9
|
+
debateAndDecideTemplate, // Specific triggers (should I, pros/cons, debate)
|
|
10
|
+
researchPipelineTemplate, // Broader triggers (research, report, summarize)
|
|
11
|
+
analysisPanelTemplate, // Broadest triggers (analyze, evaluate, assess)
|
|
12
|
+
];
|
|
13
|
+
/**
|
|
14
|
+
* Find the first matching template based on regex trigger patterns.
|
|
15
|
+
* Templates are checked in specificity order (most specific first).
|
|
16
|
+
* Returns null if no template matches.
|
|
17
|
+
*/
|
|
18
|
+
export function findMatchingTemplate(text) {
|
|
19
|
+
if (!text)
|
|
20
|
+
return null;
|
|
21
|
+
for (const template of SWARM_TEMPLATES) {
|
|
22
|
+
if (template.triggerPatterns.some((pattern) => pattern.test(text))) {
|
|
23
|
+
return template;
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
return null;
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* Register a custom swarm template at runtime.
|
|
30
|
+
* Custom templates are appended to the end of the registry (lowest priority).
|
|
31
|
+
*/
|
|
32
|
+
export function registerSwarmTemplate(template) {
|
|
33
|
+
SWARM_TEMPLATES.push(template);
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* Build a classification prompt listing all available templates.
|
|
37
|
+
* Used when keyword matching is ambiguous or fails.
|
|
38
|
+
*/
|
|
39
|
+
export function buildClassificationPrompt(userMessage) {
|
|
40
|
+
const templateList = SWARM_TEMPLATES.map((t) => `- "${t.id}": ${t.description}`).join("\n");
|
|
41
|
+
return `Classify the user's request into one of these swarm templates, or "custom" if none fit:
|
|
42
|
+
${templateList}
|
|
43
|
+
- "custom": None of the above — needs a custom swarm configuration
|
|
44
|
+
|
|
45
|
+
Return JSON: { "templateId": "<id or custom>", "task": "<the specific task to perform>" }
|
|
46
|
+
|
|
47
|
+
User message: "${userMessage}"
|
|
48
|
+
|
|
49
|
+
Return only valid JSON, no markdown.`;
|
|
50
|
+
}
|
|
51
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/templates/index.ts"],"names":[],"mappings":"AACA,OAAO,EACL,kBAAkB,EAClB,uBAAuB,EACvB,wBAAwB,EACxB,qBAAqB,GACtB,MAAM,qBAAqB,CAAC;AAE7B,OAAO,EACL,wBAAwB,EACxB,qBAAqB,EACrB,kBAAkB,EAClB,uBAAuB,GACxB,MAAM,qBAAqB,CAAC;AAE7B;;;GAGG;AACH,MAAM,CAAC,MAAM,eAAe,GAAoB;IAC9C,kBAAkB,EAAQ,wDAAwD;IAClF,uBAAuB,EAAG,kDAAkD;IAC5E,wBAAwB,EAAE,iDAAiD;IAC3E,qBAAqB,EAAK,gDAAgD;CAC3E,CAAC;AAEF;;;;GAIG;AACH,MAAM,UAAU,oBAAoB,CAAC,IAAY;IAC/C,IAAI,CAAC,IAAI;QAAE,OAAO,IAAI,CAAC;IACvB,KAAK,MAAM,QAAQ,IAAI,eAAe,EAAE,CAAC;QACvC,IAAI,QAAQ,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC;YACnE,OAAO,QAAQ,CAAC;QAClB,CAAC;IACH,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,qBAAqB,CAAC,QAAuB;IAC3D,eAAe,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;AACjC,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,yBAAyB,CAAC,WAAmB;IAC3D,MAAM,YAAY,GAAG,eAAe,CAAC,GAAG,CACtC,CAAC,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,WAAW,EAAE,CACvC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAEb,OAAO;EACP,YAAY;;;;;iBAKG,WAAW;;qCAES,CAAC;AACtC,CAAC"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import type { SwarmTemplate } from "../types.js";
|
|
2
|
+
/**
|
|
3
|
+
* ResearchPipeline — Sequential chain: Researcher → FactChecker → Writer
|
|
4
|
+
* Use for: research tasks, report writing, investigation, summarization
|
|
5
|
+
*/
|
|
6
|
+
export declare const researchPipelineTemplate: SwarmTemplate;
|
|
7
|
+
/**
|
|
8
|
+
* AnalysisPanel — MixtureOfAgents: 3 domain experts + 1 synthesizer
|
|
9
|
+
* Use for: multi-perspective analysis, evaluation, assessment
|
|
10
|
+
*/
|
|
11
|
+
export declare const analysisPanelTemplate: SwarmTemplate;
|
|
12
|
+
/**
|
|
13
|
+
* CodeReview — ConcurrentWorkflow: 3 parallel reviewers
|
|
14
|
+
* Use for: code review, smart contract audit, security check
|
|
15
|
+
*/
|
|
16
|
+
export declare const codeReviewTemplate: SwarmTemplate;
|
|
17
|
+
/**
|
|
18
|
+
* DebateAndDecide — MajorityVoting: Proponent + Opponent + Judge
|
|
19
|
+
* Use for: decision-making, pros/cons analysis, should-I questions
|
|
20
|
+
*/
|
|
21
|
+
export declare const debateAndDecideTemplate: SwarmTemplate;
|
|
22
|
+
//# sourceMappingURL=swarmTemplates.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"swarmTemplates.d.ts","sourceRoot":"","sources":["../../src/templates/swarmTemplates.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAEjD;;;GAGG;AACH,eAAO,MAAM,wBAAwB,EAAE,aAsDtC,CAAC;AAEF;;;GAGG;AACH,eAAO,MAAM,qBAAqB,EAAE,aA4DnC,CAAC;AAEF;;;GAGG;AACH,eAAO,MAAM,kBAAkB,EAAE,aAoDhC,CAAC;AAEF;;;GAGG;AACH,eAAO,MAAM,uBAAuB,EAAE,aAoDrC,CAAC"}
|