@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.
Files changed (175) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +323 -0
  3. package/dist/actions/delegateToSwarm.d.ts +8 -0
  4. package/dist/actions/delegateToSwarm.d.ts.map +1 -0
  5. package/dist/actions/delegateToSwarm.js +296 -0
  6. package/dist/actions/delegateToSwarm.js.map +1 -0
  7. package/dist/actions/delegateToSwarmWithPayment.d.ts +8 -0
  8. package/dist/actions/delegateToSwarmWithPayment.d.ts.map +1 -0
  9. package/dist/actions/delegateToSwarmWithPayment.js +323 -0
  10. package/dist/actions/delegateToSwarmWithPayment.js.map +1 -0
  11. package/dist/actions/discoverServices.d.ts +3 -0
  12. package/dist/actions/discoverServices.d.ts.map +1 -0
  13. package/dist/actions/discoverServices.js +63 -0
  14. package/dist/actions/discoverServices.js.map +1 -0
  15. package/dist/actions/index.d.ts +6 -0
  16. package/dist/actions/index.d.ts.map +1 -0
  17. package/dist/actions/index.js +6 -0
  18. package/dist/actions/index.js.map +1 -0
  19. package/dist/actions/payForService.d.ts +3 -0
  20. package/dist/actions/payForService.d.ts.map +1 -0
  21. package/dist/actions/payForService.js +115 -0
  22. package/dist/actions/payForService.js.map +1 -0
  23. package/dist/actions/runSwarmAgent.d.ts +7 -0
  24. package/dist/actions/runSwarmAgent.d.ts.map +1 -0
  25. package/dist/actions/runSwarmAgent.js +131 -0
  26. package/dist/actions/runSwarmAgent.js.map +1 -0
  27. package/dist/client/index.d.ts +512 -0
  28. package/dist/client/index.d.ts.map +1 -0
  29. package/dist/client/index.js +469 -0
  30. package/dist/client/index.js.map +1 -0
  31. package/dist/evaluators/paymentEvaluator.d.ts +7 -0
  32. package/dist/evaluators/paymentEvaluator.d.ts.map +1 -0
  33. package/dist/evaluators/paymentEvaluator.js +104 -0
  34. package/dist/evaluators/paymentEvaluator.js.map +1 -0
  35. package/dist/index.d.ts +29 -0
  36. package/dist/index.d.ts.map +1 -0
  37. package/dist/index.js +60 -0
  38. package/dist/index.js.map +1 -0
  39. package/dist/marketing/index.d.ts +7 -0
  40. package/dist/marketing/index.d.ts.map +1 -0
  41. package/dist/marketing/index.js +7 -0
  42. package/dist/marketing/index.js.map +1 -0
  43. package/dist/marketing/milestoneAgent.d.ts +54 -0
  44. package/dist/marketing/milestoneAgent.d.ts.map +1 -0
  45. package/dist/marketing/milestoneAgent.js +121 -0
  46. package/dist/marketing/milestoneAgent.js.map +1 -0
  47. package/dist/marketing/tweetTemplates.d.ts +32 -0
  48. package/dist/marketing/tweetTemplates.d.ts.map +1 -0
  49. package/dist/marketing/tweetTemplates.js +60 -0
  50. package/dist/marketing/tweetTemplates.js.map +1 -0
  51. package/dist/marketing/xMonitor.d.ts +51 -0
  52. package/dist/marketing/xMonitor.d.ts.map +1 -0
  53. package/dist/marketing/xMonitor.js +141 -0
  54. package/dist/marketing/xMonitor.js.map +1 -0
  55. package/dist/providers/x402Provider.d.ts +7 -0
  56. package/dist/providers/x402Provider.d.ts.map +1 -0
  57. package/dist/providers/x402Provider.js +72 -0
  58. package/dist/providers/x402Provider.js.map +1 -0
  59. package/dist/providers/x402ServerProvider.d.ts +7 -0
  60. package/dist/providers/x402ServerProvider.d.ts.map +1 -0
  61. package/dist/providers/x402ServerProvider.js +48 -0
  62. package/dist/providers/x402ServerProvider.js.map +1 -0
  63. package/dist/routes/advancedRoutes.d.ts +5 -0
  64. package/dist/routes/advancedRoutes.d.ts.map +1 -0
  65. package/dist/routes/advancedRoutes.js +869 -0
  66. package/dist/routes/advancedRoutes.js.map +1 -0
  67. package/dist/routes/batchRoutes.d.ts +13 -0
  68. package/dist/routes/batchRoutes.d.ts.map +1 -0
  69. package/dist/routes/batchRoutes.js +496 -0
  70. package/dist/routes/batchRoutes.js.map +1 -0
  71. package/dist/routes/codeAuditRoutes.d.ts +6 -0
  72. package/dist/routes/codeAuditRoutes.d.ts.map +1 -0
  73. package/dist/routes/codeAuditRoutes.js +415 -0
  74. package/dist/routes/codeAuditRoutes.js.map +1 -0
  75. package/dist/routes/contentRoutes.d.ts +5 -0
  76. package/dist/routes/contentRoutes.d.ts.map +1 -0
  77. package/dist/routes/contentRoutes.js +370 -0
  78. package/dist/routes/contentRoutes.js.map +1 -0
  79. package/dist/routes/cryptoAnalysisRoutes.d.ts +5 -0
  80. package/dist/routes/cryptoAnalysisRoutes.d.ts.map +1 -0
  81. package/dist/routes/cryptoAnalysisRoutes.js +641 -0
  82. package/dist/routes/cryptoAnalysisRoutes.js.map +1 -0
  83. package/dist/routes/cryptoRoutes.d.ts +5 -0
  84. package/dist/routes/cryptoRoutes.d.ts.map +1 -0
  85. package/dist/routes/cryptoRoutes.js +1225 -0
  86. package/dist/routes/cryptoRoutes.js.map +1 -0
  87. package/dist/routes/heliusDataRoutes.d.ts +14 -0
  88. package/dist/routes/heliusDataRoutes.d.ts.map +1 -0
  89. package/dist/routes/heliusDataRoutes.js +388 -0
  90. package/dist/routes/heliusDataRoutes.js.map +1 -0
  91. package/dist/routes/taskRoutes.d.ts +5 -0
  92. package/dist/routes/taskRoutes.d.ts.map +1 -0
  93. package/dist/routes/taskRoutes.js +574 -0
  94. package/dist/routes/taskRoutes.js.map +1 -0
  95. package/dist/routes/tradingRoutes.d.ts +5 -0
  96. package/dist/routes/tradingRoutes.d.ts.map +1 -0
  97. package/dist/routes/tradingRoutes.js +500 -0
  98. package/dist/routes/tradingRoutes.js.map +1 -0
  99. package/dist/routes/walletAnalyzerRoutes.d.ts +12 -0
  100. package/dist/routes/walletAnalyzerRoutes.d.ts.map +1 -0
  101. package/dist/routes/walletAnalyzerRoutes.js +316 -0
  102. package/dist/routes/walletAnalyzerRoutes.js.map +1 -0
  103. package/dist/routes/x402Routes.d.ts +9 -0
  104. package/dist/routes/x402Routes.d.ts.map +1 -0
  105. package/dist/routes/x402Routes.js +474 -0
  106. package/dist/routes/x402Routes.js.map +1 -0
  107. package/dist/schemas/budgetState.d.ts +250 -0
  108. package/dist/schemas/budgetState.d.ts.map +1 -0
  109. package/dist/schemas/budgetState.js +20 -0
  110. package/dist/schemas/budgetState.js.map +1 -0
  111. package/dist/schemas/endpointScores.d.ts +182 -0
  112. package/dist/schemas/endpointScores.d.ts.map +1 -0
  113. package/dist/schemas/endpointScores.js +17 -0
  114. package/dist/schemas/endpointScores.js.map +1 -0
  115. package/dist/schemas/index.d.ts +4 -0
  116. package/dist/schemas/index.d.ts.map +1 -0
  117. package/dist/schemas/index.js +4 -0
  118. package/dist/schemas/index.js.map +1 -0
  119. package/dist/schemas/paymentHistory.d.ts +284 -0
  120. package/dist/schemas/paymentHistory.d.ts.map +1 -0
  121. package/dist/schemas/paymentHistory.js +24 -0
  122. package/dist/schemas/paymentHistory.js.map +1 -0
  123. package/dist/server/index.d.ts +3 -0
  124. package/dist/server/index.d.ts.map +1 -0
  125. package/dist/server/index.js +3 -0
  126. package/dist/server/index.js.map +1 -0
  127. package/dist/server/x402Gate.d.ts +56 -0
  128. package/dist/server/x402Gate.d.ts.map +1 -0
  129. package/dist/server/x402Gate.js +240 -0
  130. package/dist/server/x402Gate.js.map +1 -0
  131. package/dist/server/x402ServerService.d.ts +30 -0
  132. package/dist/server/x402ServerService.d.ts.map +1 -0
  133. package/dist/server/x402ServerService.js +79 -0
  134. package/dist/server/x402ServerService.js.map +1 -0
  135. package/dist/services/paymentMemoryService.d.ts +73 -0
  136. package/dist/services/paymentMemoryService.d.ts.map +1 -0
  137. package/dist/services/paymentMemoryService.js +247 -0
  138. package/dist/services/paymentMemoryService.js.map +1 -0
  139. package/dist/services/swarmsService.d.ts +66 -0
  140. package/dist/services/swarmsService.d.ts.map +1 -0
  141. package/dist/services/swarmsService.js +102 -0
  142. package/dist/services/swarmsService.js.map +1 -0
  143. package/dist/services/x402WalletService.d.ts +57 -0
  144. package/dist/services/x402WalletService.d.ts.map +1 -0
  145. package/dist/services/x402WalletService.js +258 -0
  146. package/dist/services/x402WalletService.js.map +1 -0
  147. package/dist/templates/index.d.ts +24 -0
  148. package/dist/templates/index.d.ts.map +1 -0
  149. package/dist/templates/index.js +51 -0
  150. package/dist/templates/index.js.map +1 -0
  151. package/dist/templates/swarmTemplates.d.ts +22 -0
  152. package/dist/templates/swarmTemplates.d.ts.map +1 -0
  153. package/dist/templates/swarmTemplates.js +225 -0
  154. package/dist/templates/swarmTemplates.js.map +1 -0
  155. package/dist/types.d.ts +197 -0
  156. package/dist/types.d.ts.map +1 -0
  157. package/dist/types.js +2 -0
  158. package/dist/types.js.map +1 -0
  159. package/dist/utils/cache.d.ts +17 -0
  160. package/dist/utils/cache.d.ts.map +1 -0
  161. package/dist/utils/cache.js +32 -0
  162. package/dist/utils/cache.js.map +1 -0
  163. package/dist/utils/llm.d.ts +16 -0
  164. package/dist/utils/llm.d.ts.map +1 -0
  165. package/dist/utils/llm.js +32 -0
  166. package/dist/utils/llm.js.map +1 -0
  167. package/dist/utils/reportStore.d.ts +45 -0
  168. package/dist/utils/reportStore.d.ts.map +1 -0
  169. package/dist/utils/reportStore.js +164 -0
  170. package/dist/utils/reportStore.js.map +1 -0
  171. package/dist/utils/taskQueue.d.ts +54 -0
  172. package/dist/utils/taskQueue.d.ts.map +1 -0
  173. package/dist/utils/taskQueue.js +124 -0
  174. package/dist/utils/taskQueue.js.map +1 -0
  175. package/package.json +69 -0
@@ -0,0 +1,474 @@
1
+ import { x402Gate, getFreeTierStats } from "../server/x402Gate.js";
2
+ import { researchPipelineTemplate, analysisPanelTemplate, } from "../templates/swarmTemplates.js";
3
+ import { TASK_CATALOG } from "./taskRoutes.js";
4
+ import { TRADING_CATALOG } from "./tradingRoutes.js";
5
+ import { CRYPTO_CATALOG } from "./cryptoRoutes.js";
6
+ import { BATCH_CATALOG } from "./batchRoutes.js";
7
+ import { CODE_AUDIT_CATALOG } from "./codeAuditRoutes.js";
8
+ import { CONTENT_CATALOG } from "./contentRoutes.js";
9
+ import { ADVANCED_CATALOG } from "./advancedRoutes.js";
10
+ import { CRYPTO_ANALYSIS_CATALOG } from "./cryptoAnalysisRoutes.js";
11
+ import { callOpenAI } from "../utils/llm.js";
12
+ import { taskQueue } from "../utils/taskQueue.js";
13
+ // ── Free tier output truncation for multi-agent endpoints ───────────────
14
+ // Free calls get a preview; paid calls get full output.
15
+ const FREE_TIER_TRUNCATE_MSG = "[Connect wallet to see full output]";
16
+ const FREE_TIER_PREVIEW_CHARS = 300;
17
+ /**
18
+ * For multi-agent endpoints (research, analyze, agent): truncate output for free tier.
19
+ * Returns the full text if paid, or a preview + CTA if free.
20
+ */
21
+ function truncateOutputForFreeTier(text, gate, priceUsd) {
22
+ if (gate.amountUsd > 0)
23
+ return text; // paid — full output
24
+ const preview = text.slice(0, FREE_TIER_PREVIEW_CHARS);
25
+ const suffix = text.length > FREE_TIER_PREVIEW_CHARS ? "..." : "";
26
+ return {
27
+ preview: preview + suffix,
28
+ _preview: true,
29
+ _message: `Output truncated. Pay $${priceUsd} to see the full result.`,
30
+ _fullLength: text.length,
31
+ };
32
+ }
33
+ /**
34
+ * Catalog of all x402 endpoints (used by /x402/catalog).
35
+ */
36
+ const SERVICE_CATALOG = [
37
+ {
38
+ name: "SwarmX Research Pipeline",
39
+ description: "Multi-agent research: Researcher, FactChecker, and Writer produce a verified report on any topic",
40
+ path: "/x402/research",
41
+ method: "POST",
42
+ priceUsd: "0.05",
43
+ },
44
+ {
45
+ name: "SwarmX Analysis Panel",
46
+ description: "Multi-perspective analysis: Technical, Economic, and Risk experts synthesize an assessment",
47
+ path: "/x402/analyze",
48
+ method: "POST",
49
+ priceUsd: "0.03",
50
+ },
51
+ {
52
+ name: "SwarmX Single Agent",
53
+ description: "Run a single AI agent with custom task, model, and system prompt",
54
+ path: "/x402/agent",
55
+ method: "POST",
56
+ priceUsd: "0.02",
57
+ },
58
+ {
59
+ name: "SwarmX Solana Wallet Analyzer",
60
+ description: "Analyze any Solana wallet — SOL balance, token holdings with USD values, NFTs, recent transactions",
61
+ path: "/x402/wallet-analyzer",
62
+ method: "POST",
63
+ priceUsd: "0.01",
64
+ },
65
+ {
66
+ name: "SwarmX Token Holders",
67
+ description: "Get top holders for any SPL token — amounts, percentages, concentration analysis",
68
+ path: "/x402/token-holders",
69
+ method: "POST",
70
+ priceUsd: "0.01",
71
+ },
72
+ {
73
+ name: "SwarmX Transaction History",
74
+ description: "Get recent transaction history for any Solana address — signatures, types, timestamps",
75
+ path: "/x402/tx-history",
76
+ method: "POST",
77
+ priceUsd: "0.01",
78
+ },
79
+ {
80
+ name: "SwarmX DeFi Positions",
81
+ description: "Scan a Solana wallet for DeFi positions — Marinade, Jito, Raydium LP tokens and more",
82
+ path: "/x402/defi-positions",
83
+ method: "POST",
84
+ priceUsd: "0.02",
85
+ },
86
+ {
87
+ name: "SwarmX Wallet Report Bundle",
88
+ description: "Full wallet report — SOL balance, token holdings, top-token holder concentration, and DeFi positions in one call",
89
+ path: "/x402/wallet-report",
90
+ method: "POST",
91
+ priceUsd: "0.03",
92
+ },
93
+ ...TASK_CATALOG,
94
+ ...TRADING_CATALOG,
95
+ ...CRYPTO_CATALOG,
96
+ ...CODE_AUDIT_CATALOG,
97
+ ...CONTENT_CATALOG,
98
+ ...BATCH_CATALOG,
99
+ ...ADVANCED_CATALOG,
100
+ ...CRYPTO_ANALYSIS_CATALOG,
101
+ {
102
+ name: "SwarmX Service Catalog",
103
+ description: "List all available SwarmX paid endpoints with pricing",
104
+ path: "/x402/catalog",
105
+ method: "GET",
106
+ priceUsd: "0.00",
107
+ free: true,
108
+ },
109
+ {
110
+ name: "SwarmX Health Check",
111
+ description: "SwarmX service health, revenue stats, and network info",
112
+ path: "/x402/health",
113
+ method: "GET",
114
+ priceUsd: "0.00",
115
+ free: true,
116
+ },
117
+ {
118
+ name: "SwarmX Revenue Dashboard",
119
+ description: "Detailed revenue breakdown — totals, time-period stats, top buyers, conversion rate",
120
+ path: "/x402/revenue",
121
+ method: "GET",
122
+ priceUsd: "0.00",
123
+ free: true,
124
+ },
125
+ {
126
+ name: "SwarmX Async Task Submit",
127
+ description: "Submit a long-running task for async execution, get a task ID to poll for results",
128
+ path: "/x402/async",
129
+ method: "POST",
130
+ priceUsd: "0.00",
131
+ free: true,
132
+ },
133
+ {
134
+ name: "SwarmX Task Status",
135
+ description: "Poll the status and result of an async task by ID",
136
+ path: "/x402/task/:id",
137
+ method: "GET",
138
+ priceUsd: "0.00",
139
+ free: true,
140
+ },
141
+ ];
142
+ /**
143
+ * x402 paid routes for selling agent capabilities.
144
+ *
145
+ * Paid routes use x402Gate to require USDC payment before processing.
146
+ * Free routes (catalog, health) are publicly accessible.
147
+ */
148
+ export const x402Routes = [
149
+ // ── POST /x402/research — $0.05 ──────────────────────────────────
150
+ {
151
+ type: "POST",
152
+ path: "/x402/research",
153
+ handler: async (req, res, runtime) => {
154
+ const gate = await x402Gate(runtime, req, res, {
155
+ amountUsd: "0.05",
156
+ description: "Multi-agent research pipeline",
157
+ });
158
+ if (!gate.paid)
159
+ return;
160
+ const body = req.body ?? {};
161
+ const query = body.query;
162
+ if (!query || typeof query !== "string") {
163
+ res.status(400).json({ error: "Missing required field: query" });
164
+ return;
165
+ }
166
+ const depth = body.depth ?? "standard";
167
+ const swarmsService = runtime.getService("SWARMS");
168
+ if (!swarmsService?.isAvailable()) {
169
+ res.status(503).json({ error: "Swarms service unavailable" });
170
+ return;
171
+ }
172
+ try {
173
+ const result = await swarmsService.runSwarm({
174
+ name: `research-${Date.now()}`,
175
+ description: `Research: ${query}`,
176
+ agents: researchPipelineTemplate.agents,
177
+ swarm_type: researchPipelineTemplate.swarmType,
178
+ task: `Research the following topic (depth: ${depth}): ${query}`,
179
+ max_loops: researchPipelineTemplate.maxLoops ?? 1,
180
+ rules: researchPipelineTemplate.rules,
181
+ });
182
+ const rawResult = String(result.output ?? result);
183
+ const output = truncateOutputForFreeTier(rawResult, gate, "0.05");
184
+ res.json({
185
+ result: output,
186
+ template: "ResearchPipeline",
187
+ freeRemaining: gate.freeRemaining,
188
+ payment: {
189
+ amount: "0.05",
190
+ transaction: gate.transaction,
191
+ network: gate.network,
192
+ },
193
+ });
194
+ }
195
+ catch (err) {
196
+ runtime.logger.error({ error: err instanceof Error ? err.message : String(err) }, "[x402/research] Swarm execution failed");
197
+ res.status(500).json({ error: "Service temporarily unavailable" });
198
+ }
199
+ },
200
+ },
201
+ // ── POST /x402/analyze — $0.03 ───────────────────────────────────
202
+ {
203
+ type: "POST",
204
+ path: "/x402/analyze",
205
+ handler: async (req, res, runtime) => {
206
+ const gate = await x402Gate(runtime, req, res, {
207
+ amountUsd: "0.03",
208
+ description: "Multi-perspective analysis panel",
209
+ });
210
+ if (!gate.paid)
211
+ return;
212
+ const body = req.body ?? {};
213
+ const text = body.text;
214
+ if (!text || typeof text !== "string") {
215
+ res.status(400).json({ error: "Missing required field: text" });
216
+ return;
217
+ }
218
+ const analysisType = body.type ?? "comprehensive";
219
+ const swarmsService = runtime.getService("SWARMS");
220
+ if (!swarmsService?.isAvailable()) {
221
+ res.status(503).json({ error: "Swarms service unavailable" });
222
+ return;
223
+ }
224
+ try {
225
+ const result = await swarmsService.runSwarm({
226
+ name: `analysis-${Date.now()}`,
227
+ description: `Analysis: ${text.slice(0, 100)}`,
228
+ agents: analysisPanelTemplate.agents,
229
+ swarm_type: analysisPanelTemplate.swarmType,
230
+ task: `Perform a ${analysisType} analysis of the following: ${text}`,
231
+ max_loops: analysisPanelTemplate.maxLoops ?? 1,
232
+ });
233
+ const rawResult = String(result.output ?? result);
234
+ const output = truncateOutputForFreeTier(rawResult, gate, "0.03");
235
+ res.json({
236
+ result: output,
237
+ template: "AnalysisPanel",
238
+ freeRemaining: gate.freeRemaining,
239
+ payment: {
240
+ amount: "0.03",
241
+ transaction: gate.transaction,
242
+ network: gate.network,
243
+ },
244
+ });
245
+ }
246
+ catch (err) {
247
+ runtime.logger.error({ error: err instanceof Error ? err.message : String(err) }, "[x402/analyze] Swarm execution failed");
248
+ res.status(500).json({ error: "Service temporarily unavailable" });
249
+ }
250
+ },
251
+ },
252
+ // ── POST /x402/agent — $0.02 ─────────────────────────────────────
253
+ {
254
+ type: "POST",
255
+ path: "/x402/agent",
256
+ handler: async (req, res, runtime) => {
257
+ const gate = await x402Gate(runtime, req, res, {
258
+ amountUsd: "0.02",
259
+ description: "Single agent execution",
260
+ });
261
+ if (!gate.paid)
262
+ return;
263
+ const body = req.body ?? {};
264
+ const task = body.task;
265
+ if (!task || typeof task !== "string") {
266
+ res.status(400).json({ error: "Missing required field: task" });
267
+ return;
268
+ }
269
+ const systemPrompt = typeof body.systemPrompt === "string"
270
+ ? body.systemPrompt
271
+ : "You are a helpful AI agent. Complete the given task thoroughly and concisely.";
272
+ const model = typeof body.model === "string" ? body.model : "gpt-4o-mini";
273
+ try {
274
+ let output;
275
+ const openaiKey = String(runtime.getSetting("OPENAI_API_KEY") ?? "");
276
+ if (openaiKey) {
277
+ // Direct OpenAI — single agent, no Swarms overhead
278
+ output = await callOpenAI({
279
+ apiKey: openaiKey,
280
+ model,
281
+ systemPrompt,
282
+ userPrompt: task,
283
+ maxTokens: 4096,
284
+ temperature: 0.5,
285
+ });
286
+ }
287
+ else {
288
+ // Fallback: Swarms API
289
+ const swarmsService = runtime.getService("SWARMS");
290
+ if (!swarmsService?.isAvailable()) {
291
+ res.status(503).json({ error: "Neither OPENAI_API_KEY nor Swarms service available" });
292
+ return;
293
+ }
294
+ const result = await swarmsService.runAgent({
295
+ agent_name: body.agentName ?? "x402-agent",
296
+ model_name: model,
297
+ system_prompt: systemPrompt,
298
+ max_loops: 1,
299
+ max_tokens: 4096,
300
+ temperature: 0.5,
301
+ role: "worker",
302
+ }, task);
303
+ output = String(result.outputs ?? result);
304
+ }
305
+ const truncated = truncateOutputForFreeTier(output, gate, "0.02");
306
+ res.json({
307
+ result: truncated,
308
+ freeRemaining: gate.freeRemaining,
309
+ payment: {
310
+ amount: "0.02",
311
+ transaction: gate.transaction,
312
+ network: gate.network,
313
+ },
314
+ });
315
+ }
316
+ catch (err) {
317
+ runtime.logger.error({ error: err instanceof Error ? err.message : String(err) }, "[x402/agent] Agent execution failed");
318
+ res.status(500).json({ error: "Service temporarily unavailable" });
319
+ }
320
+ },
321
+ },
322
+ // ── GET /x402/catalog — FREE ─────────────────────────────────────
323
+ {
324
+ type: "GET",
325
+ path: "/x402/catalog",
326
+ name: "x402-catalog",
327
+ public: true,
328
+ handler: async (_req, res, _runtime) => {
329
+ res.json(SERVICE_CATALOG);
330
+ },
331
+ },
332
+ // ── GET /x402/health — FREE ──────────────────────────────────────
333
+ {
334
+ type: "GET",
335
+ path: "/x402/health",
336
+ name: "x402-health",
337
+ public: true,
338
+ handler: async (_req, res, runtime) => {
339
+ const serverService = runtime.getService("X402_SERVER");
340
+ const freeTier = typeof getFreeTierStats === "function" ? getFreeTierStats() : null;
341
+ res.json({
342
+ status: "ok",
343
+ receiveAddress: serverService?.getReceiveAddress() ?? "",
344
+ network: serverService?.getNetwork() ?? "",
345
+ totalRevenue: serverService?.getTotalRevenueUsd() ?? 0,
346
+ settlements: serverService?.getSettlementCount() ?? 0,
347
+ freeTierCallsToday: freeTier?.totalFreeCallsToday ?? 0,
348
+ freeTierUniqueIPs: freeTier?.uniqueIPs ?? 0,
349
+ });
350
+ },
351
+ },
352
+ // ── GET /x402/revenue — FREE (revenue dashboard) ────────────────
353
+ {
354
+ type: "GET",
355
+ path: "/x402/revenue",
356
+ name: "x402-revenue",
357
+ public: true,
358
+ handler: async (_req, res, runtime) => {
359
+ const serverService = runtime.getService("X402_SERVER");
360
+ const revenueHistory = serverService?.getRevenueHistory() ?? [];
361
+ const totalRevenue = serverService?.getTotalRevenueUsd() ?? 0;
362
+ const settlements = serverService?.getSettlementCount() ?? 0;
363
+ const freeTier = typeof getFreeTierStats === "function" ? getFreeTierStats() : null;
364
+ // ── Time-period breakdowns ──────────────────────────────────
365
+ const now = Date.now();
366
+ const ms24h = 86_400_000;
367
+ const ms7d = 604_800_000;
368
+ const ms30d = 2_592_000_000;
369
+ function periodStats(cutoffMs) {
370
+ const cutoff = now - cutoffMs;
371
+ const inRange = revenueHistory.filter((r) => r.timestamp >= cutoff);
372
+ return {
373
+ revenue: parseFloat(inRange.reduce((sum, r) => sum + r.amountUsd, 0).toFixed(6)),
374
+ settlements: inRange.length,
375
+ };
376
+ }
377
+ // ── Revenue by endpoint ─────────────────────────────────────
378
+ const byEndpoint = new Map();
379
+ for (const r of revenueHistory) {
380
+ const entry = byEndpoint.get(r.endpoint) ?? { revenue: 0, calls: 0 };
381
+ entry.revenue += r.amountUsd;
382
+ entry.calls += 1;
383
+ byEndpoint.set(r.endpoint, entry);
384
+ }
385
+ const revenueByEndpoint = Object.fromEntries([...byEndpoint.entries()].map(([ep, stats]) => [
386
+ ep,
387
+ {
388
+ revenue: parseFloat(stats.revenue.toFixed(6)),
389
+ calls: stats.calls,
390
+ },
391
+ ]));
392
+ // ── Top buyers ──────────────────────────────────────────────
393
+ const byPayer = new Map();
394
+ for (const r of revenueHistory) {
395
+ if (r.payer) {
396
+ byPayer.set(r.payer, (byPayer.get(r.payer) ?? 0) + r.amountUsd);
397
+ }
398
+ }
399
+ const topBuyers = [...byPayer.entries()]
400
+ .sort((a, b) => b[1] - a[1])
401
+ .slice(0, 10)
402
+ .map(([payer, spent]) => ({
403
+ payer,
404
+ spent: parseFloat(spent.toFixed(6)),
405
+ }));
406
+ // ── Conversion rate ─────────────────────────────────────────
407
+ const totalFreeCallsToday = freeTier?.totalFreeCallsToday ?? 0;
408
+ const paidCalls = settlements;
409
+ const totalCalls = paidCalls + totalFreeCallsToday;
410
+ const conversionRate = totalCalls > 0
411
+ ? parseFloat((paidCalls / totalCalls).toFixed(4))
412
+ : 0;
413
+ res.json({
414
+ totalRevenue: parseFloat(totalRevenue.toFixed(6)),
415
+ settlements,
416
+ revenueByEndpoint,
417
+ last24h: periodStats(ms24h),
418
+ last7d: periodStats(ms7d),
419
+ last30d: periodStats(ms30d),
420
+ freeTier: freeTier ?? { totalFreeCallsToday: 0, uniqueIPs: 0, topIPs: [] },
421
+ conversionRate,
422
+ topBuyers,
423
+ averageTransactionUsd: settlements > 0
424
+ ? parseFloat((totalRevenue / settlements).toFixed(6))
425
+ : 0,
426
+ });
427
+ },
428
+ },
429
+ // ── POST /x402/async — Submit async task ─────────────────────────
430
+ {
431
+ type: "POST",
432
+ path: "/x402/async",
433
+ name: "x402-async-submit",
434
+ public: true,
435
+ handler: async (req, res, _runtime) => {
436
+ const body = req.body ?? {};
437
+ const endpoint = body.endpoint;
438
+ if (!endpoint || typeof endpoint !== "string") {
439
+ res.status(400).json({ error: "Missing required field: endpoint" });
440
+ return;
441
+ }
442
+ const params = typeof body.params === "object" && body.params !== null
443
+ ? body.params
444
+ : {};
445
+ const webhookUrl = typeof body.webhookUrl === "string" ? body.webhookUrl : undefined;
446
+ const taskId = taskQueue.submit(endpoint, params, webhookUrl);
447
+ res.json({
448
+ taskId,
449
+ statusUrl: `/x402/task/${taskId}`,
450
+ });
451
+ },
452
+ },
453
+ // ── GET /x402/task/:id — Poll task status ────────────────────────
454
+ {
455
+ type: "GET",
456
+ path: "/x402/task/:id",
457
+ name: "x402-task-status",
458
+ public: true,
459
+ handler: async (req, res, _runtime) => {
460
+ const taskId = req.params?.id;
461
+ if (!taskId || typeof taskId !== "string") {
462
+ res.status(400).json({ error: "Missing task ID" });
463
+ return;
464
+ }
465
+ const status = taskQueue.getStatus(taskId);
466
+ if (!status) {
467
+ res.status(404).json({ error: "Task not found" });
468
+ return;
469
+ }
470
+ res.json(status);
471
+ },
472
+ },
473
+ ];
474
+ //# sourceMappingURL=x402Routes.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"x402Routes.js","sourceRoot":"","sources":["../../src/routes/x402Routes.ts"],"names":[],"mappings":"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"}