@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,30 @@
1
+ import { Service, type IAgentRuntime } from "@elizaos/core";
2
+ import { type X402Server } from "@dexterai/x402/server";
3
+ import type { X402RevenueRecord } from "../types.js";
4
+ /**
5
+ * Server-side x402 service for SELLING agent capabilities.
6
+ * Manages payment verification and settlement for incoming requests.
7
+ */
8
+ export declare class X402ServerService extends Service {
9
+ static serviceType: string;
10
+ capabilityDescription: string;
11
+ private x402Server;
12
+ private revenueHistory;
13
+ private receiveAddress;
14
+ private network;
15
+ static start(runtime: IAgentRuntime): Promise<X402ServerService>;
16
+ stop(): Promise<void>;
17
+ initialize(runtime: IAgentRuntime): Promise<void>;
18
+ isAvailable(): boolean;
19
+ getServer(): X402Server;
20
+ getReceiveAddress(): string;
21
+ getNetwork(): string;
22
+ /**
23
+ * Record a successful incoming payment.
24
+ */
25
+ recordRevenue(record: X402RevenueRecord): void;
26
+ getRevenueHistory(): X402RevenueRecord[];
27
+ getTotalRevenueUsd(): number;
28
+ getSettlementCount(): number;
29
+ }
30
+ //# sourceMappingURL=x402ServerService.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"x402ServerService.d.ts","sourceRoot":"","sources":["../../src/server/x402ServerService.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,KAAK,aAAa,EAAE,MAAM,eAAe,CAAC;AAC5D,OAAO,EAAoB,KAAK,UAAU,EAAE,MAAM,uBAAuB,CAAC;AAC1E,OAAO,KAAK,EAAE,iBAAiB,EAAuB,MAAM,aAAa,CAAC;AAE1E;;;GAGG;AACH,qBAAa,iBAAkB,SAAQ,OAAO;IAC5C,MAAM,CAAC,WAAW,SAAiB;IACnC,qBAAqB,SACsE;IAE3F,OAAO,CAAC,UAAU,CAA2B;IAC7C,OAAO,CAAC,cAAc,CAA2B;IACjD,OAAO,CAAC,cAAc,CAAc;IACpC,OAAO,CAAC,OAAO,CAAc;WAEhB,KAAK,CAAC,OAAO,EAAE,aAAa,GAAG,OAAO,CAAC,iBAAiB,CAAC;IAMhE,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAIrB,UAAU,CAAC,OAAO,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC;IAqCvD,WAAW,IAAI,OAAO;IAItB,SAAS,IAAI,UAAU;IAOvB,iBAAiB,IAAI,MAAM;IAI3B,UAAU,IAAI,MAAM;IAIpB;;OAEG;IACH,aAAa,CAAC,MAAM,EAAE,iBAAiB,GAAG,IAAI;IAI9C,iBAAiB,IAAI,iBAAiB,EAAE;IAIxC,kBAAkB,IAAI,MAAM;IAI5B,kBAAkB,IAAI,MAAM;CAG7B"}
@@ -0,0 +1,79 @@
1
+ import { Service } from "@elizaos/core";
2
+ import { createX402Server } from "@dexterai/x402/server";
3
+ /**
4
+ * Server-side x402 service for SELLING agent capabilities.
5
+ * Manages payment verification and settlement for incoming requests.
6
+ */
7
+ export class X402ServerService extends Service {
8
+ static serviceType = "X402_SERVER";
9
+ capabilityDescription = "Accepts x402 payments for agent services — verifies and settles incoming USDC payments";
10
+ x402Server = null;
11
+ revenueHistory = [];
12
+ receiveAddress = "";
13
+ network = "";
14
+ static async start(runtime) {
15
+ const instance = new X402ServerService(runtime);
16
+ await instance.initialize(runtime);
17
+ return instance;
18
+ }
19
+ async stop() {
20
+ this.x402Server = null;
21
+ }
22
+ async initialize(runtime) {
23
+ const receiveAddr = runtime.getSetting("X402_RECEIVE_ADDRESS");
24
+ if (!receiveAddr) {
25
+ runtime.logger.info("[X402ServerService] X402_RECEIVE_ADDRESS not set. Sell-side features disabled.");
26
+ return;
27
+ }
28
+ this.receiveAddress = String(receiveAddr);
29
+ const networkRaw = runtime.getSetting("X402_NETWORK_ID");
30
+ const facilitatorRaw = runtime.getSetting("X402_FACILITATOR_URL");
31
+ // Map friendly network ID to CAIP-2
32
+ const networkMap = {
33
+ "base-mainnet": "eip155:8453",
34
+ "base-sepolia": "eip155:84532",
35
+ "ethereum-mainnet": "eip155:1",
36
+ "solana-mainnet": "solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp",
37
+ "polygon-mainnet": "eip155:137",
38
+ "arbitrum-mainnet": "eip155:42161",
39
+ };
40
+ this.network = networkMap[String(networkRaw ?? "base-mainnet")] ?? "eip155:8453";
41
+ this.x402Server = createX402Server({
42
+ payTo: this.receiveAddress,
43
+ network: this.network,
44
+ facilitatorUrl: facilitatorRaw ? String(facilitatorRaw) : undefined,
45
+ });
46
+ runtime.logger.info({ receiveAddress: this.receiveAddress, network: this.network }, "[X402ServerService] Initialized — accepting x402 payments");
47
+ }
48
+ isAvailable() {
49
+ return this.x402Server !== null;
50
+ }
51
+ getServer() {
52
+ if (!this.x402Server) {
53
+ throw new Error("X402 server not initialized — set X402_RECEIVE_ADDRESS");
54
+ }
55
+ return this.x402Server;
56
+ }
57
+ getReceiveAddress() {
58
+ return this.receiveAddress;
59
+ }
60
+ getNetwork() {
61
+ return this.network;
62
+ }
63
+ /**
64
+ * Record a successful incoming payment.
65
+ */
66
+ recordRevenue(record) {
67
+ this.revenueHistory.push(record);
68
+ }
69
+ getRevenueHistory() {
70
+ return [...this.revenueHistory];
71
+ }
72
+ getTotalRevenueUsd() {
73
+ return this.revenueHistory.reduce((sum, r) => sum + r.amountUsd, 0);
74
+ }
75
+ getSettlementCount() {
76
+ return this.revenueHistory.length;
77
+ }
78
+ }
79
+ //# sourceMappingURL=x402ServerService.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"x402ServerService.js","sourceRoot":"","sources":["../../src/server/x402ServerService.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,73 @@
1
+ import { Service, type IAgentRuntime } from "@elizaos/core";
2
+ import type { PaymentHistoryRecord } from "../types.js";
3
+ /**
4
+ * Unscored payment awaiting quality evaluation.
5
+ */
6
+ export interface UnscoredPayment {
7
+ recordId: string;
8
+ endpoint: string;
9
+ domain: string;
10
+ responseStatus: number;
11
+ responseTimeMs: number;
12
+ responsePreview: string;
13
+ }
14
+ /**
15
+ * Spending stats for a time period.
16
+ */
17
+ export interface SpendingStats {
18
+ totalSpent: number;
19
+ totalCalls: number;
20
+ period: string;
21
+ }
22
+ /**
23
+ * Records payment history, maintains an unscored buffer for the evaluator,
24
+ * and provides spending analytics. Gracefully degrades to in-memory only
25
+ * when no database is available.
26
+ */
27
+ export declare class PaymentMemoryService extends Service {
28
+ static serviceType: string;
29
+ capabilityDescription: string;
30
+ private agentRuntime;
31
+ private history;
32
+ private unscoredBuffer;
33
+ private hasDb;
34
+ static start(runtime: IAgentRuntime): Promise<PaymentMemoryService>;
35
+ stop(): Promise<void>;
36
+ initialize(runtime: IAgentRuntime): Promise<void>;
37
+ /**
38
+ * Record a completed payment.
39
+ * Flow: sanitize → store in memory → add to unscored buffer → persist to DB (fire-and-forget)
40
+ */
41
+ recordPayment(record: PaymentHistoryRecord): Promise<void>;
42
+ /**
43
+ * Get unscored payments for the evaluator to process.
44
+ */
45
+ getUnscoredPayments(limit?: number): UnscoredPayment[];
46
+ /**
47
+ * Mark a payment as scored (update quality in memory and DB).
48
+ */
49
+ scorePayment(recordId: string, qualityScore: number, qualityReason: string): Promise<void>;
50
+ /**
51
+ * Upsert endpoint aggregate scores.
52
+ */
53
+ updateEndpointScore(agentId: string, domain: string, amountUsd: number, responseTimeMs: number, qualityScore: number, isError: boolean): Promise<void>;
54
+ /**
55
+ * Get spending stats for a time period.
56
+ */
57
+ getSpendingStats(period: "24h" | "7d" | "30d"): SpendingStats;
58
+ /**
59
+ * Get payments by domain for quality lookup.
60
+ */
61
+ getPaymentsByDomain(domain: string): PaymentHistoryRecord[];
62
+ /**
63
+ * Get all endpoint scores from memory (for provider context).
64
+ */
65
+ getEndpointScoreSummary(): Array<{
66
+ domain: string;
67
+ avgQuality: number;
68
+ avgCostPerCall: number;
69
+ totalCalls: number;
70
+ }>;
71
+ getHistory(): PaymentHistoryRecord[];
72
+ }
73
+ //# sourceMappingURL=paymentMemoryService.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"paymentMemoryService.d.ts","sourceRoot":"","sources":["../../src/services/paymentMemoryService.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,KAAK,aAAa,EAAE,MAAM,eAAe,CAAC;AAC5D,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,aAAa,CAAC;AAExD;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,cAAc,EAAE,MAAM,CAAC;IACvB,cAAc,EAAE,MAAM,CAAC;IACvB,eAAe,EAAE,MAAM,CAAC;CACzB;AAED;;GAEG;AACH,MAAM,WAAW,aAAa;IAC5B,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE,MAAM,CAAC;CAChB;AAED;;;;GAIG;AACH,qBAAa,oBAAqB,SAAQ,OAAO;IAC/C,MAAM,CAAC,WAAW,SAAoB;IACtC,qBAAqB,SACuE;IAE5F,OAAO,CAAC,YAAY,CAA8B;IAClD,OAAO,CAAC,OAAO,CAA8B;IAC7C,OAAO,CAAC,cAAc,CAAyB;IAC/C,OAAO,CAAC,KAAK,CAAS;WAET,KAAK,CAAC,OAAO,EAAE,aAAa,GAAG,OAAO,CAAC,oBAAoB,CAAC;IAMnE,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAIrB,UAAU,CAAC,OAAO,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC;IAiBvD;;;OAGG;IACG,aAAa,CAAC,MAAM,EAAE,oBAAoB,GAAG,OAAO,CAAC,IAAI,CAAC;IAiEhE;;OAEG;IACH,mBAAmB,CAAC,KAAK,SAAI,GAAG,eAAe,EAAE;IAIjD;;OAEG;IACG,YAAY,CAChB,QAAQ,EAAE,MAAM,EAChB,YAAY,EAAE,MAAM,EACpB,aAAa,EAAE,MAAM,GACpB,OAAO,CAAC,IAAI,CAAC;IA0BhB;;OAEG;IACG,mBAAmB,CACvB,OAAO,EAAE,MAAM,EACf,MAAM,EAAE,MAAM,EACd,SAAS,EAAE,MAAM,EACjB,cAAc,EAAE,MAAM,EACtB,YAAY,EAAE,MAAM,EACpB,OAAO,EAAE,OAAO,GACf,OAAO,CAAC,IAAI,CAAC;IA6DhB;;OAEG;IACH,gBAAgB,CAAC,MAAM,EAAE,KAAK,GAAG,IAAI,GAAG,KAAK,GAAG,aAAa;IAa7D;;OAEG;IACH,mBAAmB,CAAC,MAAM,EAAE,MAAM,GAAG,oBAAoB,EAAE;IAI3D;;OAEG;IACH,uBAAuB,IAAI,KAAK,CAAC;QAC/B,MAAM,EAAE,MAAM,CAAC;QACf,UAAU,EAAE,MAAM,CAAC;QACnB,cAAc,EAAE,MAAM,CAAC;QACvB,UAAU,EAAE,MAAM,CAAC;KACpB,CAAC;IAuCF,UAAU,IAAI,oBAAoB,EAAE;CAGrC"}
@@ -0,0 +1,247 @@
1
+ import { Service } from "@elizaos/core";
2
+ /**
3
+ * Records payment history, maintains an unscored buffer for the evaluator,
4
+ * and provides spending analytics. Gracefully degrades to in-memory only
5
+ * when no database is available.
6
+ */
7
+ export class PaymentMemoryService extends Service {
8
+ static serviceType = "PAYMENT_MEMORY";
9
+ capabilityDescription = "Persists payment history across sessions, enables quality scoring and cost optimization";
10
+ agentRuntime = null;
11
+ history = [];
12
+ unscoredBuffer = [];
13
+ hasDb = false;
14
+ static async start(runtime) {
15
+ const instance = new PaymentMemoryService(runtime);
16
+ await instance.initialize(runtime);
17
+ return instance;
18
+ }
19
+ async stop() {
20
+ this.agentRuntime = null;
21
+ }
22
+ async initialize(runtime) {
23
+ this.agentRuntime = runtime;
24
+ // Check if DB is available
25
+ try {
26
+ const db = runtime.databaseAdapter?.db;
27
+ this.hasDb = !!db;
28
+ }
29
+ catch {
30
+ this.hasDb = false;
31
+ }
32
+ runtime.logger.info({ hasDb: this.hasDb }, "[PaymentMemoryService] Initialized");
33
+ }
34
+ /**
35
+ * Record a completed payment.
36
+ * Flow: sanitize → store in memory → add to unscored buffer → persist to DB (fire-and-forget)
37
+ */
38
+ async recordPayment(record) {
39
+ // Step 1: Sanitize on a shallow copy so we never mutate the caller's object
40
+ const sanitized = { ...record };
41
+ if (!Number.isFinite(sanitized.amountUsd)) {
42
+ sanitized.amountUsd = 0;
43
+ }
44
+ if (sanitized.endpoint && sanitized.endpoint.length > 2048) {
45
+ sanitized.endpoint = sanitized.endpoint.slice(0, 2048);
46
+ }
47
+ if (sanitized.responsePreview && sanitized.responsePreview.length > 2048) {
48
+ sanitized.responsePreview = sanitized.responsePreview.slice(0, 2048);
49
+ }
50
+ // Always store in memory (the sanitized copy)
51
+ this.history.push(sanitized);
52
+ // Prune old records to prevent unbounded memory growth
53
+ if (this.history.length > 10000) {
54
+ this.history = this.history.slice(-10000);
55
+ }
56
+ // Add to unscored buffer if we have response data
57
+ if (sanitized.responsePreview) {
58
+ this.unscoredBuffer.push({
59
+ recordId: sanitized.id,
60
+ endpoint: sanitized.endpoint,
61
+ domain: sanitized.domain,
62
+ responseStatus: sanitized.responseStatus ?? 200,
63
+ responseTimeMs: sanitized.responseTimeMs ?? 0,
64
+ responsePreview: sanitized.responsePreview,
65
+ });
66
+ }
67
+ // Try to persist to DB
68
+ if (this.hasDb && this.agentRuntime) {
69
+ try {
70
+ const db = this.agentRuntime.databaseAdapter?.db;
71
+ if (db) {
72
+ const { x402PaymentHistory } = await import("../schemas/paymentHistory.js");
73
+ await db.insert(x402PaymentHistory).values({
74
+ id: sanitized.id,
75
+ agentId: sanitized.agentId,
76
+ endpoint: sanitized.endpoint,
77
+ domain: sanitized.domain,
78
+ method: sanitized.method,
79
+ amountUsd: sanitized.amountUsd,
80
+ txHash: sanitized.txHash,
81
+ network: sanitized.network ?? null,
82
+ payer: sanitized.payer ?? null,
83
+ status: sanitized.status,
84
+ responseStatus: sanitized.responseStatus ?? null,
85
+ responseTimeMs: sanitized.responseTimeMs ?? null,
86
+ responsePreview: sanitized.responsePreview ?? null,
87
+ });
88
+ }
89
+ }
90
+ catch (err) {
91
+ // DB write failed — data is still in memory
92
+ this.agentRuntime?.logger.debug({ error: err instanceof Error ? err.message : String(err) }, "[PaymentMemoryService] DB write failed, using in-memory only");
93
+ }
94
+ }
95
+ }
96
+ /**
97
+ * Get unscored payments for the evaluator to process.
98
+ */
99
+ getUnscoredPayments(limit = 3) {
100
+ return this.unscoredBuffer.splice(0, limit);
101
+ }
102
+ /**
103
+ * Mark a payment as scored (update quality in memory and DB).
104
+ */
105
+ async scorePayment(recordId, qualityScore, qualityReason) {
106
+ // Update in-memory record
107
+ const record = this.history.find((r) => r.id === recordId);
108
+ if (record) {
109
+ record.qualityScore = qualityScore;
110
+ record.qualityReason = qualityReason;
111
+ }
112
+ // Try to update DB
113
+ if (this.hasDb && this.agentRuntime) {
114
+ try {
115
+ const db = this.agentRuntime.databaseAdapter?.db;
116
+ if (db) {
117
+ const { x402PaymentHistory } = await import("../schemas/paymentHistory.js");
118
+ const { eq } = await import("drizzle-orm");
119
+ await db
120
+ .update(x402PaymentHistory)
121
+ .set({ qualityScore, qualityReason })
122
+ .where(eq(x402PaymentHistory.id, recordId));
123
+ }
124
+ }
125
+ catch {
126
+ // DB update failed — in-memory is updated
127
+ }
128
+ }
129
+ }
130
+ /**
131
+ * Upsert endpoint aggregate scores.
132
+ */
133
+ async updateEndpointScore(agentId, domain, amountUsd, responseTimeMs, qualityScore, isError) {
134
+ if (!this.hasDb || !this.agentRuntime)
135
+ return;
136
+ try {
137
+ const db = this.agentRuntime.databaseAdapter?.db;
138
+ if (!db)
139
+ return;
140
+ const { x402EndpointScores } = await import("../schemas/endpointScores.js");
141
+ const { eq, and, sql } = await import("drizzle-orm");
142
+ // Try to find existing record
143
+ const existing = await db
144
+ .select()
145
+ .from(x402EndpointScores)
146
+ .where(and(eq(x402EndpointScores.agentId, agentId), eq(x402EndpointScores.domain, domain)))
147
+ .limit(1);
148
+ if (existing.length > 0) {
149
+ const row = existing[0];
150
+ const newCount = (row.totalCalls ?? 0) + 1;
151
+ const oldAvg = row.avgQualityScore ?? qualityScore;
152
+ const newAvg = ((oldAvg * (row.totalCalls ?? 0)) + qualityScore) / newCount;
153
+ const oldTimeAvg = row.avgResponseTimeMs ?? responseTimeMs;
154
+ const newTimeAvg = ((oldTimeAvg * (row.totalCalls ?? 0)) + responseTimeMs) / newCount;
155
+ await db
156
+ .update(x402EndpointScores)
157
+ .set({
158
+ totalCalls: newCount,
159
+ totalSpentUsd: (row.totalSpentUsd ?? 0) + amountUsd,
160
+ avgQualityScore: newAvg,
161
+ avgResponseTimeMs: newTimeAvg,
162
+ errorCount: (row.errorCount ?? 0) + (isError ? 1 : 0),
163
+ lastCallAt: new Date(),
164
+ updatedAt: new Date(),
165
+ })
166
+ .where(eq(x402EndpointScores.id, row.id));
167
+ }
168
+ else {
169
+ await db.insert(x402EndpointScores).values({
170
+ id: crypto.randomUUID(),
171
+ agentId,
172
+ domain,
173
+ totalCalls: 1,
174
+ totalSpentUsd: amountUsd,
175
+ avgQualityScore: qualityScore,
176
+ avgResponseTimeMs: responseTimeMs,
177
+ errorCount: isError ? 1 : 0,
178
+ lastCallAt: new Date(),
179
+ updatedAt: new Date(),
180
+ });
181
+ }
182
+ }
183
+ catch {
184
+ // Aggregation failed — not critical
185
+ }
186
+ }
187
+ /**
188
+ * Get spending stats for a time period.
189
+ */
190
+ getSpendingStats(period) {
191
+ const now = Date.now();
192
+ const msMap = { "24h": 86400000, "7d": 604800000, "30d": 2592000000 };
193
+ const cutoff = now - msMap[period];
194
+ const inRange = this.history.filter((r) => r.createdAt >= cutoff);
195
+ return {
196
+ totalSpent: inRange.reduce((sum, r) => sum + r.amountUsd, 0),
197
+ totalCalls: inRange.length,
198
+ period,
199
+ };
200
+ }
201
+ /**
202
+ * Get payments by domain for quality lookup.
203
+ */
204
+ getPaymentsByDomain(domain) {
205
+ return this.history.filter((r) => r.domain === domain);
206
+ }
207
+ /**
208
+ * Get all endpoint scores from memory (for provider context).
209
+ */
210
+ getEndpointScoreSummary() {
211
+ const byDomain = new Map();
212
+ for (const record of this.history) {
213
+ const existing = byDomain.get(record.domain) ?? {
214
+ totalQuality: 0,
215
+ totalCost: 0,
216
+ count: 0,
217
+ scoredCount: 0,
218
+ };
219
+ existing.totalCost += record.amountUsd;
220
+ existing.count += 1;
221
+ if (record.qualityScore != null) {
222
+ existing.totalQuality += record.qualityScore;
223
+ existing.scoredCount += 1;
224
+ }
225
+ byDomain.set(record.domain, existing);
226
+ }
227
+ return Array.from(byDomain.entries())
228
+ .map(([domain, stats]) => ({
229
+ domain,
230
+ avgQuality: stats.scoredCount > 0
231
+ ? stats.totalQuality / stats.scoredCount
232
+ : 0,
233
+ avgCostPerCall: stats.totalCost / stats.count,
234
+ totalCalls: stats.count,
235
+ }))
236
+ .sort((a, b) => {
237
+ // Sort by quality/cost ratio (best value first)
238
+ const aRatio = a.avgQuality / Math.max(a.avgCostPerCall, 0.001);
239
+ const bRatio = b.avgQuality / Math.max(b.avgCostPerCall, 0.001);
240
+ return bRatio - aRatio;
241
+ });
242
+ }
243
+ getHistory() {
244
+ return [...this.history];
245
+ }
246
+ }
247
+ //# sourceMappingURL=paymentMemoryService.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"paymentMemoryService.js","sourceRoot":"","sources":["../../src/services/paymentMemoryService.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,66 @@
1
+ import { Service, type IAgentRuntime } from "@elizaos/core";
2
+ import type { AgentSpec, SwarmRunParams } from "swarms-ts/resources";
3
+ export type SwarmType = NonNullable<SwarmRunParams["swarm_type"]>;
4
+ /**
5
+ * Response from /v1/agent/completions
6
+ */
7
+ export interface AgentRunResponse {
8
+ job_id?: string;
9
+ success?: boolean;
10
+ name?: string;
11
+ outputs?: Array<{
12
+ role?: string;
13
+ content?: string;
14
+ }>;
15
+ output?: string;
16
+ usage?: {
17
+ total_tokens?: number;
18
+ total_cost?: number;
19
+ };
20
+ [key: string]: unknown;
21
+ }
22
+ /**
23
+ * Response from /v1/swarm/completions
24
+ */
25
+ export interface SwarmRunResponse {
26
+ job_id?: string;
27
+ status?: string;
28
+ swarm_name?: string;
29
+ swarm_type?: string;
30
+ output?: unknown;
31
+ number_of_agents?: number;
32
+ execution_time?: number;
33
+ usage?: {
34
+ total_cost?: number;
35
+ };
36
+ [key: string]: unknown;
37
+ }
38
+ /**
39
+ * Wraps the Swarms API for multi-agent orchestration.
40
+ * Uses direct fetch to api.swarms.world/v1/* endpoints.
41
+ */
42
+ export declare class SwarmsService extends Service {
43
+ static serviceType: string;
44
+ capabilityDescription: string;
45
+ private apiKey;
46
+ static start(runtime: IAgentRuntime): Promise<SwarmsService>;
47
+ stop(): Promise<void>;
48
+ initialize(runtime: IAgentRuntime): Promise<void>;
49
+ isAvailable(): boolean;
50
+ private apiCall;
51
+ /**
52
+ * Run a single agent with the Swarms API.
53
+ * Endpoint: POST /v1/agent/completions
54
+ */
55
+ runAgent(config: AgentSpec, task: string): Promise<AgentRunResponse>;
56
+ /**
57
+ * Run a multi-agent swarm.
58
+ * Endpoint: POST /v1/swarm/completions
59
+ */
60
+ runSwarm(params: SwarmRunParams): Promise<SwarmRunResponse>;
61
+ /**
62
+ * List available swarm types from the API.
63
+ */
64
+ getAvailableSwarmTypes(): Promise<string[]>;
65
+ }
66
+ //# sourceMappingURL=swarmsService.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"swarmsService.d.ts","sourceRoot":"","sources":["../../src/services/swarmsService.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,KAAK,aAAa,EAAE,MAAM,eAAe,CAAC;AAC5D,OAAO,KAAK,EACV,SAAS,EACT,cAAc,EACf,MAAM,qBAAqB,CAAC;AAE7B,MAAM,MAAM,SAAS,GAAG,WAAW,CAAC,cAAc,CAAC,YAAY,CAAC,CAAC,CAAC;AAKlE;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,KAAK,CAAC;QAAE,IAAI,CAAC,EAAE,MAAM,CAAC;QAAC,OAAO,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IACrD,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE;QAAE,YAAY,CAAC,EAAE,MAAM,CAAC;QAAC,UAAU,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IACvD,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACxB;AAED;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,KAAK,CAAC,EAAE;QAAE,UAAU,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IAChC,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACxB;AAED;;;GAGG;AACH,qBAAa,aAAc,SAAQ,OAAO;IACxC,MAAM,CAAC,WAAW,SAAY;IAC9B,qBAAqB,SAC+G;IAEpI,OAAO,CAAC,MAAM,CAAuB;WAExB,KAAK,CAAC,OAAO,EAAE,aAAa,GAAG,OAAO,CAAC,aAAa,CAAC;IAM5D,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAIrB,UAAU,CAAC,OAAO,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC;IAcvD,WAAW,IAAI,OAAO;YAIR,OAAO;IAuBrB;;;OAGG;IACG,QAAQ,CACZ,MAAM,EAAE,SAAS,EACjB,IAAI,EAAE,MAAM,GACX,OAAO,CAAC,gBAAgB,CAAC;IAa5B;;;OAGG;IACG,QAAQ,CAAC,MAAM,EAAE,cAAc,GAAG,OAAO,CAAC,gBAAgB,CAAC;IAWjE;;OAEG;IACG,sBAAsB,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;CAclD"}
@@ -0,0 +1,102 @@
1
+ import { Service } from "@elizaos/core";
2
+ // The swarms-ts SDK has outdated endpoints. We call the API directly.
3
+ const SWARMS_API_BASE = "https://api.swarms.world";
4
+ /**
5
+ * Wraps the Swarms API for multi-agent orchestration.
6
+ * Uses direct fetch to api.swarms.world/v1/* endpoints.
7
+ */
8
+ export class SwarmsService extends Service {
9
+ static serviceType = "SWARMS";
10
+ capabilityDescription = "Multi-agent orchestration via Swarms API — sequential, concurrent, hierarchical, mixture-of-agents, and 15+ swarm architectures";
11
+ apiKey = null;
12
+ static async start(runtime) {
13
+ const instance = new SwarmsService(runtime);
14
+ await instance.initialize(runtime);
15
+ return instance;
16
+ }
17
+ async stop() {
18
+ this.apiKey = null;
19
+ }
20
+ async initialize(runtime) {
21
+ const apiKey = runtime.getSetting("SWARMS_API_KEY");
22
+ if (!apiKey) {
23
+ runtime.logger.warn("[SwarmsService] SWARMS_API_KEY not set. Swarm features disabled.");
24
+ return;
25
+ }
26
+ this.apiKey = String(apiKey);
27
+ runtime.logger.info("[SwarmsService] Initialized with Swarms API (direct)");
28
+ }
29
+ isAvailable() {
30
+ return this.apiKey !== null;
31
+ }
32
+ async apiCall(path, body) {
33
+ if (!this.apiKey) {
34
+ throw new Error("Swarms client not initialized — set SWARMS_API_KEY");
35
+ }
36
+ const res = await fetch(`${SWARMS_API_BASE}${path}`, {
37
+ method: "POST",
38
+ headers: {
39
+ "Content-Type": "application/json",
40
+ "x-api-key": this.apiKey,
41
+ },
42
+ body: JSON.stringify(body),
43
+ signal: AbortSignal.timeout(120_000),
44
+ });
45
+ if (!res.ok) {
46
+ const text = await res.text().catch(() => "");
47
+ throw new Error(`Swarms API ${path} returned ${res.status}: ${text.slice(0, 200)}`);
48
+ }
49
+ return res.json();
50
+ }
51
+ /**
52
+ * Run a single agent with the Swarms API.
53
+ * Endpoint: POST /v1/agent/completions
54
+ */
55
+ async runAgent(config, task) {
56
+ const startTime = Date.now();
57
+ const result = await this.apiCall("/v1/agent/completions", {
58
+ agent_config: config,
59
+ task,
60
+ });
61
+ const elapsed = Date.now() - startTime;
62
+ if (elapsed > 30000) {
63
+ console.warn(`[SwarmsService] runAgent slow: ${elapsed}ms for "${config.agent_name}"`);
64
+ }
65
+ return result;
66
+ }
67
+ /**
68
+ * Run a multi-agent swarm.
69
+ * Endpoint: POST /v1/swarm/completions
70
+ */
71
+ async runSwarm(params) {
72
+ const agentCount = params.agents?.length ?? 0;
73
+ const startTime = Date.now();
74
+ const result = await this.apiCall("/v1/swarm/completions", params);
75
+ const elapsed = Date.now() - startTime;
76
+ if (elapsed > 60000) {
77
+ console.warn(`[SwarmsService] runSwarm slow: ${elapsed}ms, ${agentCount} agents, type=${params.swarm_type}`);
78
+ }
79
+ return result;
80
+ }
81
+ /**
82
+ * List available swarm types from the API.
83
+ */
84
+ async getAvailableSwarmTypes() {
85
+ if (!this.apiKey)
86
+ return [];
87
+ try {
88
+ const res = await fetch(`${SWARMS_API_BASE}/v1/swarms/available`, {
89
+ headers: { "x-api-key": this.apiKey },
90
+ signal: AbortSignal.timeout(10_000),
91
+ });
92
+ if (!res.ok)
93
+ return [];
94
+ const data = await res.json();
95
+ return Array.isArray(data.swarm_types) ? data.swarm_types : [];
96
+ }
97
+ catch {
98
+ return [];
99
+ }
100
+ }
101
+ }
102
+ //# sourceMappingURL=swarmsService.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"swarmsService.js","sourceRoot":"","sources":["../../src/services/swarmsService.ts"],"names":[],"mappings":"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"}