@elizaos/plugin-dummy-services 1.3.1 → 1.4.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.js +29 -29
- package/dist/index.js.map +1 -1
- package/package.json +3 -3
package/dist/index.js
CHANGED
|
@@ -45,7 +45,7 @@ var DummyTokenDataService = class _DummyTokenDataService extends ITokenDataServi
|
|
|
45
45
|
return Array.from({ length: limit }, () => this.generateDummyToken(chain, void 0, query));
|
|
46
46
|
}
|
|
47
47
|
async getTokensByAddresses(addresses, chain) {
|
|
48
|
-
logger.debug(
|
|
48
|
+
logger.debug({ addresses, chain }, "DummyTokenDataService: getTokensByAddresses");
|
|
49
49
|
return addresses.map((addr) => this.generateDummyToken(chain, addr));
|
|
50
50
|
}
|
|
51
51
|
static async start(runtime) {
|
|
@@ -1336,7 +1336,7 @@ var DummyEmailService = class _DummyEmailService extends IEmailService {
|
|
|
1336
1336
|
};
|
|
1337
1337
|
|
|
1338
1338
|
// src/e2e/scenarios.ts
|
|
1339
|
-
import { ILpService as ILpService2, ServiceType as ServiceType3 } from "@elizaos/core";
|
|
1339
|
+
import { ILpService as ILpService2, ServiceType as ServiceType3, logger as logger2 } from "@elizaos/core";
|
|
1340
1340
|
import { strict as assert } from "assert";
|
|
1341
1341
|
var dummyServicesScenariosSuite = {
|
|
1342
1342
|
name: "Dummy Services Plugin E2E Scenarios",
|
|
@@ -1344,7 +1344,7 @@ var dummyServicesScenariosSuite = {
|
|
|
1344
1344
|
{
|
|
1345
1345
|
name: "Scenario 1: Should initialize dummy services and verify they are available",
|
|
1346
1346
|
fn: async (runtime) => {
|
|
1347
|
-
|
|
1347
|
+
logger2.info("Testing dummy services initialization...");
|
|
1348
1348
|
const lpService = runtime.getService(ILpService2.serviceType);
|
|
1349
1349
|
assert(lpService, "DummyLpService not found in runtime");
|
|
1350
1350
|
assert.equal(
|
|
@@ -1356,7 +1356,7 @@ var dummyServicesScenariosSuite = {
|
|
|
1356
1356
|
DummyTokenDataService.serviceType
|
|
1357
1357
|
);
|
|
1358
1358
|
assert(tokenDataService, "DummyTokenDataService not found in runtime");
|
|
1359
|
-
|
|
1359
|
+
logger2.info("Successfully verified both dummy services are initialized and available.");
|
|
1360
1360
|
}
|
|
1361
1361
|
},
|
|
1362
1362
|
{
|
|
@@ -1364,7 +1364,7 @@ var dummyServicesScenariosSuite = {
|
|
|
1364
1364
|
fn: async (runtime) => {
|
|
1365
1365
|
const lpService = runtime.getService(ILpService2.serviceType);
|
|
1366
1366
|
assert(lpService, "DummyLpService not found");
|
|
1367
|
-
|
|
1367
|
+
logger2.info("Fetching all pools from DummyLpService...");
|
|
1368
1368
|
const allPools = await lpService.getPools();
|
|
1369
1369
|
assert(Array.isArray(allPools), "getPools should return an array");
|
|
1370
1370
|
assert.equal(allPools.length, 2, "Should return 2 dummy pools");
|
|
@@ -1374,7 +1374,7 @@ var dummyServicesScenariosSuite = {
|
|
|
1374
1374
|
assert.equal(pool1.tokenA.symbol, "SOL", "Pool should have SOL as tokenA");
|
|
1375
1375
|
assert.equal(pool1.tokenB.symbol, "USDC", "Pool should have USDC as tokenB");
|
|
1376
1376
|
assert.equal(pool1.tvl, 123456789e-2, "Pool should have correct TVL");
|
|
1377
|
-
|
|
1377
|
+
logger2.info("Successfully fetched and verified pool data.");
|
|
1378
1378
|
}
|
|
1379
1379
|
},
|
|
1380
1380
|
{
|
|
@@ -1383,7 +1383,7 @@ var dummyServicesScenariosSuite = {
|
|
|
1383
1383
|
const lpService = runtime.getService(ILpService2.serviceType);
|
|
1384
1384
|
assert(lpService, "DummyLpService not found");
|
|
1385
1385
|
const solMint = "So11111111111111111111111111111111111111112";
|
|
1386
|
-
|
|
1386
|
+
logger2.info(`Filtering pools containing SOL (${solMint})...`);
|
|
1387
1387
|
const solPools = await lpService.getPools(solMint);
|
|
1388
1388
|
assert(Array.isArray(solPools), "getPools with filter should return an array");
|
|
1389
1389
|
assert(solPools.length > 0, "Should find pools containing SOL");
|
|
@@ -1391,7 +1391,7 @@ var dummyServicesScenariosSuite = {
|
|
|
1391
1391
|
const containsSol = pool.tokenA.mint === solMint || pool.tokenB.mint === solMint;
|
|
1392
1392
|
assert(containsSol, `Pool ${pool.id} should contain SOL`);
|
|
1393
1393
|
});
|
|
1394
|
-
|
|
1394
|
+
logger2.info(`Found ${solPools.length} pools containing SOL.`);
|
|
1395
1395
|
}
|
|
1396
1396
|
},
|
|
1397
1397
|
{
|
|
@@ -1400,7 +1400,7 @@ var dummyServicesScenariosSuite = {
|
|
|
1400
1400
|
const lpService = runtime.getService(ILpService2.serviceType);
|
|
1401
1401
|
assert(lpService, "DummyLpService not found");
|
|
1402
1402
|
const mockVault = { publicKey: "dummy-public-key", secretKey: "dummy-secret-key" };
|
|
1403
|
-
|
|
1403
|
+
logger2.info("Testing add liquidity to dummy-pool-1...");
|
|
1404
1404
|
const result = await lpService.addLiquidity({
|
|
1405
1405
|
userVault: mockVault,
|
|
1406
1406
|
poolId: "dummy-pool-1",
|
|
@@ -1423,7 +1423,7 @@ var dummyServicesScenariosSuite = {
|
|
|
1423
1423
|
"dummy-lp-mint-dummy-pool-1",
|
|
1424
1424
|
"LP token should have correct address"
|
|
1425
1425
|
);
|
|
1426
|
-
|
|
1426
|
+
logger2.info("Successfully added liquidity:", result);
|
|
1427
1427
|
}
|
|
1428
1428
|
},
|
|
1429
1429
|
{
|
|
@@ -1432,7 +1432,7 @@ var dummyServicesScenariosSuite = {
|
|
|
1432
1432
|
const lpService = runtime.getService(ILpService2.serviceType);
|
|
1433
1433
|
assert(lpService, "DummyLpService not found");
|
|
1434
1434
|
const mockVault = { publicKey: "dummy-public-key-2", secretKey: "dummy-secret-key-2" };
|
|
1435
|
-
|
|
1435
|
+
logger2.info("Testing remove liquidity from dummy-pool-1...");
|
|
1436
1436
|
const result = await lpService.removeLiquidity({
|
|
1437
1437
|
userVault: mockVault,
|
|
1438
1438
|
poolId: "dummy-pool-1",
|
|
@@ -1452,7 +1452,7 @@ var dummyServicesScenariosSuite = {
|
|
|
1452
1452
|
assert(usdcToken, "Should receive USDC");
|
|
1453
1453
|
assert.equal(solToken.uiAmount, 0.5, "Should receive 0.5 SOL");
|
|
1454
1454
|
assert.equal(usdcToken.uiAmount, 500, "Should receive 500 USDC");
|
|
1455
|
-
|
|
1455
|
+
logger2.info("Successfully removed liquidity:", result);
|
|
1456
1456
|
}
|
|
1457
1457
|
},
|
|
1458
1458
|
{
|
|
@@ -1462,7 +1462,7 @@ var dummyServicesScenariosSuite = {
|
|
|
1462
1462
|
assert(lpService, "DummyLpService not found");
|
|
1463
1463
|
const userPublicKey = "HtiYLjY9dGMrmpwjDcGmxQCo2VsCCAQiBgt5xPLanTJa";
|
|
1464
1464
|
const lpMint = "dummy-lp-mint-dummy-pool-1";
|
|
1465
|
-
|
|
1465
|
+
logger2.info(`Getting LP position details for user ${userPublicKey}...`);
|
|
1466
1466
|
const position = await lpService.getLpPositionDetails(userPublicKey, lpMint);
|
|
1467
1467
|
assert(position, "Should return LP position details");
|
|
1468
1468
|
assert.equal(position.poolId, "dummy-pool-1", "Position should reference correct pool");
|
|
@@ -1483,7 +1483,7 @@ var dummyServicesScenariosSuite = {
|
|
|
1483
1483
|
assert(usdc, "Should have USDC in underlying tokens");
|
|
1484
1484
|
assert.equal(sol.uiAmount, 0.5, "Should have 0.5 SOL");
|
|
1485
1485
|
assert.equal(usdc.uiAmount, 500, "Should have 500 USDC");
|
|
1486
|
-
|
|
1486
|
+
logger2.info("Successfully retrieved LP position details:", position);
|
|
1487
1487
|
}
|
|
1488
1488
|
},
|
|
1489
1489
|
{
|
|
@@ -1492,7 +1492,7 @@ var dummyServicesScenariosSuite = {
|
|
|
1492
1492
|
const lpService = runtime.getService(ILpService2.serviceType);
|
|
1493
1493
|
assert(lpService, "DummyLpService not found");
|
|
1494
1494
|
const poolIds = ["dummy-pool-1", "dummy-stable-pool-2"];
|
|
1495
|
-
|
|
1495
|
+
logger2.info(`Getting market data for pools: ${poolIds.join(", ")}...`);
|
|
1496
1496
|
const marketData = await lpService.getMarketDataForPools(poolIds);
|
|
1497
1497
|
assert(marketData, "Should return market data");
|
|
1498
1498
|
assert.equal(Object.keys(marketData).length, 2, "Should have data for 2 pools");
|
|
@@ -1506,7 +1506,7 @@ var dummyServicesScenariosSuite = {
|
|
|
1506
1506
|
assert(data.apy >= 0 && data.apy <= 1, "APY should be between 0 and 1");
|
|
1507
1507
|
assert(data.apr >= 0 && data.apr <= 1, "APR should be between 0 and 1");
|
|
1508
1508
|
});
|
|
1509
|
-
|
|
1509
|
+
logger2.info("Successfully retrieved market data:", marketData);
|
|
1510
1510
|
}
|
|
1511
1511
|
},
|
|
1512
1512
|
{
|
|
@@ -1517,14 +1517,14 @@ var dummyServicesScenariosSuite = {
|
|
|
1517
1517
|
);
|
|
1518
1518
|
assert(tokenDataService, "DummyTokenDataService not found");
|
|
1519
1519
|
const solMint = "So11111111111111111111111111111111111111112";
|
|
1520
|
-
|
|
1520
|
+
logger2.info(`Fetching token data for SOL (${solMint})...`);
|
|
1521
1521
|
const tokenData = await tokenDataService.getTokenDetails(solMint, "solana");
|
|
1522
1522
|
assert(tokenData, "Should return token data");
|
|
1523
1523
|
assert(tokenData.symbol, "Should have symbol");
|
|
1524
1524
|
assert(tokenData.name, "Should have name");
|
|
1525
1525
|
assert.equal(tokenData.decimals, 18, "Should have decimals");
|
|
1526
1526
|
assert(typeof tokenData.price === "number", "Should have price");
|
|
1527
|
-
|
|
1527
|
+
logger2.info("Successfully fetched token data:", tokenData);
|
|
1528
1528
|
}
|
|
1529
1529
|
},
|
|
1530
1530
|
{
|
|
@@ -1534,7 +1534,7 @@ var dummyServicesScenariosSuite = {
|
|
|
1534
1534
|
DummyTokenDataService.serviceType
|
|
1535
1535
|
);
|
|
1536
1536
|
assert(tokenDataService, "DummyTokenDataService not found");
|
|
1537
|
-
|
|
1537
|
+
logger2.info("Fetching trending tokens...");
|
|
1538
1538
|
const trendingTokens = await tokenDataService.getTrendingTokens("solana", 5);
|
|
1539
1539
|
assert(Array.isArray(trendingTokens), "Should return array of trending tokens");
|
|
1540
1540
|
assert.equal(trendingTokens.length, 5, "Should return requested number of tokens");
|
|
@@ -1543,7 +1543,7 @@ var dummyServicesScenariosSuite = {
|
|
|
1543
1543
|
assert(token.name, `Token ${i} should have name`);
|
|
1544
1544
|
assert(typeof token.price === "number", `Token ${i} should have price`);
|
|
1545
1545
|
});
|
|
1546
|
-
|
|
1546
|
+
logger2.info("Successfully fetched trending tokens.");
|
|
1547
1547
|
}
|
|
1548
1548
|
},
|
|
1549
1549
|
{
|
|
@@ -1551,11 +1551,11 @@ var dummyServicesScenariosSuite = {
|
|
|
1551
1551
|
fn: async (runtime) => {
|
|
1552
1552
|
const lpService = runtime.getService(ILpService2.serviceType);
|
|
1553
1553
|
assert(lpService, "DummyLpService not found");
|
|
1554
|
-
|
|
1554
|
+
logger2.info("Testing integration with multiple pools...");
|
|
1555
1555
|
const allPools = await lpService.getPools();
|
|
1556
1556
|
assert.equal(allPools.length, 2, "Should have 2 pools");
|
|
1557
1557
|
for (const pool of allPools) {
|
|
1558
|
-
|
|
1558
|
+
logger2.info(`Testing operations on pool ${pool.id}...`);
|
|
1559
1559
|
const addResult = await lpService.addLiquidity({
|
|
1560
1560
|
userVault: {},
|
|
1561
1561
|
poolId: pool.id,
|
|
@@ -1575,18 +1575,18 @@ var dummyServicesScenariosSuite = {
|
|
|
1575
1575
|
`Remove liquidity should succeed for ${pool.id}`
|
|
1576
1576
|
);
|
|
1577
1577
|
}
|
|
1578
|
-
|
|
1578
|
+
logger2.info("Successfully tested operations on all pools.");
|
|
1579
1579
|
}
|
|
1580
1580
|
},
|
|
1581
1581
|
{
|
|
1582
1582
|
name: "Scenario 11: Should initialize wallet service and verify functionality",
|
|
1583
1583
|
fn: async (runtime) => {
|
|
1584
|
-
|
|
1584
|
+
logger2.info("Testing wallet service initialization...");
|
|
1585
1585
|
const walletService = runtime.getService(ServiceType3.WALLET);
|
|
1586
1586
|
assert(walletService, "DummyWalletService not found in runtime");
|
|
1587
1587
|
const initialBalance = await walletService.getBalance("USDC");
|
|
1588
1588
|
assert.equal(initialBalance, 1e4, "Should have initial USDC balance of 10000");
|
|
1589
|
-
|
|
1589
|
+
logger2.info("Successfully verified wallet service is initialized.");
|
|
1590
1590
|
}
|
|
1591
1591
|
},
|
|
1592
1592
|
{
|
|
@@ -1594,7 +1594,7 @@ var dummyServicesScenariosSuite = {
|
|
|
1594
1594
|
fn: async (runtime) => {
|
|
1595
1595
|
const walletService = runtime.getService(ServiceType3.WALLET);
|
|
1596
1596
|
assert(walletService, "DummyWalletService not found");
|
|
1597
|
-
|
|
1597
|
+
logger2.info("Testing wallet operations...");
|
|
1598
1598
|
await walletService.addFunds("SOL", 5);
|
|
1599
1599
|
const solBalance = await walletService.getBalance("SOL");
|
|
1600
1600
|
assert.equal(solBalance, 5, "Should have 5 SOL after adding funds");
|
|
@@ -1605,7 +1605,7 @@ var dummyServicesScenariosSuite = {
|
|
|
1605
1605
|
const solAsset = portfolio.assets.find((a) => a.symbol === "SOL");
|
|
1606
1606
|
assert(solAsset, "SOL should be in portfolio");
|
|
1607
1607
|
assert.equal(solAsset.balance, "5", 'SOL balance string should be "5"');
|
|
1608
|
-
|
|
1608
|
+
logger2.info("Successfully tested wallet operations.");
|
|
1609
1609
|
}
|
|
1610
1610
|
},
|
|
1611
1611
|
{
|
|
@@ -1613,7 +1613,7 @@ var dummyServicesScenariosSuite = {
|
|
|
1613
1613
|
fn: async (runtime) => {
|
|
1614
1614
|
const walletService = runtime.getService(ServiceType3.WALLET);
|
|
1615
1615
|
assert(walletService, "DummyWalletService not found");
|
|
1616
|
-
|
|
1616
|
+
logger2.info("Testing SOL transfer functionality...");
|
|
1617
1617
|
await walletService.resetWallet(1e4, "USDC");
|
|
1618
1618
|
await walletService.addFunds("SOL", 10);
|
|
1619
1619
|
const txHash = await walletService.transferSol("dummy-from", "dummy-to", 3e9);
|
|
@@ -1631,7 +1631,7 @@ var dummyServicesScenariosSuite = {
|
|
|
1631
1631
|
"Should throw insufficient balance error"
|
|
1632
1632
|
);
|
|
1633
1633
|
}
|
|
1634
|
-
|
|
1634
|
+
logger2.info("Successfully tested SOL transfers.");
|
|
1635
1635
|
}
|
|
1636
1636
|
}
|
|
1637
1637
|
]
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/tokenData/service.ts","../src/lp/service.ts","../src/wallet/service.ts","../src/pdf/service.ts","../src/video/service.ts","../src/browser/service.ts","../src/transcription/service.ts","../src/web-search/service.ts","../src/email/service.ts","../src/e2e/scenarios.ts","../src/index.ts"],"sourcesContent":["import { ITokenDataService, TokenData, IAgentRuntime, ServiceType, logger } from '@elizaos/core';\nimport { v4 as uuidv4 } from 'uuid';\n\nexport class DummyTokenDataService extends ITokenDataService {\n readonly serviceName = 'dummy-token-data';\n static readonly serviceType = ServiceType.TOKEN_DATA;\n\n constructor(runtime?: IAgentRuntime) {\n super(runtime);\n logger.info('DummyTokenDataService initialized');\n }\n\n private generateDummyToken(chain: string, address?: string, query?: string): TokenData {\n const randomAddress = address || `0x${uuidv4().replace(/-/g, '')}`;\n const symbol = query ? query.toUpperCase() : randomAddress.substring(2, 6).toUpperCase();\n return {\n id: `${chain}:${randomAddress}`,\n symbol: symbol,\n name: `Dummy Token ${symbol}`,\n address: randomAddress,\n chain: chain,\n sourceProvider: 'dummy',\n price: Math.random() * 100,\n priceChange24hPercent: (Math.random() - 0.5) * 20,\n volume24hUSD: Math.random() * 1000000,\n marketCapUSD: Math.random() * 100000000,\n liquidity: Math.random() * 500000,\n holders: Math.floor(Math.random() * 10000),\n logoURI: 'https://via.placeholder.com/150',\n decimals: 18,\n lastUpdatedAt: new Date(),\n raw: {\n dummyData: true,\n },\n };\n }\n\n async getTokenDetails(address: string, chain: string): Promise<TokenData | null> {\n logger.debug(`DummyTokenDataService: getTokenDetails for ${address} on ${chain}`);\n return this.generateDummyToken(chain, address);\n }\n\n async getTrendingTokens(chain = 'solana', limit = 10, _timePeriod = '24h'): Promise<TokenData[]> {\n logger.debug(`DummyTokenDataService: getTrendingTokens on ${chain}`);\n return Array.from({ length: limit }, () => this.generateDummyToken(chain));\n }\n\n async searchTokens(query: string, chain = 'solana', limit = 5): Promise<TokenData[]> {\n logger.debug(`DummyTokenDataService: searchTokens for \"${query}\" on ${chain}`);\n return Array.from({ length: limit }, () => this.generateDummyToken(chain, undefined, query));\n }\n\n async getTokensByAddresses(addresses: string[], chain: string): Promise<TokenData[]> {\n logger.debug(`DummyTokenDataService: getTokensByAddresses on ${chain} for`, addresses);\n return addresses.map((addr) => this.generateDummyToken(chain, addr));\n }\n\n static async start(runtime: IAgentRuntime): Promise<DummyTokenDataService> {\n const service = new DummyTokenDataService(runtime);\n return service;\n }\n\n static async stop(runtime: IAgentRuntime): Promise<void> {\n const service = runtime.getService<DummyTokenDataService>(DummyTokenDataService.serviceType);\n if (service) {\n await service.stop();\n }\n }\n\n async start(): Promise<void> {\n logger.info(`[${this.serviceName}] Service started.`);\n }\n\n async stop(): Promise<void> {\n logger.info(`[${this.serviceName}] Service stopped.`);\n }\n}\n","import {\n IAgentRuntime,\n ILpService,\n LpPositionDetails,\n PoolInfo,\n TokenBalance,\n TransactionResult,\n Service,\n} from '@elizaos/core';\n\nexport class DummyLpService extends ILpService {\n public getDexName(): string {\n return 'dummy';\n }\n\n static async start(runtime: IAgentRuntime): Promise<DummyLpService> {\n const service = new DummyLpService(runtime);\n return service;\n }\n\n static async stop(runtime: IAgentRuntime): Promise<void> {\n const service = runtime.getService<DummyLpService>(DummyLpService.serviceType);\n if (service) {\n await service.stop();\n }\n }\n\n async start(runtime: IAgentRuntime): Promise<void> {\n console.log('[DummyLpService] started.');\n }\n\n async stop(): Promise<void> {\n console.log('[DummyLpService] stopped.');\n }\n\n public async getPools(tokenAMint?: string, tokenBMint?: string): Promise<PoolInfo[]> {\n console.log(`[DummyLpService] getPools called with: ${tokenAMint}, ${tokenBMint}`);\n\n const SOL_MINT = 'So11111111111111111111111111111111111111112';\n const USDC_MINT = 'EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyB7u6a';\n\n const pools = [\n {\n id: 'dummy-pool-1',\n dex: 'dummy',\n tokenA: { mint: SOL_MINT, symbol: 'SOL', name: 'Solana', decimals: 9 },\n tokenB: { mint: USDC_MINT, symbol: 'USDC', name: 'USD Coin', decimals: 6 },\n apr: 0.12,\n apy: 0.125,\n tvl: 1234567.89,\n fee: 0.0025,\n metadata: { name: 'SOL/USDC Dummy Pool', isStable: false },\n },\n {\n id: 'dummy-stable-pool-2',\n dex: 'dummy',\n tokenA: { mint: USDC_MINT, symbol: 'USDC', name: 'USD Coin', decimals: 6 },\n tokenB: {\n mint: 'Es9vMFrzaCERmJfrF4H2FYD4KCoNkY11McCe8BenwNYB',\n symbol: 'USDT',\n name: 'Tether',\n decimals: 6,\n },\n apr: 0.08,\n apy: 0.082,\n tvl: 2500000.0,\n fee: 0.0005,\n metadata: { name: 'USDC/USDT Dummy Stable Pool', isStable: true },\n },\n ];\n\n return pools.filter((p) => {\n if (!tokenAMint && !tokenBMint) return true;\n const hasTokenA = p.tokenA.mint === tokenAMint || p.tokenB.mint === tokenAMint;\n const hasTokenB = p.tokenA.mint === tokenBMint || p.tokenB.mint === tokenBMint;\n if (tokenAMint && tokenBMint) return hasTokenA && hasTokenB;\n if (tokenAMint) return hasTokenA;\n if (tokenBMint) return hasTokenB;\n return false;\n });\n }\n\n public async addLiquidity(params: {\n userVault: any;\n poolId: string;\n tokenAAmountLamports: string;\n tokenBAmountLamports?: string;\n slippageBps: number;\n }): Promise<TransactionResult & { lpTokensReceived?: TokenBalance }> {\n console.log(`[DummyLpService] addLiquidity called for pool: ${params.poolId}`);\n return {\n success: true,\n transactionId: `dummy-tx-${Date.now()}`,\n lpTokensReceived: {\n address: `dummy-lp-mint-${params.poolId}`,\n balance: '100000000', // 100 LP tokens\n symbol: 'DUMMY-LP',\n uiAmount: 100,\n decimals: 6,\n name: `Dummy LP Token for ${params.poolId}`,\n },\n };\n }\n\n public async removeLiquidity(params: {\n userVault: any;\n poolId: string;\n lpTokenAmountLamports: string;\n slippageBps: number;\n }): Promise<TransactionResult & { tokensReceived?: TokenBalance[] }> {\n console.log(`[DummyLpService] removeLiquidity called for pool: ${params.poolId}`);\n return {\n success: true,\n transactionId: `dummy-tx-${Date.now()}`,\n tokensReceived: [\n {\n address: 'So11111111111111111111111111111111111111112',\n balance: '500000000',\n symbol: 'SOL',\n uiAmount: 0.5,\n decimals: 9,\n name: 'Solana',\n },\n {\n address: 'EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyB7u6a',\n balance: '500000000',\n symbol: 'USDC',\n uiAmount: 500,\n decimals: 6,\n name: 'USD Coin',\n },\n ],\n };\n }\n\n public async getLpPositionDetails(\n userAccountPublicKey: string,\n poolOrPositionIdentifier: string\n ): Promise<LpPositionDetails | null> {\n console.log(\n `[DummyLpService] getLpPositionDetails called for user: ${userAccountPublicKey}, identifier: ${poolOrPositionIdentifier}`\n );\n // This is a mock. In a real scenario, you'd look up position details based on the identifier.\n // The identifier could be the pool ID for a simple AMM or a position NFT mint for a CLMM.\n return {\n poolId: 'dummy-pool-1', // Assuming the identifier maps back to a known pool\n dex: 'dummy',\n lpTokenBalance: {\n address: poolOrPositionIdentifier,\n balance: '100000000',\n symbol: 'DUMMY-LP',\n uiAmount: 100,\n decimals: 6,\n name: `Dummy LP Token`,\n },\n underlyingTokens: [\n {\n address: 'So11111111111111111111111111111111111111112',\n balance: '500000000',\n symbol: 'SOL',\n uiAmount: 0.5,\n decimals: 9,\n name: 'Solana',\n },\n {\n address: 'EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyB7u6a',\n balance: '500000000',\n symbol: 'USDC',\n uiAmount: 500,\n decimals: 6,\n name: 'USD Coin',\n },\n ],\n valueUsd: 1000,\n metadata: { apr: 0.12 },\n };\n }\n\n public async getMarketDataForPools(\n poolIds: string[]\n ): Promise<Record<string, Partial<PoolInfo>>> {\n console.log(`[DummyLpService] getMarketDataForPools called for pools: ${poolIds.join(', ')}`);\n const results: Record<string, Partial<PoolInfo>> = {};\n for (const poolId of poolIds) {\n results[poolId] = {\n apy: Math.random() * 0.2,\n tvl: Math.random() * 1000000,\n apr: Math.random() * 0.18,\n };\n }\n return results;\n }\n}\n","import { AgentRuntime, IWalletService, ServiceType, WalletPortfolio } from '@elizaos/core';\n\nconst DEFAULT_QUOTE_ASSET = 'USDC'; // Default asset for cash\nconst DEFAULT_TRANSACTION_FEE_FIXED = 0.1; // Example fixed fee in quote asset\n\ninterface DummyPositionLot {\n price: number;\n quantity: number;\n timestamp: number;\n}\n\ninterface DummyAssetDetail {\n quantity: number;\n averagePrice: number; // Average price of current holdings\n lots: DummyPositionLot[]; // For FIFO P&L on sell\n}\n\nexport class DummyWalletService extends IWalletService {\n public static override readonly serviceType = ServiceType.WALLET;\n\n private balances: Map<string, number>; // assetSymbolOrAddress -> quantity\n private positions: Map<string, DummyAssetDetail>; // assetSymbolOrAddress -> details for owned non-quote assets\n private quoteAssetSymbol: string;\n\n constructor(runtime: AgentRuntime) {\n super(runtime);\n this.balances = new Map<string, number>();\n this.positions = new Map<string, DummyAssetDetail>();\n this.quoteAssetSymbol = DEFAULT_QUOTE_ASSET;\n this.resetWallet(10000, DEFAULT_QUOTE_ASSET); // Initialize with some default cash\n }\n async transferSol(from: any, to: any, lamports: number): Promise<string> {\n // This is a dummy implementation - no real transfer happens\n console.log(\n `[${DummyWalletService.serviceType}] Mock transfer: ${lamports} lamports from ${from} to ${to}`\n );\n\n // For dummy wallet, we just simulate the transfer\n const solSymbol = 'SOL';\n const solAmount = lamports / 1e9; // Convert lamports to SOL\n\n const currentBalance = this.balances.get(solSymbol) || 0;\n if (currentBalance < solAmount) {\n throw new Error(`Insufficient SOL balance. Have ${currentBalance}, need ${solAmount}`);\n }\n\n // Deduct from balance\n this.balances.set(solSymbol, currentBalance - solAmount);\n\n // Return a dummy transaction signature\n return `dummy-tx-${Date.now()}-${Math.random().toString(36).substring(7)}`;\n }\n\n public static async start(runtime: AgentRuntime): Promise<DummyWalletService> {\n console.log(`[${DummyWalletService.serviceType}] static start called - creating instance.`);\n const instance = new DummyWalletService(runtime);\n // No further async init in instance.start() currently needed for this simple map-based wallet\n return instance;\n }\n\n public async start(): Promise<void> {\n console.log(\n `[${DummyWalletService.serviceType}] instance start called. Initialized with ${this.balances.get(this.quoteAssetSymbol)} ${this.quoteAssetSymbol}.`\n );\n }\n\n public async stop(): Promise<void> {\n console.log(`[${DummyWalletService.serviceType}] instance stop called. Balances reset.`);\n this.balances.clear();\n this.positions.clear();\n }\n\n async addFunds(\n assetSymbolOrAddress: string,\n amount: number,\n _walletAddress?: string\n ): Promise<void> {\n const currentBalance = this.balances.get(assetSymbolOrAddress) || 0;\n this.balances.set(assetSymbolOrAddress, currentBalance + amount);\n console.log(\n `[${DummyWalletService.serviceType}] Added ${amount} ${assetSymbolOrAddress}. New balance: ${this.balances.get(assetSymbolOrAddress)}`\n );\n }\n\n async setPortfolioHolding(\n assetSymbolOrAddress: string,\n quantity: number,\n averagePrice: number,\n _walletAddress?: string\n ): Promise<void> {\n if (assetSymbolOrAddress === this.quoteAssetSymbol) {\n console.warn(\n `[${DummyWalletService.serviceType}] Cannot set portfolio holding for quote asset directly, use addFunds.`\n );\n return this.addFunds(assetSymbolOrAddress, quantity * averagePrice); // Assuming quantity is amount of quote to add\n }\n this.balances.set(assetSymbolOrAddress, quantity);\n this.positions.set(assetSymbolOrAddress, {\n quantity: quantity,\n averagePrice: averagePrice,\n lots: [{ price: averagePrice, quantity: quantity, timestamp: Date.now() }], // Create a single lot for simplicity\n });\n console.log(\n `[${DummyWalletService.serviceType}] Set holding for ${assetSymbolOrAddress}: ${quantity} @ ${averagePrice}`\n );\n }\n\n async resetWallet(\n initialCashAmount: number,\n cashAssetSymbol: string = DEFAULT_QUOTE_ASSET,\n _walletAddress?: string\n ): Promise<void> {\n this.balances.clear();\n this.positions.clear();\n this.quoteAssetSymbol = cashAssetSymbol;\n this.balances.set(this.quoteAssetSymbol, initialCashAmount);\n console.log(\n `[${DummyWalletService.serviceType}] Wallet reset. Cash: ${initialCashAmount} ${this.quoteAssetSymbol}`\n );\n }\n\n async getBalance(assetSymbolOrAddress: string, _walletAddress?: string): Promise<number> {\n return this.balances.get(assetSymbolOrAddress) || 0;\n }\n\n async getPortfolio(_walletAddress?: string): Promise<WalletPortfolio> {\n const assets: any[] = [];\n let totalValueUsd = 0;\n\n for (const [symbol, balance] of this.balances) {\n const positionDetail = this.positions.get(symbol);\n const isQuoteAsset = symbol === this.quoteAssetSymbol;\n const averagePrice = positionDetail?.averagePrice || (isQuoteAsset ? 1 : 0);\n const value = isQuoteAsset\n ? balance\n : positionDetail\n ? balance * positionDetail.averagePrice\n : 0;\n\n // WalletAsset structure\n assets.push({\n address: symbol, // Using symbol as address for dummy wallet\n symbol,\n balance: balance.toString(),\n decimals: isQuoteAsset ? 6 : 9, // Default decimals\n quantity: balance,\n averagePrice,\n currentPrice: undefined,\n value,\n assetAddress: symbol,\n });\n\n totalValueUsd += value;\n }\n\n return {\n totalValueUsd,\n assets,\n };\n }\n}\n","import { IAgentRuntime } from '@elizaos/core';\nimport {\n IPdfService,\n PdfExtractionResult,\n PdfGenerationOptions,\n PdfConversionOptions,\n} from '@elizaos/core';\n\n/**\n * Dummy PDF service for testing purposes\n * Provides mock implementations of PDF processing operations\n */\nexport class DummyPdfService extends IPdfService {\n static override readonly serviceType = IPdfService.serviceType;\n\n constructor(runtime: IAgentRuntime) {\n super(runtime);\n }\n\n static async start(runtime: IAgentRuntime): Promise<DummyPdfService> {\n const service = new DummyPdfService(runtime);\n await service.initialize();\n return service;\n }\n\n async initialize(): Promise<void> {\n this.runtime.logger.info('DummyPdfService initialized');\n }\n\n async stop(): Promise<void> {\n this.runtime.logger.info('DummyPdfService stopped');\n }\n\n async extractText(pdfPath: string | Buffer): Promise<PdfExtractionResult> {\n const isBuffer = Buffer.isBuffer(pdfPath);\n const filename = isBuffer ? 'buffer.pdf' : pdfPath;\n\n this.runtime.logger.debug(`Extracting text from ${filename}`);\n\n // Mock extraction result\n return {\n text: `Mock extracted text from ${filename}.\\n\\nThis is a dummy PDF service that simulates text extraction.\\n\\nPage 1: Lorem ipsum dolor sit amet, consectetur adipiscing elit.\\nPage 2: Sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.\\nPage 3: Ut enim ad minim veniam, quis nostrud exercitation ullamco.`,\n pageCount: 3,\n metadata: {\n title: 'Mock PDF Document',\n author: 'Dummy Service',\n createdAt: new Date('2024-01-01'),\n modifiedAt: new Date(),\n },\n };\n }\n\n async generatePdf(htmlContent: string, options?: PdfGenerationOptions): Promise<Buffer> {\n this.runtime.logger.debug('Generating PDF from HTML content');\n\n // Mock PDF generation\n const pdfContent = `Mock PDF generated from HTML content with ${htmlContent.length} characters`;\n const mockPdfBuffer = Buffer.from(pdfContent, 'utf8');\n\n // Simulate processing options\n if (options) {\n this.runtime.logger.debug('PDF generation options:', options);\n }\n\n return mockPdfBuffer;\n }\n\n async convertToPdf(filePath: string, options?: PdfConversionOptions): Promise<Buffer> {\n this.runtime.logger.debug(`Converting ${filePath} to PDF`);\n\n // Mock PDF conversion\n const pdfContent = `Mock PDF converted from ${filePath}`;\n const mockPdfBuffer = Buffer.from(pdfContent, 'utf8');\n\n // Simulate processing options\n if (options) {\n this.runtime.logger.debug('PDF conversion options:', options);\n }\n\n return mockPdfBuffer;\n }\n\n async mergePdfs(pdfPaths: (string | Buffer)[]): Promise<Buffer> {\n this.runtime.logger.debug(`Merging ${pdfPaths.length} PDF files`);\n\n // Mock PDF merging\n const mergedContent = pdfPaths\n .map((path, index) => {\n const name = Buffer.isBuffer(path) ? `buffer-${index}` : path;\n return `Content from ${name}`;\n })\n .join('\\n\\n');\n\n const mockMergedBuffer = Buffer.from(`Mock merged PDF:\\n${mergedContent}`, 'utf8');\n return mockMergedBuffer;\n }\n\n async splitPdf(pdfPath: string | Buffer): Promise<Buffer[]> {\n this.runtime.logger.debug('Splitting PDF into pages');\n\n const filename = Buffer.isBuffer(pdfPath) ? 'buffer.pdf' : pdfPath;\n\n // Mock PDF splitting - return 3 pages\n const pages = [\n Buffer.from(`Mock Page 1 from ${filename}`, 'utf8'),\n Buffer.from(`Mock Page 2 from ${filename}`, 'utf8'),\n Buffer.from(`Mock Page 3 from ${filename}`, 'utf8'),\n ];\n\n return pages;\n }\n}\n","import { IAgentRuntime } from '@elizaos/core';\nimport {\n IVideoService,\n VideoInfo,\n VideoFormat,\n VideoDownloadOptions,\n VideoProcessingOptions,\n} from '@elizaos/core';\n\n/**\n * Dummy video service for testing purposes\n * Provides mock implementations of video processing operations\n */\nexport class DummyVideoService extends IVideoService {\n static override readonly serviceType = IVideoService.serviceType;\n\n constructor(runtime: IAgentRuntime) {\n super(runtime);\n }\n\n static async start(runtime: IAgentRuntime): Promise<DummyVideoService> {\n const service = new DummyVideoService(runtime);\n await service.initialize();\n return service;\n }\n\n async initialize(): Promise<void> {\n this.runtime.logger.info('DummyVideoService initialized');\n }\n\n async stop(): Promise<void> {\n this.runtime.logger.info('DummyVideoService stopped');\n }\n\n async getVideoInfo(url: string): Promise<VideoInfo> {\n this.runtime.logger.debug(`Getting video info for ${url}`);\n\n return {\n title: 'Mock Video Title',\n duration: 300, // 5 minutes in seconds\n url,\n thumbnail: 'https://example.com/thumbnail.jpg',\n description: 'This is a mock video description for testing purposes.',\n uploader: 'DummyUploader',\n viewCount: 12345,\n uploadDate: new Date('2024-01-01'),\n formats: [\n {\n formatId: 'mp4-720p',\n url: 'https://example.com/video-720p.mp4',\n extension: 'mp4',\n quality: '720p',\n fileSize: 50000000, // 50MB\n videoCodec: 'h264',\n audioCodec: 'aac',\n resolution: '1280x720',\n fps: 30,\n bitrate: 1000000,\n },\n {\n formatId: 'mp4-1080p',\n url: 'https://example.com/video-1080p.mp4',\n extension: 'mp4',\n quality: '1080p',\n fileSize: 100000000, // 100MB\n videoCodec: 'h264',\n audioCodec: 'aac',\n resolution: '1920x1080',\n fps: 30,\n bitrate: 2000000,\n },\n ],\n };\n }\n\n async downloadVideo(url: string, options?: VideoDownloadOptions): Promise<string> {\n this.runtime.logger.debug(`Downloading video from ${url}`);\n\n if (options) {\n this.runtime.logger.debug('Download options:', options);\n }\n\n // Mock download - return a fake file path\n const filename = `mock-video-${Date.now()}.mp4`;\n const outputPath = options?.outputPath || `/tmp/${filename}`;\n\n // Simulate some download processing\n await new Promise((resolve) => setTimeout(resolve, 100));\n\n return outputPath;\n }\n\n async extractAudio(videoPath: string, outputPath?: string): Promise<string> {\n this.runtime.logger.debug(`Extracting audio from ${videoPath}`);\n\n const audioPath = outputPath || videoPath.replace(/\\.[^/.]+$/, '') + '.mp3';\n\n // Simulate audio extraction\n await new Promise((resolve) => setTimeout(resolve, 50));\n\n return audioPath;\n }\n\n async getThumbnail(videoPath: string, timestamp?: number): Promise<string> {\n this.runtime.logger.debug(`Generating thumbnail for ${videoPath} at ${timestamp || 0}s`);\n\n const thumbnailPath = videoPath.replace(/\\.[^/.]+$/, '') + `_${timestamp || 0}s.jpg`;\n\n // Simulate thumbnail generation\n await new Promise((resolve) => setTimeout(resolve, 30));\n\n return thumbnailPath;\n }\n\n async convertVideo(\n videoPath: string,\n outputPath: string,\n options?: VideoProcessingOptions\n ): Promise<string> {\n this.runtime.logger.debug(`Converting video from ${videoPath} to ${outputPath}`);\n\n if (options) {\n this.runtime.logger.debug('Conversion options:', options);\n }\n\n // Simulate video conversion\n await new Promise((resolve) => setTimeout(resolve, 200));\n\n return outputPath;\n }\n\n async getAvailableFormats(url: string): Promise<VideoFormat[]> {\n this.runtime.logger.debug(`Getting available formats for ${url}`);\n\n return [\n {\n formatId: 'mp4-360p',\n url: 'https://example.com/video-360p.mp4',\n extension: 'mp4',\n quality: '360p',\n fileSize: 15000000, // 15MB\n videoCodec: 'h264',\n audioCodec: 'aac',\n resolution: '640x360',\n fps: 30,\n bitrate: 500000,\n },\n {\n formatId: 'mp4-720p',\n url: 'https://example.com/video-720p.mp4',\n extension: 'mp4',\n quality: '720p',\n fileSize: 50000000, // 50MB\n videoCodec: 'h264',\n audioCodec: 'aac',\n resolution: '1280x720',\n fps: 30,\n bitrate: 1000000,\n },\n {\n formatId: 'mp4-1080p',\n url: 'https://example.com/video-1080p.mp4',\n extension: 'mp4',\n quality: '1080p',\n fileSize: 100000000, // 100MB\n videoCodec: 'h264',\n audioCodec: 'aac',\n resolution: '1920x1080',\n fps: 30,\n bitrate: 2000000,\n },\n {\n formatId: 'audio-only',\n url: 'https://example.com/audio.mp3',\n extension: 'mp3',\n quality: 'audio',\n fileSize: 5000000, // 5MB\n audioCodec: 'mp3',\n bitrate: 128000,\n },\n ];\n }\n}\n","import { IAgentRuntime } from '@elizaos/core';\nimport {\n IBrowserService,\n BrowserNavigationOptions,\n ScreenshotOptions,\n ElementSelector,\n ExtractedContent,\n ClickOptions,\n TypeOptions,\n} from '@elizaos/core';\n\n/**\n * Dummy browser service for testing purposes\n * Provides mock implementations of browser automation operations\n */\nexport class DummyBrowserService extends IBrowserService {\n static override readonly serviceType = IBrowserService.serviceType;\n\n private currentUrl: string = 'about:blank';\n private history: string[] = [];\n private historyIndex: number = -1;\n\n constructor(runtime: IAgentRuntime) {\n super(runtime);\n }\n\n static async start(runtime: IAgentRuntime): Promise<DummyBrowserService> {\n const service = new DummyBrowserService(runtime);\n await service.initialize();\n return service;\n }\n\n async initialize(): Promise<void> {\n this.runtime.logger.info('DummyBrowserService initialized');\n }\n\n async stop(): Promise<void> {\n this.runtime.logger.info('DummyBrowserService stopped');\n }\n\n async navigate(url: string, options?: BrowserNavigationOptions): Promise<void> {\n this.runtime.logger.debug(`Navigating to ${url}`);\n\n if (options) {\n this.runtime.logger.debug('Navigation options:', options);\n }\n\n // Update navigation history\n this.history.push(url);\n this.historyIndex = this.history.length - 1;\n this.currentUrl = url;\n\n // Simulate navigation delay\n await new Promise((resolve) => setTimeout(resolve, 100));\n }\n\n async screenshot(options?: ScreenshotOptions): Promise<Buffer> {\n this.runtime.logger.debug('Taking screenshot');\n\n if (options) {\n this.runtime.logger.debug('Screenshot options:', options);\n }\n\n // Mock screenshot - return a fake image buffer\n const mockImage = `Mock screenshot of ${this.currentUrl}`;\n const imageBuffer = Buffer.from(mockImage, 'utf8');\n\n return imageBuffer;\n }\n\n async extractContent(selector?: string): Promise<ExtractedContent> {\n this.runtime.logger.debug(`Extracting content${selector ? ` from ${selector}` : ''}`);\n\n // Mock content extraction based on current URL\n let isGitHub = false;\n let isGoogle = false;\n\n try {\n const url = new URL(this.currentUrl);\n isGitHub = url.hostname === 'github.com' || url.hostname.endsWith('.github.com');\n isGoogle = url.hostname === 'google.com' || url.hostname.endsWith('.google.com');\n } catch (error) {\n // If URL is invalid, default to false for both\n this.runtime.logger.debug('Invalid URL format, defaulting to generic content');\n }\n\n let mockContent: ExtractedContent;\n\n if (isGitHub) {\n mockContent = {\n text: 'Mock GitHub repository content\\n\\nThis is a dummy browser service extracting content from GitHub.\\n\\nFeatures:\\n- Mock code repository\\n- Sample README content\\n- Dummy issue tracking',\n html: '<div class=\"repository-content\"><h1>Mock Repository</h1><p>This is a dummy GitHub repository.</p></div>',\n links: [\n { url: 'https://github.com/mock/repo/issues', text: 'Issues' },\n { url: 'https://github.com/mock/repo/pulls', text: 'Pull Requests' },\n { url: 'https://github.com/mock/repo/wiki', text: 'Wiki' },\n ],\n images: [{ src: 'https://github.com/mock/repo/avatar.png', alt: 'Repository Avatar' }],\n title: 'Mock Repository - GitHub',\n metadata: {\n 'og:title': 'Mock Repository',\n 'og:description': 'A dummy repository for testing',\n 'og:type': 'website',\n },\n };\n } else if (isGoogle) {\n mockContent = {\n text: 'Mock Google search results\\n\\nSearch results for your query:\\n\\n1. Mock Result 1\\n2. Mock Result 2\\n3. Mock Result 3',\n html: '<div class=\"search-results\"><div class=\"result\"><h3>Mock Result 1</h3><p>Mock description</p></div></div>',\n links: [\n { url: 'https://example.com/result1', text: 'Mock Result 1' },\n { url: 'https://example.com/result2', text: 'Mock Result 2' },\n { url: 'https://example.com/result3', text: 'Mock Result 3' },\n ],\n images: [{ src: 'https://google.com/logo.png', alt: 'Google Logo' }],\n title: 'Mock Search - Google',\n metadata: {\n description: 'Mock search results page',\n },\n };\n } else {\n mockContent = {\n text: `Mock content from ${this.currentUrl}\\n\\nThis is dummy content extracted by the browser service.\\n\\nLorem ipsum dolor sit amet, consectetur adipiscing elit.`,\n html: '<div class=\"content\"><h1>Mock Page</h1><p>This is mock content from the dummy browser service.</p></div>',\n links: [\n { url: `${this.currentUrl}/page1`, text: 'Page 1' },\n { url: `${this.currentUrl}/page2`, text: 'Page 2' },\n ],\n images: [{ src: `${this.currentUrl}/image.jpg`, alt: 'Mock Image' }],\n title: 'Mock Page Title',\n metadata: {\n description: 'Mock page description',\n },\n };\n }\n\n return mockContent;\n }\n\n async click(selector: string | ElementSelector, options?: ClickOptions): Promise<void> {\n const selectorStr = typeof selector === 'string' ? selector : selector.selector;\n this.runtime.logger.debug(`Clicking on ${selectorStr}`);\n\n if (options) {\n this.runtime.logger.debug('Click options:', options);\n }\n\n // Simulate click delay\n await new Promise((resolve) => setTimeout(resolve, 50));\n }\n\n async type(selector: string, text: string, options?: TypeOptions): Promise<void> {\n this.runtime.logger.debug(`Typing \"${text}\" into ${selector}`);\n\n if (options) {\n this.runtime.logger.debug('Type options:', options);\n }\n\n // Simulate typing delay\n const delay = options?.delay || 10;\n await new Promise((resolve) => setTimeout(resolve, delay * text.length));\n }\n\n async waitForElement(selector: string | ElementSelector): Promise<void> {\n const selectorStr = typeof selector === 'string' ? selector : selector.selector;\n this.runtime.logger.debug(`Waiting for element ${selectorStr}`);\n\n // Simulate element wait\n await new Promise((resolve) => setTimeout(resolve, 100));\n }\n\n async evaluate<T = any>(script: string, ...args: any[]): Promise<T> {\n this.runtime.logger.debug(`Evaluating script: ${script}`);\n\n // Mock script evaluation\n if (script.includes('document.title')) {\n return 'Mock Page Title' as T;\n }\n\n if (script.includes('window.location.href')) {\n return this.currentUrl as T;\n }\n\n if (script.includes('document.body.innerHTML')) {\n return '<div>Mock page content</div>' as T;\n }\n\n // Default mock result\n return { result: 'mock evaluation result', args } as T;\n }\n\n async getCurrentUrl(): Promise<string> {\n return this.currentUrl;\n }\n\n async goBack(): Promise<void> {\n this.runtime.logger.debug('Going back in history');\n\n if (this.historyIndex > 0) {\n this.historyIndex--;\n this.currentUrl = this.history[this.historyIndex];\n }\n\n await new Promise((resolve) => setTimeout(resolve, 50));\n }\n\n async goForward(): Promise<void> {\n this.runtime.logger.debug('Going forward in history');\n\n if (this.historyIndex < this.history.length - 1) {\n this.historyIndex++;\n this.currentUrl = this.history[this.historyIndex];\n }\n\n await new Promise((resolve) => setTimeout(resolve, 50));\n }\n\n async refresh(): Promise<void> {\n this.runtime.logger.debug('Refreshing page');\n\n // Simulate page refresh\n await new Promise((resolve) => setTimeout(resolve, 100));\n }\n}\n","import { IAgentRuntime } from '@elizaos/core';\nimport {\n ITranscriptionService,\n TranscriptionOptions,\n TranscriptionResult,\n TranscriptionSegment,\n TranscriptionWord,\n SpeechToTextOptions,\n TextToSpeechOptions,\n} from '@elizaos/core';\n\n/**\n * Dummy transcription service for testing purposes\n * Provides mock implementations of transcription operations\n */\nexport class DummyTranscriptionService extends ITranscriptionService {\n static override readonly serviceType = ITranscriptionService.serviceType;\n\n private supportedLanguages = ['en', 'es', 'fr', 'de', 'it', 'pt', 'ru', 'zh', 'ja', 'ko'];\n private availableVoices = [\n { id: 'en-US-male', name: 'John', language: 'en-US', gender: 'male' as const },\n { id: 'en-US-female', name: 'Jane', language: 'en-US', gender: 'female' as const },\n { id: 'es-ES-male', name: 'Carlos', language: 'es-ES', gender: 'male' as const },\n { id: 'fr-FR-female', name: 'Marie', language: 'fr-FR', gender: 'female' as const },\n ];\n\n constructor(runtime: IAgentRuntime) {\n super(runtime);\n }\n\n static async start(runtime: IAgentRuntime): Promise<DummyTranscriptionService> {\n const service = new DummyTranscriptionService(runtime);\n await service.initialize();\n return service;\n }\n\n async initialize(): Promise<void> {\n this.runtime.logger.info('DummyTranscriptionService initialized');\n }\n\n async stop(): Promise<void> {\n this.runtime.logger.info('DummyTranscriptionService stopped');\n }\n\n async transcribeAudio(\n audioPath: string | Buffer,\n options?: TranscriptionOptions\n ): Promise<TranscriptionResult> {\n const filename = Buffer.isBuffer(audioPath) ? 'audio-buffer' : audioPath;\n this.runtime.logger.debug(`Transcribing audio from ${filename}`);\n\n if (options) {\n this.runtime.logger.debug('Transcription options:', options);\n }\n\n // Mock transcription result\n const mockText =\n 'Hello, this is a mock transcription from the dummy service. The audio has been processed and converted to text. This demonstrates the transcription capabilities of the system.';\n\n const words: TranscriptionWord[] = mockText.split(' ').map((word, index) => ({\n word: word.replace(/[.,!?]/, ''),\n start: index * 0.5,\n end: (index + 1) * 0.5,\n confidence: 0.9 + Math.random() * 0.1,\n }));\n\n const segments: TranscriptionSegment[] = [\n {\n id: 0,\n text: 'Hello, this is a mock transcription from the dummy service.',\n start: 0,\n end: 5,\n confidence: 0.95,\n temperature: 0.0,\n avg_logprob: -0.1,\n compression_ratio: 1.2,\n no_speech_prob: 0.01,\n },\n {\n id: 1,\n text: 'The audio has been processed and converted to text.',\n start: 5,\n end: 10,\n confidence: 0.92,\n temperature: 0.0,\n avg_logprob: -0.12,\n compression_ratio: 1.1,\n no_speech_prob: 0.02,\n },\n {\n id: 2,\n text: 'This demonstrates the transcription capabilities of the system.',\n start: 10,\n end: 15,\n confidence: 0.89,\n temperature: 0.0,\n avg_logprob: -0.15,\n compression_ratio: 1.3,\n no_speech_prob: 0.03,\n },\n ];\n\n return {\n text: mockText,\n language: options?.language || 'en',\n duration: 15,\n segments: options?.response_format === 'verbose_json' ? segments : undefined,\n words: options?.word_timestamps ? words : undefined,\n confidence: 0.92,\n };\n }\n\n async transcribeVideo(\n videoPath: string | Buffer,\n options?: TranscriptionOptions\n ): Promise<TranscriptionResult> {\n const filename = Buffer.isBuffer(videoPath) ? 'video-buffer' : videoPath;\n this.runtime.logger.debug(`Transcribing video from ${filename}`);\n\n // For video, we simulate extracting audio first, then transcribing\n const mockText =\n \"This is a mock transcription from a video file. The video's audio track has been extracted and processed. The speaker discusses various topics including technology, AI, and automation systems.\";\n\n const words: TranscriptionWord[] = mockText.split(' ').map((word, index) => ({\n word: word.replace(/[.,!?]/, ''),\n start: index * 0.6,\n end: (index + 1) * 0.6,\n confidence: 0.85 + Math.random() * 0.15,\n }));\n\n return {\n text: mockText,\n language: options?.language || 'en',\n duration: 20,\n words: options?.word_timestamps ? words : undefined,\n confidence: 0.88,\n };\n }\n\n async speechToText(\n audioStream: NodeJS.ReadableStream | Buffer,\n options?: SpeechToTextOptions\n ): Promise<TranscriptionResult> {\n this.runtime.logger.debug('Processing real-time speech to text');\n\n if (options) {\n this.runtime.logger.debug('Speech to text options:', options);\n }\n\n // Mock real-time transcription\n const mockText =\n 'Real-time speech recognition is working. This is a continuous transcription from the audio stream.';\n\n return {\n text: mockText,\n language: options?.language || 'en',\n duration: 5,\n confidence: 0.85,\n };\n }\n\n async textToSpeech(text: string, options?: TextToSpeechOptions): Promise<Buffer> {\n this.runtime.logger.debug(`Converting text to speech: \"${text.substring(0, 50)}...\"`);\n\n if (options) {\n this.runtime.logger.debug('Text to speech options:', options);\n }\n\n // Mock audio generation\n const mockAudioData = `Mock audio data for: ${text}`;\n const audioBuffer = Buffer.from(mockAudioData, 'utf8');\n\n // Simulate processing time based on text length\n await new Promise((resolve) => setTimeout(resolve, Math.min(text.length * 10, 1000)));\n\n return audioBuffer;\n }\n\n async getSupportedLanguages(): Promise<string[]> {\n return [...this.supportedLanguages];\n }\n\n async getAvailableVoices(): Promise<\n Array<{\n id: string;\n name: string;\n language: string;\n gender?: 'male' | 'female' | 'neutral';\n }>\n > {\n return [...this.availableVoices];\n }\n\n async detectLanguage(audioPath: string | Buffer): Promise<string> {\n const filename = Buffer.isBuffer(audioPath) ? 'audio-buffer' : audioPath;\n this.runtime.logger.debug(`Detecting language from ${filename}`);\n\n // Mock language detection - randomly pick a supported language\n const randomLanguage =\n this.supportedLanguages[Math.floor(Math.random() * this.supportedLanguages.length)];\n\n // Simulate processing time\n await new Promise((resolve) => setTimeout(resolve, 100));\n\n return randomLanguage;\n }\n}\n","import { IAgentRuntime } from '@elizaos/core';\nimport {\n IWebSearchService,\n SearchOptions,\n SearchResult,\n SearchResponse,\n NewsSearchOptions,\n ImageSearchOptions,\n VideoSearchOptions,\n} from '@elizaos/core';\n\n/**\n * Dummy web search service for testing purposes\n * Provides mock implementations of web search operations\n */\nexport class DummyWebSearchService extends IWebSearchService {\n static override readonly serviceType = IWebSearchService.serviceType;\n\n private trendingSearches = [\n 'artificial intelligence',\n 'machine learning',\n 'blockchain technology',\n 'climate change',\n 'space exploration',\n 'quantum computing',\n 'renewable energy',\n 'cybersecurity',\n 'biotechnology',\n 'autonomous vehicles',\n ];\n\n constructor(runtime: IAgentRuntime) {\n super(runtime);\n }\n\n static async start(runtime: IAgentRuntime): Promise<DummyWebSearchService> {\n const service = new DummyWebSearchService(runtime);\n await service.initialize();\n return service;\n }\n\n async initialize(): Promise<void> {\n this.runtime.logger.info('DummyWebSearchService initialized');\n }\n\n async stop(): Promise<void> {\n this.runtime.logger.info('DummyWebSearchService stopped');\n }\n\n async search(query: string, options?: SearchOptions): Promise<SearchResponse> {\n this.runtime.logger.debug(`Searching for: \"${query}\"`);\n\n if (options) {\n this.runtime.logger.debug('Search options:', options);\n }\n\n // Mock search results\n const results: SearchResult[] = [\n {\n title: `${query} - Comprehensive Guide`,\n url: `https://example.com/guide/${query.replace(/\\s+/g, '-')}`,\n description: `A comprehensive guide about ${query}. This mock result provides detailed information and explanations about the topic.`,\n displayUrl: 'example.com',\n thumbnail: 'https://example.com/thumbnail1.jpg',\n publishedDate: new Date('2024-01-15'),\n source: 'Example Guide',\n relevanceScore: 0.95,\n snippet: `Learn everything about ${query} with this detailed guide...`,\n },\n {\n title: `${query} - Latest News and Updates`,\n url: `https://news.example.com/latest/${query.replace(/\\s+/g, '-')}`,\n description: `Stay updated with the latest news about ${query}. Recent developments, trends, and insights.`,\n displayUrl: 'news.example.com',\n thumbnail: 'https://news.example.com/thumbnail2.jpg',\n publishedDate: new Date('2024-01-10'),\n source: 'Example News',\n relevanceScore: 0.88,\n snippet: `Breaking news about ${query}: Recent developments show...`,\n },\n {\n title: `${query} - Wikipedia`,\n url: `https://en.wikipedia.org/wiki/${query.replace(/\\s+/g, '_')}`,\n description: `Wikipedia article about ${query}. Comprehensive information from the free encyclopedia.`,\n displayUrl: 'en.wikipedia.org',\n publishedDate: new Date('2023-12-01'),\n source: 'Wikipedia',\n relevanceScore: 0.82,\n snippet: `${query} is a topic that encompasses various aspects...`,\n },\n ];\n\n return {\n query,\n results,\n totalResults: 156789,\n searchTime: 0.42,\n suggestions: [\n `${query} tutorial`,\n `${query} examples`,\n `${query} best practices`,\n `${query} 2024`,\n ],\n relatedSearches: [\n `what is ${query}`,\n `how to ${query}`,\n `${query} vs alternatives`,\n `${query} benefits`,\n ],\n };\n }\n\n async searchNews(query: string, options?: NewsSearchOptions): Promise<SearchResponse> {\n this.runtime.logger.debug(`Searching news for: \"${query}\"`);\n\n if (options) {\n this.runtime.logger.debug('News search options:', options);\n }\n\n // Mock news results\n const results: SearchResult[] = [\n {\n title: `Breaking: ${query} Makes Headlines`,\n url: `https://news.example.com/breaking/${query.replace(/\\s+/g, '-')}`,\n description: `Latest breaking news about ${query}. Important developments that are making headlines today.`,\n displayUrl: 'news.example.com',\n thumbnail: 'https://news.example.com/breaking.jpg',\n publishedDate: new Date(Date.now() - 3600000), // 1 hour ago\n source: 'Example News',\n relevanceScore: 0.93,\n },\n {\n title: `${query}: Analysis and Commentary`,\n url: `https://analysis.example.com/commentary/${query.replace(/\\s+/g, '-')}`,\n description: `Expert analysis and commentary on ${query}. In-depth perspectives from industry leaders.`,\n displayUrl: 'analysis.example.com',\n thumbnail: 'https://analysis.example.com/analysis.jpg',\n publishedDate: new Date(Date.now() - 7200000), // 2 hours ago\n source: 'Example Analysis',\n relevanceScore: 0.87,\n },\n ];\n\n return {\n query,\n results,\n totalResults: 12345,\n searchTime: 0.28,\n suggestions: [`${query} news`, `${query} headlines`, `${query} updates`],\n };\n }\n\n async searchImages(query: string, options?: ImageSearchOptions): Promise<SearchResponse> {\n this.runtime.logger.debug(`Searching images for: \"${query}\"`);\n\n if (options) {\n this.runtime.logger.debug('Image search options:', options);\n }\n\n // Mock image results\n const results: SearchResult[] = Array.from({ length: 12 }, (_, i) => ({\n title: `${query} Image ${i + 1}`,\n url: `https://images.example.com/${query.replace(/\\s+/g, '-')}-${i + 1}.jpg`,\n description: `High-quality image of ${query}. Perfect for various uses and applications.`,\n displayUrl: 'images.example.com',\n thumbnail: `https://images.example.com/thumb/${query.replace(/\\s+/g, '-')}-${i + 1}.jpg`,\n source: 'Example Images',\n relevanceScore: 0.9 - i * 0.05,\n }));\n\n return {\n query,\n results,\n totalResults: 45678,\n searchTime: 0.35,\n };\n }\n\n async searchVideos(query: string, options?: VideoSearchOptions): Promise<SearchResponse> {\n this.runtime.logger.debug(`Searching videos for: \"${query}\"`);\n\n if (options) {\n this.runtime.logger.debug('Video search options:', options);\n }\n\n // Mock video results\n const results: SearchResult[] = [\n {\n title: `${query} - Complete Tutorial`,\n url: `https://video.example.com/tutorial/${query.replace(/\\s+/g, '-')}`,\n description: `Complete tutorial about ${query}. Step-by-step guide with examples and demonstrations.`,\n displayUrl: 'video.example.com',\n thumbnail: `https://video.example.com/thumb/tutorial-${query.replace(/\\s+/g, '-')}.jpg`,\n publishedDate: new Date('2024-01-05'),\n source: 'Example Video',\n relevanceScore: 0.91,\n },\n {\n title: `${query} Explained in 5 Minutes`,\n url: `https://video.example.com/quick/${query.replace(/\\s+/g, '-')}`,\n description: `Quick explanation of ${query} in just 5 minutes. Perfect for beginners and quick reference.`,\n displayUrl: 'video.example.com',\n thumbnail: `https://video.example.com/thumb/quick-${query.replace(/\\s+/g, '-')}.jpg`,\n publishedDate: new Date('2024-01-03'),\n source: 'Example Video',\n relevanceScore: 0.86,\n },\n ];\n\n return {\n query,\n results,\n totalResults: 8765,\n searchTime: 0.31,\n };\n }\n\n async getSuggestions(query: string): Promise<string[]> {\n this.runtime.logger.debug(`Getting suggestions for: \"${query}\"`);\n\n // Mock suggestions based on query\n const suggestions = [\n `${query} tutorial`,\n `${query} guide`,\n `${query} examples`,\n `${query} best practices`,\n `${query} vs alternatives`,\n `how to ${query}`,\n `what is ${query}`,\n `${query} 2024`,\n ];\n\n return suggestions;\n }\n\n async getTrendingSearches(region?: string): Promise<string[]> {\n this.runtime.logger.debug(`Getting trending searches for region: ${region || 'global'}`);\n\n // Return shuffled trending searches\n return [...this.trendingSearches].sort(() => Math.random() - 0.5);\n }\n\n async getPageInfo(url: string): Promise<{\n title: string;\n description: string;\n content: string;\n metadata: Record<string, string>;\n images: string[];\n links: string[];\n }> {\n this.runtime.logger.debug(`Getting page info for: ${url}`);\n\n // Mock page information\n const domain = new URL(url).hostname;\n\n return {\n title: `Mock Page Title - ${domain}`,\n description: `This is a mock page description for ${url}. It provides detailed information about the page content.`,\n content: `Mock page content from ${url}.\\n\\nThis is a comprehensive analysis of the page including:\\n- Main content sections\\n- Important information\\n- Key topics covered\\n- Related resources\\n\\nThe page provides valuable insights and information for users interested in the topic.`,\n metadata: {\n 'og:title': `Mock Page Title - ${domain}`,\n 'og:description': `Mock page description for ${url}`,\n 'og:type': 'website',\n 'og:url': url,\n 'og:image': `${url}/og-image.jpg`,\n 'twitter:card': 'summary_large_image',\n 'twitter:title': `Mock Page Title - ${domain}`,\n 'twitter:description': `Mock page description for ${url}`,\n author: 'Mock Author',\n keywords: 'mock, page, content, analysis',\n },\n images: [`${url}/image1.jpg`, `${url}/image2.jpg`, `${url}/banner.jpg`],\n links: [\n `${url}/page1`,\n `${url}/page2`,\n `${url}/contact`,\n `${url}/about`,\n 'https://external-link.com',\n ],\n };\n }\n}\n","import { IAgentRuntime } from '@elizaos/core';\nimport {\n IEmailService,\n EmailAddress,\n EmailAttachment,\n EmailMessage,\n EmailSendOptions,\n EmailSearchOptions,\n EmailFolder,\n EmailAccount,\n} from '@elizaos/core';\n\n/**\n * Dummy email service for testing purposes\n * Provides mock implementations of email operations\n */\nexport class DummyEmailService extends IEmailService {\n static override readonly serviceType = IEmailService.serviceType;\n\n private mockEmails: EmailMessage[] = [];\n private mockFolders: EmailFolder[] = [\n {\n name: 'Inbox',\n path: 'INBOX',\n type: 'inbox',\n messageCount: 15,\n unreadCount: 3,\n },\n {\n name: 'Sent',\n path: 'SENT',\n type: 'sent',\n messageCount: 8,\n unreadCount: 0,\n },\n {\n name: 'Drafts',\n path: 'DRAFTS',\n type: 'drafts',\n messageCount: 2,\n unreadCount: 0,\n },\n {\n name: 'Trash',\n path: 'TRASH',\n type: 'trash',\n messageCount: 5,\n unreadCount: 0,\n },\n ];\n\n constructor(runtime: IAgentRuntime) {\n super(runtime);\n this.initializeMockEmails();\n }\n\n static async start(runtime: IAgentRuntime): Promise<DummyEmailService> {\n const service = new DummyEmailService(runtime);\n await service.initialize();\n return service;\n }\n\n async initialize(): Promise<void> {\n this.runtime.logger.info('DummyEmailService initialized');\n }\n\n async stop(): Promise<void> {\n this.runtime.logger.info('DummyEmailService stopped');\n }\n\n private initializeMockEmails(): void {\n this.mockEmails = [\n {\n from: { email: 'alice@example.com', name: 'Alice Smith' },\n to: [{ email: 'user@example.com', name: 'User' }],\n subject: 'Project Update',\n text: \"Hi! Just wanted to update you on the project progress. We've completed the first phase and are moving to the next milestone.\",\n date: new Date('2024-01-15T10:30:00Z'),\n messageId: 'msg-001',\n },\n {\n from: { email: 'bob@company.com', name: 'Bob Johnson' },\n to: [{ email: 'user@example.com', name: 'User' }],\n cc: [{ email: 'team@company.com', name: 'Team' }],\n subject: 'Meeting Tomorrow',\n text: \"Don't forget about our meeting tomorrow at 2 PM. We'll be discussing the quarterly results.\",\n date: new Date('2024-01-14T14:15:00Z'),\n messageId: 'msg-002',\n },\n {\n from: { email: 'newsletter@tech.com', name: 'Tech Newsletter' },\n to: [{ email: 'user@example.com', name: 'User' }],\n subject: 'Weekly Tech Update',\n html: '<h1>This Week in Tech</h1><p>Latest technology news and updates.</p>',\n text: 'This Week in Tech\\n\\nLatest technology news and updates.',\n date: new Date('2024-01-13T09:00:00Z'),\n messageId: 'msg-003',\n },\n ];\n }\n\n async sendEmail(message: EmailMessage, options?: EmailSendOptions): Promise<string> {\n this.runtime.logger.debug(`Sending email to ${message.to.map((t) => t.email).join(', ')}`);\n this.runtime.logger.debug(`Subject: ${message.subject}`);\n\n if (options) {\n this.runtime.logger.debug('Send options:', options);\n }\n\n // Generate a mock message ID\n const messageId = `mock-${Date.now()}-${Math.random().toString(36).substring(2, 9)}`;\n\n // Add to mock emails\n this.mockEmails.push({\n ...message,\n messageId,\n date: new Date(),\n });\n\n // Simulate sending delay\n await new Promise((resolve) => setTimeout(resolve, 100));\n\n return messageId;\n }\n\n async getEmails(options?: EmailSearchOptions): Promise<EmailMessage[]> {\n this.runtime.logger.debug('Getting emails');\n\n if (options) {\n this.runtime.logger.debug('Search options:', options);\n }\n\n let filteredEmails = [...this.mockEmails];\n\n // Apply filters\n if (options?.from) {\n filteredEmails = filteredEmails.filter(\n (email) =>\n email.from.email.includes(options.from!) || email.from.name?.includes(options.from!)\n );\n }\n\n if (options?.subject) {\n filteredEmails = filteredEmails.filter((email) =>\n email.subject.toLowerCase().includes(options.subject!.toLowerCase())\n );\n }\n\n if (options?.since) {\n filteredEmails = filteredEmails.filter((email) => email.date && email.date >= options.since!);\n }\n\n if (options?.before) {\n filteredEmails = filteredEmails.filter(\n (email) => email.date && email.date <= options.before!\n );\n }\n\n // Apply pagination\n const offset = options?.offset || 0;\n const limit = options?.limit || 50;\n\n return filteredEmails.slice(offset, offset + limit);\n }\n\n async getEmail(messageId: string): Promise<EmailMessage> {\n this.runtime.logger.debug(`Getting email with ID: ${messageId}`);\n\n const email = this.mockEmails.find((e) => e.messageId === messageId);\n if (!email) {\n throw new Error(`Email with ID ${messageId} not found`);\n }\n\n return email;\n }\n\n async deleteEmail(messageId: string): Promise<void> {\n this.runtime.logger.debug(`Deleting email with ID: ${messageId}`);\n\n const index = this.mockEmails.findIndex((e) => e.messageId === messageId);\n if (index === -1) {\n throw new Error(`Email with ID ${messageId} not found`);\n }\n\n this.mockEmails.splice(index, 1);\n }\n\n async markEmailAsRead(messageId: string, read: boolean): Promise<void> {\n this.runtime.logger.debug(`Marking email ${messageId} as ${read ? 'read' : 'unread'}`);\n\n const email = this.mockEmails.find((e) => e.messageId === messageId);\n if (!email) {\n throw new Error(`Email with ID ${messageId} not found`);\n }\n\n // In a real implementation, this would update email flags\n // For mock purposes, we just log the action\n }\n\n async flagEmail(messageId: string, flagged: boolean): Promise<void> {\n this.runtime.logger.debug(`${flagged ? 'Flagging' : 'Unflagging'} email ${messageId}`);\n\n const email = this.mockEmails.find((e) => e.messageId === messageId);\n if (!email) {\n throw new Error(`Email with ID ${messageId} not found`);\n }\n\n // In a real implementation, this would update email flags\n // For mock purposes, we just log the action\n }\n\n async moveEmail(messageId: string, folderPath: string): Promise<void> {\n this.runtime.logger.debug(`Moving email ${messageId} to folder ${folderPath}`);\n\n const email = this.mockEmails.find((e) => e.messageId === messageId);\n if (!email) {\n throw new Error(`Email with ID ${messageId} not found`);\n }\n\n const folder = this.mockFolders.find((f) => f.path === folderPath);\n if (!folder) {\n throw new Error(`Folder ${folderPath} not found`);\n }\n\n // In a real implementation, this would move the email\n // For mock purposes, we just log the action\n }\n\n async getFolders(): Promise<EmailFolder[]> {\n this.runtime.logger.debug('Getting email folders');\n return [...this.mockFolders];\n }\n\n async createFolder(folderName: string, parentPath?: string): Promise<void> {\n this.runtime.logger.debug(\n `Creating folder ${folderName}${parentPath ? ` under ${parentPath}` : ''}`\n );\n\n const newFolder: EmailFolder = {\n name: folderName,\n path: parentPath ? `${parentPath}/${folderName}` : folderName,\n type: 'custom',\n messageCount: 0,\n unreadCount: 0,\n };\n\n this.mockFolders.push(newFolder);\n }\n\n async getAccountInfo(): Promise<EmailAccount> {\n this.runtime.logger.debug('Getting account info');\n\n return {\n email: 'user@example.com',\n name: 'Mock User',\n provider: 'MockProvider',\n folders: [...this.mockFolders],\n quotaUsed: 512000000, // 512 MB\n quotaLimit: 1073741824, // 1 GB\n };\n }\n\n async searchEmails(query: string, options?: EmailSearchOptions): Promise<EmailMessage[]> {\n this.runtime.logger.debug(`Searching emails with query: \"${query}\"`);\n\n if (options) {\n this.runtime.logger.debug('Search options:', options);\n }\n\n const filteredEmails = this.mockEmails.filter((email) => {\n const searchText = `${email.subject} ${email.text || ''} ${email.html || ''} ${email.from.name || ''} ${email.from.email}`;\n return searchText.toLowerCase().includes(query.toLowerCase());\n });\n\n // Apply additional filters from options\n let results = filteredEmails;\n\n if (options?.from) {\n results = results.filter(\n (email) =>\n email.from.email.includes(options.from!) || email.from.name?.includes(options.from!)\n );\n }\n\n if (options?.since) {\n results = results.filter((email) => email.date && email.date >= options.since!);\n }\n\n if (options?.before) {\n results = results.filter((email) => email.date && email.date <= options.before!);\n }\n\n // Apply pagination\n const offset = options?.offset || 0;\n const limit = options?.limit || 50;\n\n return results.slice(offset, offset + limit);\n }\n}\n","import type { IAgentRuntime, TestSuite, IWalletService } from '@elizaos/core';\nimport { ILpService, ServiceType } from '@elizaos/core';\nimport { strict as assert } from 'node:assert';\nimport { DummyLpService } from '../lp/service';\nimport { DummyTokenDataService } from '../tokenData/service';\nimport { DummyWalletService } from '../wallet/service';\nimport { setupScenario } from './test-utils';\n\nexport const dummyServicesScenariosSuite: TestSuite = {\n name: 'Dummy Services Plugin E2E Scenarios',\n tests: [\n {\n name: 'Scenario 1: Should initialize dummy services and verify they are available',\n fn: async (runtime: IAgentRuntime) => {\n console.log('Testing dummy services initialization...');\n\n // Check DummyLpService\n const lpService = runtime.getService<DummyLpService>(ILpService.serviceType);\n assert(lpService, 'DummyLpService not found in runtime');\n assert.equal(\n lpService.getDexName(),\n 'dummy',\n 'DummyLpService should have correct DEX name'\n );\n\n // Check DummyTokenDataService\n const tokenDataService = runtime.getService<DummyTokenDataService>(\n DummyTokenDataService.serviceType\n );\n assert(tokenDataService, 'DummyTokenDataService not found in runtime');\n\n console.log('Successfully verified both dummy services are initialized and available.');\n },\n },\n {\n name: 'Scenario 2: Should fetch pools from DummyLpService',\n fn: async (runtime: IAgentRuntime) => {\n const lpService = runtime.getService<DummyLpService>(ILpService.serviceType);\n assert(lpService, 'DummyLpService not found');\n\n console.log('Fetching all pools from DummyLpService...');\n const allPools = await lpService.getPools();\n assert(Array.isArray(allPools), 'getPools should return an array');\n assert.equal(allPools.length, 2, 'Should return 2 dummy pools');\n\n // Verify pool structure\n const pool1 = allPools.find((p) => p.id === 'dummy-pool-1');\n assert(pool1, 'dummy-pool-1 should exist');\n assert.equal(pool1.dex, 'dummy', 'Pool should have correct DEX');\n assert.equal(pool1.tokenA.symbol, 'SOL', 'Pool should have SOL as tokenA');\n assert.equal(pool1.tokenB.symbol, 'USDC', 'Pool should have USDC as tokenB');\n assert.equal(pool1.tvl, 1234567.89, 'Pool should have correct TVL');\n\n console.log('Successfully fetched and verified pool data.');\n },\n },\n {\n name: 'Scenario 3: Should filter pools by token mint',\n fn: async (runtime: IAgentRuntime) => {\n const lpService = runtime.getService<DummyLpService>(ILpService.serviceType);\n assert(lpService, 'DummyLpService not found');\n\n const solMint = 'So11111111111111111111111111111111111111112';\n console.log(`Filtering pools containing SOL (${solMint})...`);\n\n const solPools = await lpService.getPools(solMint);\n assert(Array.isArray(solPools), 'getPools with filter should return an array');\n assert(solPools.length > 0, 'Should find pools containing SOL');\n\n // Verify all returned pools contain SOL\n solPools.forEach((pool) => {\n const containsSol = pool.tokenA.mint === solMint || pool.tokenB.mint === solMint;\n assert(containsSol, `Pool ${pool.id} should contain SOL`);\n });\n\n console.log(`Found ${solPools.length} pools containing SOL.`);\n },\n },\n {\n name: 'Scenario 4: Should add liquidity to a dummy pool',\n fn: async (runtime: IAgentRuntime) => {\n const lpService = runtime.getService<DummyLpService>(ILpService.serviceType);\n assert(lpService, 'DummyLpService not found');\n\n // Create a mock vault object\n const mockVault = { publicKey: 'dummy-public-key', secretKey: 'dummy-secret-key' };\n\n console.log('Testing add liquidity to dummy-pool-1...');\n const result = await lpService.addLiquidity({\n userVault: mockVault,\n poolId: 'dummy-pool-1',\n tokenAAmountLamports: '1000000000', // 1 SOL\n slippageBps: 100, // 1% slippage\n });\n\n assert.equal(result.success, true, 'Add liquidity should succeed');\n assert(result.transactionId, 'Should have a transaction ID');\n assert.match(result.transactionId, /^dummy-tx-/, 'Transaction ID should have dummy prefix');\n assert(result.lpTokensReceived, 'Should receive LP tokens');\n assert.equal(\n result.lpTokensReceived?.symbol,\n 'DUMMY-LP',\n 'LP token should have correct symbol'\n );\n assert.equal(\n result.lpTokensReceived?.address,\n 'dummy-lp-mint-dummy-pool-1',\n 'LP token should have correct address'\n );\n\n console.log('Successfully added liquidity:', result);\n },\n },\n {\n name: 'Scenario 5: Should remove liquidity from a dummy pool',\n fn: async (runtime: IAgentRuntime) => {\n const lpService = runtime.getService<DummyLpService>(ILpService.serviceType);\n assert(lpService, 'DummyLpService not found');\n\n // Create a mock vault object\n const mockVault = { publicKey: 'dummy-public-key-2', secretKey: 'dummy-secret-key-2' };\n\n console.log('Testing remove liquidity from dummy-pool-1...');\n const result = await lpService.removeLiquidity({\n userVault: mockVault,\n poolId: 'dummy-pool-1',\n lpTokenAmountLamports: '1000000', // 1 LP token\n slippageBps: 50, // 0.5% slippage\n });\n\n assert.equal(result.success, true, 'Remove liquidity should succeed');\n assert(result.transactionId, 'Should have a transaction ID');\n assert.match(result.transactionId, /^dummy-tx-/, 'Transaction ID should have dummy prefix');\n assert(result.tokensReceived, 'Should receive tokens');\n assert.equal(result.tokensReceived.length, 2, 'Should receive 2 tokens');\n\n // Verify underlying tokens\n const solToken = result.tokensReceived.find((t) => t.symbol === 'SOL');\n const usdcToken = result.tokensReceived.find((t) => t.symbol === 'USDC');\n assert(solToken, 'Should receive SOL');\n assert(usdcToken, 'Should receive USDC');\n assert.equal(solToken.uiAmount, 0.5, 'Should receive 0.5 SOL');\n assert.equal(usdcToken.uiAmount, 500, 'Should receive 500 USDC');\n\n console.log('Successfully removed liquidity:', result);\n },\n },\n {\n name: 'Scenario 6: Should get LP position details',\n fn: async (runtime: IAgentRuntime) => {\n const lpService = runtime.getService<DummyLpService>(ILpService.serviceType);\n assert(lpService, 'DummyLpService not found');\n\n const userPublicKey = 'HtiYLjY9dGMrmpwjDcGmxQCo2VsCCAQiBgt5xPLanTJa';\n const lpMint = 'dummy-lp-mint-dummy-pool-1';\n\n console.log(`Getting LP position details for user ${userPublicKey}...`);\n const position = await lpService.getLpPositionDetails(userPublicKey, lpMint);\n\n assert(position, 'Should return LP position details');\n assert.equal(position.poolId, 'dummy-pool-1', 'Position should reference correct pool');\n assert.equal(position.dex, 'dummy', 'Position should have correct DEX');\n assert.equal(position.valueUsd, 1000, 'Position should have correct USD value');\n\n // Verify LP token balance\n assert(position.lpTokenBalance, 'Should have LP token balance');\n assert.equal(\n position.lpTokenBalance.symbol,\n 'DUMMY-LP',\n 'LP token should have correct symbol'\n );\n assert.equal(position.lpTokenBalance.uiAmount, 100, 'Should have 100 LP tokens');\n\n // Verify underlying tokens\n assert(position.underlyingTokens, 'Should have underlying tokens');\n assert.equal(position.underlyingTokens.length, 2, 'Should have 2 underlying tokens');\n\n const sol = position.underlyingTokens.find((t) => t.symbol === 'SOL');\n const usdc = position.underlyingTokens.find((t) => t.symbol === 'USDC');\n assert(sol, 'Should have SOL in underlying tokens');\n assert(usdc, 'Should have USDC in underlying tokens');\n assert.equal(sol.uiAmount, 0.5, 'Should have 0.5 SOL');\n assert.equal(usdc.uiAmount, 500, 'Should have 500 USDC');\n\n console.log('Successfully retrieved LP position details:', position);\n },\n },\n {\n name: 'Scenario 7: Should get market data for pools',\n fn: async (runtime: IAgentRuntime) => {\n const lpService = runtime.getService<DummyLpService>(ILpService.serviceType);\n assert(lpService, 'DummyLpService not found');\n\n const poolIds = ['dummy-pool-1', 'dummy-stable-pool-2'];\n console.log(`Getting market data for pools: ${poolIds.join(', ')}...`);\n\n const marketData = await lpService.getMarketDataForPools(poolIds);\n assert(marketData, 'Should return market data');\n assert.equal(Object.keys(marketData).length, 2, 'Should have data for 2 pools');\n\n // Verify market data structure\n poolIds.forEach((poolId) => {\n const data = marketData[poolId];\n assert(data, `Should have market data for ${poolId}`);\n assert(typeof data.tvl === 'number', 'Should have TVL');\n assert(typeof data.apy === 'number', 'Should have APY');\n assert(typeof data.apr === 'number', 'Should have APR');\n\n // Verify reasonable ranges\n assert(data.tvl >= 0, 'TVL should be non-negative');\n assert(data.apy >= 0 && data.apy <= 1, 'APY should be between 0 and 1');\n assert(data.apr >= 0 && data.apr <= 1, 'APR should be between 0 and 1');\n });\n\n console.log('Successfully retrieved market data:', marketData);\n },\n },\n {\n name: 'Scenario 8: Should fetch token data from DummyTokenDataService',\n fn: async (runtime: IAgentRuntime) => {\n const tokenDataService = runtime.getService<DummyTokenDataService>(\n DummyTokenDataService.serviceType\n );\n assert(tokenDataService, 'DummyTokenDataService not found');\n\n const solMint = 'So11111111111111111111111111111111111111112';\n console.log(`Fetching token data for SOL (${solMint})...`);\n\n const tokenData = await tokenDataService.getTokenDetails(solMint, 'solana');\n assert(tokenData, 'Should return token data');\n assert(tokenData.symbol, 'Should have symbol');\n assert(tokenData.name, 'Should have name');\n assert.equal(tokenData.decimals, 18, 'Should have decimals');\n assert(typeof tokenData.price === 'number', 'Should have price');\n\n console.log('Successfully fetched token data:', tokenData);\n },\n },\n {\n name: 'Scenario 9: Should test trending tokens',\n fn: async (runtime: IAgentRuntime) => {\n const tokenDataService = runtime.getService<DummyTokenDataService>(\n DummyTokenDataService.serviceType\n );\n assert(tokenDataService, 'DummyTokenDataService not found');\n\n console.log('Fetching trending tokens...');\n\n const trendingTokens = await tokenDataService.getTrendingTokens('solana', 5);\n assert(Array.isArray(trendingTokens), 'Should return array of trending tokens');\n assert.equal(trendingTokens.length, 5, 'Should return requested number of tokens');\n\n trendingTokens.forEach((token, i) => {\n assert(token.symbol, `Token ${i} should have symbol`);\n assert(token.name, `Token ${i} should have name`);\n assert(typeof token.price === 'number', `Token ${i} should have price`);\n });\n\n console.log('Successfully fetched trending tokens.');\n },\n },\n {\n name: 'Scenario 10: Integration test - LP service with custom pool configuration',\n fn: async (runtime: IAgentRuntime) => {\n const lpService = runtime.getService<DummyLpService>(ILpService.serviceType);\n assert(lpService, 'DummyLpService not found');\n\n // Test that we can work with both pools\n console.log('Testing integration with multiple pools...');\n\n // Get all pools\n const allPools = await lpService.getPools();\n assert.equal(allPools.length, 2, 'Should have 2 pools');\n\n // Test operations on each pool\n for (const pool of allPools) {\n console.log(`Testing operations on pool ${pool.id}...`);\n\n // Add liquidity\n const addResult = await lpService.addLiquidity({\n userVault: {} as any,\n poolId: pool.id,\n tokenAAmountLamports: '1000000000',\n slippageBps: 100,\n });\n assert.equal(addResult.success, true, `Add liquidity should succeed for ${pool.id}`);\n\n // Remove liquidity\n const removeResult = await lpService.removeLiquidity({\n userVault: {} as any,\n poolId: pool.id,\n lpTokenAmountLamports: '1000000',\n slippageBps: 50,\n });\n assert.equal(\n removeResult.success,\n true,\n `Remove liquidity should succeed for ${pool.id}`\n );\n }\n\n console.log('Successfully tested operations on all pools.');\n },\n },\n {\n name: 'Scenario 11: Should initialize wallet service and verify functionality',\n fn: async (runtime: IAgentRuntime) => {\n console.log('Testing wallet service initialization...');\n\n // Check DummyWalletService\n const walletService = runtime.getService<DummyWalletService>(ServiceType.WALLET);\n assert(walletService, 'DummyWalletService not found in runtime');\n\n // Test initial balance\n const initialBalance = await walletService.getBalance('USDC');\n assert.equal(initialBalance, 10000, 'Should have initial USDC balance of 10000');\n\n console.log('Successfully verified wallet service is initialized.');\n },\n },\n {\n name: 'Scenario 12: Should test wallet operations',\n fn: async (runtime: IAgentRuntime) => {\n const walletService = runtime.getService<DummyWalletService>(ServiceType.WALLET);\n assert(walletService, 'DummyWalletService not found');\n\n console.log('Testing wallet operations...');\n\n // Add funds\n await walletService.addFunds('SOL', 5);\n const solBalance = await walletService.getBalance('SOL');\n assert.equal(solBalance, 5, 'Should have 5 SOL after adding funds');\n\n // Get portfolio\n const portfolio = await walletService.getPortfolio();\n assert(portfolio.totalValueUsd > 0, 'Portfolio should have positive total value');\n assert(Array.isArray(portfolio.assets), 'Portfolio should have assets array');\n assert(portfolio.assets.length >= 2, 'Portfolio should have at least 2 assets');\n\n // Find SOL in portfolio\n const solAsset = portfolio.assets.find((a) => a.symbol === 'SOL');\n assert(solAsset, 'SOL should be in portfolio');\n assert.equal(solAsset.balance, '5', 'SOL balance string should be \"5\"');\n\n console.log('Successfully tested wallet operations.');\n },\n },\n {\n name: 'Scenario 13: Should test SOL transfers',\n fn: async (runtime: IAgentRuntime) => {\n const walletService = runtime.getService<DummyWalletService>(ServiceType.WALLET);\n assert(walletService, 'DummyWalletService not found');\n\n console.log('Testing SOL transfer functionality...');\n\n // Reset wallet to ensure clean state\n await walletService.resetWallet(10000, 'USDC');\n\n // Add SOL to wallet\n await walletService.addFunds('SOL', 10);\n\n // Transfer some SOL\n const txHash = await walletService.transferSol('dummy-from', 'dummy-to', 3e9); // 3 SOL\n assert(txHash, 'Should return transaction hash');\n assert.match(txHash, /^dummy-tx-/, 'Transaction hash should have dummy prefix');\n\n // Check remaining balance\n const remainingBalance = await walletService.getBalance('SOL');\n assert.equal(remainingBalance, 7, 'Should have 7 SOL remaining after transfer');\n\n // Test insufficient balance\n try {\n await walletService.transferSol('dummy-from', 'dummy-to', 10e9); // 10 SOL\n assert.fail('Should throw error for insufficient balance');\n } catch (error: any) {\n assert.match(\n error.message,\n /Insufficient SOL balance/,\n 'Should throw insufficient balance error'\n );\n }\n\n console.log('Successfully tested SOL transfers.');\n },\n },\n ],\n};\n\nexport default dummyServicesScenariosSuite;\n","import { type Plugin } from '@elizaos/core';\nimport { DummyTokenDataService } from './tokenData/service';\nimport { DummyLpService } from './lp/service';\nimport { DummyWalletService } from './wallet/service';\nimport { DummyPdfService } from './pdf/service';\nimport { DummyVideoService } from './video/service';\nimport { DummyBrowserService } from './browser/service';\nimport { DummyTranscriptionService } from './transcription/service';\nimport { DummyWebSearchService } from './web-search/service';\nimport { DummyEmailService } from './email/service';\nimport { dummyServicesScenariosSuite } from './e2e/scenarios';\n\nexport const dummyServicesPlugin: Plugin = {\n name: 'dummy-services',\n description: 'Load standard dummy services for testing purposes.',\n services: [\n DummyTokenDataService,\n DummyLpService,\n DummyWalletService,\n DummyPdfService,\n DummyVideoService,\n DummyBrowserService,\n DummyTranscriptionService,\n DummyWebSearchService,\n DummyEmailService,\n ],\n tests: [dummyServicesScenariosSuite],\n init: async (runtime) => {\n console.log('Dummy Services Plugin Initialized');\n },\n};\n\nexport default dummyServicesPlugin;\n\n// Export services for direct use\nexport {\n DummyTokenDataService,\n DummyLpService,\n DummyWalletService,\n DummyPdfService,\n DummyVideoService,\n DummyBrowserService,\n DummyTranscriptionService,\n DummyWebSearchService,\n DummyEmailService,\n};\n"],"mappings":"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","names":["ServiceType","ServiceType","ILpService","ServiceType","ILpService","ServiceType"]}
|
|
1
|
+
{"version":3,"sources":["../src/tokenData/service.ts","../src/lp/service.ts","../src/wallet/service.ts","../src/pdf/service.ts","../src/video/service.ts","../src/browser/service.ts","../src/transcription/service.ts","../src/web-search/service.ts","../src/email/service.ts","../src/e2e/scenarios.ts","../src/index.ts"],"sourcesContent":["import { ITokenDataService, TokenData, IAgentRuntime, ServiceType, logger } from '@elizaos/core';\nimport { v4 as uuidv4 } from 'uuid';\n\nexport class DummyTokenDataService extends ITokenDataService {\n readonly serviceName = 'dummy-token-data';\n static readonly serviceType = ServiceType.TOKEN_DATA;\n\n constructor(runtime?: IAgentRuntime) {\n super(runtime);\n logger.info('DummyTokenDataService initialized');\n }\n\n private generateDummyToken(chain: string, address?: string, query?: string): TokenData {\n const randomAddress = address || `0x${uuidv4().replace(/-/g, '')}`;\n const symbol = query ? query.toUpperCase() : randomAddress.substring(2, 6).toUpperCase();\n return {\n id: `${chain}:${randomAddress}`,\n symbol: symbol,\n name: `Dummy Token ${symbol}`,\n address: randomAddress,\n chain: chain,\n sourceProvider: 'dummy',\n price: Math.random() * 100,\n priceChange24hPercent: (Math.random() - 0.5) * 20,\n volume24hUSD: Math.random() * 1000000,\n marketCapUSD: Math.random() * 100000000,\n liquidity: Math.random() * 500000,\n holders: Math.floor(Math.random() * 10000),\n logoURI: 'https://via.placeholder.com/150',\n decimals: 18,\n lastUpdatedAt: new Date(),\n raw: {\n dummyData: true,\n },\n };\n }\n\n async getTokenDetails(address: string, chain: string): Promise<TokenData | null> {\n logger.debug(`DummyTokenDataService: getTokenDetails for ${address} on ${chain}`);\n return this.generateDummyToken(chain, address);\n }\n\n async getTrendingTokens(chain = 'solana', limit = 10, _timePeriod = '24h'): Promise<TokenData[]> {\n logger.debug(`DummyTokenDataService: getTrendingTokens on ${chain}`);\n return Array.from({ length: limit }, () => this.generateDummyToken(chain));\n }\n\n async searchTokens(query: string, chain = 'solana', limit = 5): Promise<TokenData[]> {\n logger.debug(`DummyTokenDataService: searchTokens for \"${query}\" on ${chain}`);\n return Array.from({ length: limit }, () => this.generateDummyToken(chain, undefined, query));\n }\n\n async getTokensByAddresses(addresses: string[], chain: string): Promise<TokenData[]> {\n logger.debug({ addresses, chain }, 'DummyTokenDataService: getTokensByAddresses');\n return addresses.map((addr) => this.generateDummyToken(chain, addr));\n }\n\n static async start(runtime: IAgentRuntime): Promise<DummyTokenDataService> {\n const service = new DummyTokenDataService(runtime);\n return service;\n }\n\n static async stop(runtime: IAgentRuntime): Promise<void> {\n const service = runtime.getService<DummyTokenDataService>(DummyTokenDataService.serviceType);\n if (service) {\n await service.stop();\n }\n }\n\n async start(): Promise<void> {\n logger.info(`[${this.serviceName}] Service started.`);\n }\n\n async stop(): Promise<void> {\n logger.info(`[${this.serviceName}] Service stopped.`);\n }\n}\n","import {\n IAgentRuntime,\n ILpService,\n LpPositionDetails,\n PoolInfo,\n TokenBalance,\n TransactionResult,\n Service,\n} from '@elizaos/core';\n\nexport class DummyLpService extends ILpService {\n public getDexName(): string {\n return 'dummy';\n }\n\n static async start(runtime: IAgentRuntime): Promise<DummyLpService> {\n const service = new DummyLpService(runtime);\n return service;\n }\n\n static async stop(runtime: IAgentRuntime): Promise<void> {\n const service = runtime.getService<DummyLpService>(DummyLpService.serviceType);\n if (service) {\n await service.stop();\n }\n }\n\n async start(runtime: IAgentRuntime): Promise<void> {\n console.log('[DummyLpService] started.');\n }\n\n async stop(): Promise<void> {\n console.log('[DummyLpService] stopped.');\n }\n\n public async getPools(tokenAMint?: string, tokenBMint?: string): Promise<PoolInfo[]> {\n console.log(`[DummyLpService] getPools called with: ${tokenAMint}, ${tokenBMint}`);\n\n const SOL_MINT = 'So11111111111111111111111111111111111111112';\n const USDC_MINT = 'EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyB7u6a';\n\n const pools = [\n {\n id: 'dummy-pool-1',\n dex: 'dummy',\n tokenA: { mint: SOL_MINT, symbol: 'SOL', name: 'Solana', decimals: 9 },\n tokenB: { mint: USDC_MINT, symbol: 'USDC', name: 'USD Coin', decimals: 6 },\n apr: 0.12,\n apy: 0.125,\n tvl: 1234567.89,\n fee: 0.0025,\n metadata: { name: 'SOL/USDC Dummy Pool', isStable: false },\n },\n {\n id: 'dummy-stable-pool-2',\n dex: 'dummy',\n tokenA: { mint: USDC_MINT, symbol: 'USDC', name: 'USD Coin', decimals: 6 },\n tokenB: {\n mint: 'Es9vMFrzaCERmJfrF4H2FYD4KCoNkY11McCe8BenwNYB',\n symbol: 'USDT',\n name: 'Tether',\n decimals: 6,\n },\n apr: 0.08,\n apy: 0.082,\n tvl: 2500000.0,\n fee: 0.0005,\n metadata: { name: 'USDC/USDT Dummy Stable Pool', isStable: true },\n },\n ];\n\n return pools.filter((p) => {\n if (!tokenAMint && !tokenBMint) return true;\n const hasTokenA = p.tokenA.mint === tokenAMint || p.tokenB.mint === tokenAMint;\n const hasTokenB = p.tokenA.mint === tokenBMint || p.tokenB.mint === tokenBMint;\n if (tokenAMint && tokenBMint) return hasTokenA && hasTokenB;\n if (tokenAMint) return hasTokenA;\n if (tokenBMint) return hasTokenB;\n return false;\n });\n }\n\n public async addLiquidity(params: {\n userVault: any;\n poolId: string;\n tokenAAmountLamports: string;\n tokenBAmountLamports?: string;\n slippageBps: number;\n }): Promise<TransactionResult & { lpTokensReceived?: TokenBalance }> {\n console.log(`[DummyLpService] addLiquidity called for pool: ${params.poolId}`);\n return {\n success: true,\n transactionId: `dummy-tx-${Date.now()}`,\n lpTokensReceived: {\n address: `dummy-lp-mint-${params.poolId}`,\n balance: '100000000', // 100 LP tokens\n symbol: 'DUMMY-LP',\n uiAmount: 100,\n decimals: 6,\n name: `Dummy LP Token for ${params.poolId}`,\n },\n };\n }\n\n public async removeLiquidity(params: {\n userVault: any;\n poolId: string;\n lpTokenAmountLamports: string;\n slippageBps: number;\n }): Promise<TransactionResult & { tokensReceived?: TokenBalance[] }> {\n console.log(`[DummyLpService] removeLiquidity called for pool: ${params.poolId}`);\n return {\n success: true,\n transactionId: `dummy-tx-${Date.now()}`,\n tokensReceived: [\n {\n address: 'So11111111111111111111111111111111111111112',\n balance: '500000000',\n symbol: 'SOL',\n uiAmount: 0.5,\n decimals: 9,\n name: 'Solana',\n },\n {\n address: 'EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyB7u6a',\n balance: '500000000',\n symbol: 'USDC',\n uiAmount: 500,\n decimals: 6,\n name: 'USD Coin',\n },\n ],\n };\n }\n\n public async getLpPositionDetails(\n userAccountPublicKey: string,\n poolOrPositionIdentifier: string\n ): Promise<LpPositionDetails | null> {\n console.log(\n `[DummyLpService] getLpPositionDetails called for user: ${userAccountPublicKey}, identifier: ${poolOrPositionIdentifier}`\n );\n // This is a mock. In a real scenario, you'd look up position details based on the identifier.\n // The identifier could be the pool ID for a simple AMM or a position NFT mint for a CLMM.\n return {\n poolId: 'dummy-pool-1', // Assuming the identifier maps back to a known pool\n dex: 'dummy',\n lpTokenBalance: {\n address: poolOrPositionIdentifier,\n balance: '100000000',\n symbol: 'DUMMY-LP',\n uiAmount: 100,\n decimals: 6,\n name: `Dummy LP Token`,\n },\n underlyingTokens: [\n {\n address: 'So11111111111111111111111111111111111111112',\n balance: '500000000',\n symbol: 'SOL',\n uiAmount: 0.5,\n decimals: 9,\n name: 'Solana',\n },\n {\n address: 'EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyB7u6a',\n balance: '500000000',\n symbol: 'USDC',\n uiAmount: 500,\n decimals: 6,\n name: 'USD Coin',\n },\n ],\n valueUsd: 1000,\n metadata: { apr: 0.12 },\n };\n }\n\n public async getMarketDataForPools(\n poolIds: string[]\n ): Promise<Record<string, Partial<PoolInfo>>> {\n console.log(`[DummyLpService] getMarketDataForPools called for pools: ${poolIds.join(', ')}`);\n const results: Record<string, Partial<PoolInfo>> = {};\n for (const poolId of poolIds) {\n results[poolId] = {\n apy: Math.random() * 0.2,\n tvl: Math.random() * 1000000,\n apr: Math.random() * 0.18,\n };\n }\n return results;\n }\n}\n","import { AgentRuntime, IWalletService, ServiceType, WalletPortfolio } from '@elizaos/core';\n\nconst DEFAULT_QUOTE_ASSET = 'USDC'; // Default asset for cash\nconst DEFAULT_TRANSACTION_FEE_FIXED = 0.1; // Example fixed fee in quote asset\n\ninterface DummyPositionLot {\n price: number;\n quantity: number;\n timestamp: number;\n}\n\ninterface DummyAssetDetail {\n quantity: number;\n averagePrice: number; // Average price of current holdings\n lots: DummyPositionLot[]; // For FIFO P&L on sell\n}\n\nexport class DummyWalletService extends IWalletService {\n public static override readonly serviceType = ServiceType.WALLET;\n\n private balances: Map<string, number>; // assetSymbolOrAddress -> quantity\n private positions: Map<string, DummyAssetDetail>; // assetSymbolOrAddress -> details for owned non-quote assets\n private quoteAssetSymbol: string;\n\n constructor(runtime: AgentRuntime) {\n super(runtime);\n this.balances = new Map<string, number>();\n this.positions = new Map<string, DummyAssetDetail>();\n this.quoteAssetSymbol = DEFAULT_QUOTE_ASSET;\n this.resetWallet(10000, DEFAULT_QUOTE_ASSET); // Initialize with some default cash\n }\n async transferSol(from: any, to: any, lamports: number): Promise<string> {\n // This is a dummy implementation - no real transfer happens\n console.log(\n `[${DummyWalletService.serviceType}] Mock transfer: ${lamports} lamports from ${from} to ${to}`\n );\n\n // For dummy wallet, we just simulate the transfer\n const solSymbol = 'SOL';\n const solAmount = lamports / 1e9; // Convert lamports to SOL\n\n const currentBalance = this.balances.get(solSymbol) || 0;\n if (currentBalance < solAmount) {\n throw new Error(`Insufficient SOL balance. Have ${currentBalance}, need ${solAmount}`);\n }\n\n // Deduct from balance\n this.balances.set(solSymbol, currentBalance - solAmount);\n\n // Return a dummy transaction signature\n return `dummy-tx-${Date.now()}-${Math.random().toString(36).substring(7)}`;\n }\n\n public static async start(runtime: AgentRuntime): Promise<DummyWalletService> {\n console.log(`[${DummyWalletService.serviceType}] static start called - creating instance.`);\n const instance = new DummyWalletService(runtime);\n // No further async init in instance.start() currently needed for this simple map-based wallet\n return instance;\n }\n\n public async start(): Promise<void> {\n console.log(\n `[${DummyWalletService.serviceType}] instance start called. Initialized with ${this.balances.get(this.quoteAssetSymbol)} ${this.quoteAssetSymbol}.`\n );\n }\n\n public async stop(): Promise<void> {\n console.log(`[${DummyWalletService.serviceType}] instance stop called. Balances reset.`);\n this.balances.clear();\n this.positions.clear();\n }\n\n async addFunds(\n assetSymbolOrAddress: string,\n amount: number,\n _walletAddress?: string\n ): Promise<void> {\n const currentBalance = this.balances.get(assetSymbolOrAddress) || 0;\n this.balances.set(assetSymbolOrAddress, currentBalance + amount);\n console.log(\n `[${DummyWalletService.serviceType}] Added ${amount} ${assetSymbolOrAddress}. New balance: ${this.balances.get(assetSymbolOrAddress)}`\n );\n }\n\n async setPortfolioHolding(\n assetSymbolOrAddress: string,\n quantity: number,\n averagePrice: number,\n _walletAddress?: string\n ): Promise<void> {\n if (assetSymbolOrAddress === this.quoteAssetSymbol) {\n console.warn(\n `[${DummyWalletService.serviceType}] Cannot set portfolio holding for quote asset directly, use addFunds.`\n );\n return this.addFunds(assetSymbolOrAddress, quantity * averagePrice); // Assuming quantity is amount of quote to add\n }\n this.balances.set(assetSymbolOrAddress, quantity);\n this.positions.set(assetSymbolOrAddress, {\n quantity: quantity,\n averagePrice: averagePrice,\n lots: [{ price: averagePrice, quantity: quantity, timestamp: Date.now() }], // Create a single lot for simplicity\n });\n console.log(\n `[${DummyWalletService.serviceType}] Set holding for ${assetSymbolOrAddress}: ${quantity} @ ${averagePrice}`\n );\n }\n\n async resetWallet(\n initialCashAmount: number,\n cashAssetSymbol: string = DEFAULT_QUOTE_ASSET,\n _walletAddress?: string\n ): Promise<void> {\n this.balances.clear();\n this.positions.clear();\n this.quoteAssetSymbol = cashAssetSymbol;\n this.balances.set(this.quoteAssetSymbol, initialCashAmount);\n console.log(\n `[${DummyWalletService.serviceType}] Wallet reset. Cash: ${initialCashAmount} ${this.quoteAssetSymbol}`\n );\n }\n\n async getBalance(assetSymbolOrAddress: string, _walletAddress?: string): Promise<number> {\n return this.balances.get(assetSymbolOrAddress) || 0;\n }\n\n async getPortfolio(_walletAddress?: string): Promise<WalletPortfolio> {\n const assets: any[] = [];\n let totalValueUsd = 0;\n\n for (const [symbol, balance] of this.balances) {\n const positionDetail = this.positions.get(symbol);\n const isQuoteAsset = symbol === this.quoteAssetSymbol;\n const averagePrice = positionDetail?.averagePrice || (isQuoteAsset ? 1 : 0);\n const value = isQuoteAsset\n ? balance\n : positionDetail\n ? balance * positionDetail.averagePrice\n : 0;\n\n // WalletAsset structure\n assets.push({\n address: symbol, // Using symbol as address for dummy wallet\n symbol,\n balance: balance.toString(),\n decimals: isQuoteAsset ? 6 : 9, // Default decimals\n quantity: balance,\n averagePrice,\n currentPrice: undefined,\n value,\n assetAddress: symbol,\n });\n\n totalValueUsd += value;\n }\n\n return {\n totalValueUsd,\n assets,\n };\n }\n}\n","import { IAgentRuntime } from '@elizaos/core';\nimport {\n IPdfService,\n PdfExtractionResult,\n PdfGenerationOptions,\n PdfConversionOptions,\n} from '@elizaos/core';\n\n/**\n * Dummy PDF service for testing purposes\n * Provides mock implementations of PDF processing operations\n */\nexport class DummyPdfService extends IPdfService {\n static override readonly serviceType = IPdfService.serviceType;\n\n constructor(runtime: IAgentRuntime) {\n super(runtime);\n }\n\n static async start(runtime: IAgentRuntime): Promise<DummyPdfService> {\n const service = new DummyPdfService(runtime);\n await service.initialize();\n return service;\n }\n\n async initialize(): Promise<void> {\n this.runtime.logger.info('DummyPdfService initialized');\n }\n\n async stop(): Promise<void> {\n this.runtime.logger.info('DummyPdfService stopped');\n }\n\n async extractText(pdfPath: string | Buffer): Promise<PdfExtractionResult> {\n const isBuffer = Buffer.isBuffer(pdfPath);\n const filename = isBuffer ? 'buffer.pdf' : pdfPath;\n\n this.runtime.logger.debug(`Extracting text from ${filename}`);\n\n // Mock extraction result\n return {\n text: `Mock extracted text from ${filename}.\\n\\nThis is a dummy PDF service that simulates text extraction.\\n\\nPage 1: Lorem ipsum dolor sit amet, consectetur adipiscing elit.\\nPage 2: Sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.\\nPage 3: Ut enim ad minim veniam, quis nostrud exercitation ullamco.`,\n pageCount: 3,\n metadata: {\n title: 'Mock PDF Document',\n author: 'Dummy Service',\n createdAt: new Date('2024-01-01'),\n modifiedAt: new Date(),\n },\n };\n }\n\n async generatePdf(htmlContent: string, options?: PdfGenerationOptions): Promise<Buffer> {\n this.runtime.logger.debug('Generating PDF from HTML content');\n\n // Mock PDF generation\n const pdfContent = `Mock PDF generated from HTML content with ${htmlContent.length} characters`;\n const mockPdfBuffer = Buffer.from(pdfContent, 'utf8');\n\n // Simulate processing options\n if (options) {\n this.runtime.logger.debug('PDF generation options:', options);\n }\n\n return mockPdfBuffer;\n }\n\n async convertToPdf(filePath: string, options?: PdfConversionOptions): Promise<Buffer> {\n this.runtime.logger.debug(`Converting ${filePath} to PDF`);\n\n // Mock PDF conversion\n const pdfContent = `Mock PDF converted from ${filePath}`;\n const mockPdfBuffer = Buffer.from(pdfContent, 'utf8');\n\n // Simulate processing options\n if (options) {\n this.runtime.logger.debug('PDF conversion options:', options);\n }\n\n return mockPdfBuffer;\n }\n\n async mergePdfs(pdfPaths: (string | Buffer)[]): Promise<Buffer> {\n this.runtime.logger.debug(`Merging ${pdfPaths.length} PDF files`);\n\n // Mock PDF merging\n const mergedContent = pdfPaths\n .map((path, index) => {\n const name = Buffer.isBuffer(path) ? `buffer-${index}` : path;\n return `Content from ${name}`;\n })\n .join('\\n\\n');\n\n const mockMergedBuffer = Buffer.from(`Mock merged PDF:\\n${mergedContent}`, 'utf8');\n return mockMergedBuffer;\n }\n\n async splitPdf(pdfPath: string | Buffer): Promise<Buffer[]> {\n this.runtime.logger.debug('Splitting PDF into pages');\n\n const filename = Buffer.isBuffer(pdfPath) ? 'buffer.pdf' : pdfPath;\n\n // Mock PDF splitting - return 3 pages\n const pages = [\n Buffer.from(`Mock Page 1 from ${filename}`, 'utf8'),\n Buffer.from(`Mock Page 2 from ${filename}`, 'utf8'),\n Buffer.from(`Mock Page 3 from ${filename}`, 'utf8'),\n ];\n\n return pages;\n }\n}\n","import { IAgentRuntime } from '@elizaos/core';\nimport {\n IVideoService,\n VideoInfo,\n VideoFormat,\n VideoDownloadOptions,\n VideoProcessingOptions,\n} from '@elizaos/core';\n\n/**\n * Dummy video service for testing purposes\n * Provides mock implementations of video processing operations\n */\nexport class DummyVideoService extends IVideoService {\n static override readonly serviceType = IVideoService.serviceType;\n\n constructor(runtime: IAgentRuntime) {\n super(runtime);\n }\n\n static async start(runtime: IAgentRuntime): Promise<DummyVideoService> {\n const service = new DummyVideoService(runtime);\n await service.initialize();\n return service;\n }\n\n async initialize(): Promise<void> {\n this.runtime.logger.info('DummyVideoService initialized');\n }\n\n async stop(): Promise<void> {\n this.runtime.logger.info('DummyVideoService stopped');\n }\n\n async getVideoInfo(url: string): Promise<VideoInfo> {\n this.runtime.logger.debug(`Getting video info for ${url}`);\n\n return {\n title: 'Mock Video Title',\n duration: 300, // 5 minutes in seconds\n url,\n thumbnail: 'https://example.com/thumbnail.jpg',\n description: 'This is a mock video description for testing purposes.',\n uploader: 'DummyUploader',\n viewCount: 12345,\n uploadDate: new Date('2024-01-01'),\n formats: [\n {\n formatId: 'mp4-720p',\n url: 'https://example.com/video-720p.mp4',\n extension: 'mp4',\n quality: '720p',\n fileSize: 50000000, // 50MB\n videoCodec: 'h264',\n audioCodec: 'aac',\n resolution: '1280x720',\n fps: 30,\n bitrate: 1000000,\n },\n {\n formatId: 'mp4-1080p',\n url: 'https://example.com/video-1080p.mp4',\n extension: 'mp4',\n quality: '1080p',\n fileSize: 100000000, // 100MB\n videoCodec: 'h264',\n audioCodec: 'aac',\n resolution: '1920x1080',\n fps: 30,\n bitrate: 2000000,\n },\n ],\n };\n }\n\n async downloadVideo(url: string, options?: VideoDownloadOptions): Promise<string> {\n this.runtime.logger.debug(`Downloading video from ${url}`);\n\n if (options) {\n this.runtime.logger.debug('Download options:', options);\n }\n\n // Mock download - return a fake file path\n const filename = `mock-video-${Date.now()}.mp4`;\n const outputPath = options?.outputPath || `/tmp/${filename}`;\n\n // Simulate some download processing\n await new Promise((resolve) => setTimeout(resolve, 100));\n\n return outputPath;\n }\n\n async extractAudio(videoPath: string, outputPath?: string): Promise<string> {\n this.runtime.logger.debug(`Extracting audio from ${videoPath}`);\n\n const audioPath = outputPath || videoPath.replace(/\\.[^/.]+$/, '') + '.mp3';\n\n // Simulate audio extraction\n await new Promise((resolve) => setTimeout(resolve, 50));\n\n return audioPath;\n }\n\n async getThumbnail(videoPath: string, timestamp?: number): Promise<string> {\n this.runtime.logger.debug(`Generating thumbnail for ${videoPath} at ${timestamp || 0}s`);\n\n const thumbnailPath = videoPath.replace(/\\.[^/.]+$/, '') + `_${timestamp || 0}s.jpg`;\n\n // Simulate thumbnail generation\n await new Promise((resolve) => setTimeout(resolve, 30));\n\n return thumbnailPath;\n }\n\n async convertVideo(\n videoPath: string,\n outputPath: string,\n options?: VideoProcessingOptions\n ): Promise<string> {\n this.runtime.logger.debug(`Converting video from ${videoPath} to ${outputPath}`);\n\n if (options) {\n this.runtime.logger.debug('Conversion options:', options);\n }\n\n // Simulate video conversion\n await new Promise((resolve) => setTimeout(resolve, 200));\n\n return outputPath;\n }\n\n async getAvailableFormats(url: string): Promise<VideoFormat[]> {\n this.runtime.logger.debug(`Getting available formats for ${url}`);\n\n return [\n {\n formatId: 'mp4-360p',\n url: 'https://example.com/video-360p.mp4',\n extension: 'mp4',\n quality: '360p',\n fileSize: 15000000, // 15MB\n videoCodec: 'h264',\n audioCodec: 'aac',\n resolution: '640x360',\n fps: 30,\n bitrate: 500000,\n },\n {\n formatId: 'mp4-720p',\n url: 'https://example.com/video-720p.mp4',\n extension: 'mp4',\n quality: '720p',\n fileSize: 50000000, // 50MB\n videoCodec: 'h264',\n audioCodec: 'aac',\n resolution: '1280x720',\n fps: 30,\n bitrate: 1000000,\n },\n {\n formatId: 'mp4-1080p',\n url: 'https://example.com/video-1080p.mp4',\n extension: 'mp4',\n quality: '1080p',\n fileSize: 100000000, // 100MB\n videoCodec: 'h264',\n audioCodec: 'aac',\n resolution: '1920x1080',\n fps: 30,\n bitrate: 2000000,\n },\n {\n formatId: 'audio-only',\n url: 'https://example.com/audio.mp3',\n extension: 'mp3',\n quality: 'audio',\n fileSize: 5000000, // 5MB\n audioCodec: 'mp3',\n bitrate: 128000,\n },\n ];\n }\n}\n","import { IAgentRuntime } from '@elizaos/core';\nimport {\n IBrowserService,\n BrowserNavigationOptions,\n ScreenshotOptions,\n ElementSelector,\n ExtractedContent,\n ClickOptions,\n TypeOptions,\n} from '@elizaos/core';\n\n/**\n * Dummy browser service for testing purposes\n * Provides mock implementations of browser automation operations\n */\nexport class DummyBrowserService extends IBrowserService {\n static override readonly serviceType = IBrowserService.serviceType;\n\n private currentUrl: string = 'about:blank';\n private history: string[] = [];\n private historyIndex: number = -1;\n\n constructor(runtime: IAgentRuntime) {\n super(runtime);\n }\n\n static async start(runtime: IAgentRuntime): Promise<DummyBrowserService> {\n const service = new DummyBrowserService(runtime);\n await service.initialize();\n return service;\n }\n\n async initialize(): Promise<void> {\n this.runtime.logger.info('DummyBrowserService initialized');\n }\n\n async stop(): Promise<void> {\n this.runtime.logger.info('DummyBrowserService stopped');\n }\n\n async navigate(url: string, options?: BrowserNavigationOptions): Promise<void> {\n this.runtime.logger.debug(`Navigating to ${url}`);\n\n if (options) {\n this.runtime.logger.debug('Navigation options:', options);\n }\n\n // Update navigation history\n this.history.push(url);\n this.historyIndex = this.history.length - 1;\n this.currentUrl = url;\n\n // Simulate navigation delay\n await new Promise((resolve) => setTimeout(resolve, 100));\n }\n\n async screenshot(options?: ScreenshotOptions): Promise<Buffer> {\n this.runtime.logger.debug('Taking screenshot');\n\n if (options) {\n this.runtime.logger.debug('Screenshot options:', options);\n }\n\n // Mock screenshot - return a fake image buffer\n const mockImage = `Mock screenshot of ${this.currentUrl}`;\n const imageBuffer = Buffer.from(mockImage, 'utf8');\n\n return imageBuffer;\n }\n\n async extractContent(selector?: string): Promise<ExtractedContent> {\n this.runtime.logger.debug(`Extracting content${selector ? ` from ${selector}` : ''}`);\n\n // Mock content extraction based on current URL\n let isGitHub = false;\n let isGoogle = false;\n\n try {\n const url = new URL(this.currentUrl);\n isGitHub = url.hostname === 'github.com' || url.hostname.endsWith('.github.com');\n isGoogle = url.hostname === 'google.com' || url.hostname.endsWith('.google.com');\n } catch (error) {\n // If URL is invalid, default to false for both\n this.runtime.logger.debug('Invalid URL format, defaulting to generic content');\n }\n\n let mockContent: ExtractedContent;\n\n if (isGitHub) {\n mockContent = {\n text: 'Mock GitHub repository content\\n\\nThis is a dummy browser service extracting content from GitHub.\\n\\nFeatures:\\n- Mock code repository\\n- Sample README content\\n- Dummy issue tracking',\n html: '<div class=\"repository-content\"><h1>Mock Repository</h1><p>This is a dummy GitHub repository.</p></div>',\n links: [\n { url: 'https://github.com/mock/repo/issues', text: 'Issues' },\n { url: 'https://github.com/mock/repo/pulls', text: 'Pull Requests' },\n { url: 'https://github.com/mock/repo/wiki', text: 'Wiki' },\n ],\n images: [{ src: 'https://github.com/mock/repo/avatar.png', alt: 'Repository Avatar' }],\n title: 'Mock Repository - GitHub',\n metadata: {\n 'og:title': 'Mock Repository',\n 'og:description': 'A dummy repository for testing',\n 'og:type': 'website',\n },\n };\n } else if (isGoogle) {\n mockContent = {\n text: 'Mock Google search results\\n\\nSearch results for your query:\\n\\n1. Mock Result 1\\n2. Mock Result 2\\n3. Mock Result 3',\n html: '<div class=\"search-results\"><div class=\"result\"><h3>Mock Result 1</h3><p>Mock description</p></div></div>',\n links: [\n { url: 'https://example.com/result1', text: 'Mock Result 1' },\n { url: 'https://example.com/result2', text: 'Mock Result 2' },\n { url: 'https://example.com/result3', text: 'Mock Result 3' },\n ],\n images: [{ src: 'https://google.com/logo.png', alt: 'Google Logo' }],\n title: 'Mock Search - Google',\n metadata: {\n description: 'Mock search results page',\n },\n };\n } else {\n mockContent = {\n text: `Mock content from ${this.currentUrl}\\n\\nThis is dummy content extracted by the browser service.\\n\\nLorem ipsum dolor sit amet, consectetur adipiscing elit.`,\n html: '<div class=\"content\"><h1>Mock Page</h1><p>This is mock content from the dummy browser service.</p></div>',\n links: [\n { url: `${this.currentUrl}/page1`, text: 'Page 1' },\n { url: `${this.currentUrl}/page2`, text: 'Page 2' },\n ],\n images: [{ src: `${this.currentUrl}/image.jpg`, alt: 'Mock Image' }],\n title: 'Mock Page Title',\n metadata: {\n description: 'Mock page description',\n },\n };\n }\n\n return mockContent;\n }\n\n async click(selector: string | ElementSelector, options?: ClickOptions): Promise<void> {\n const selectorStr = typeof selector === 'string' ? selector : selector.selector;\n this.runtime.logger.debug(`Clicking on ${selectorStr}`);\n\n if (options) {\n this.runtime.logger.debug('Click options:', options);\n }\n\n // Simulate click delay\n await new Promise((resolve) => setTimeout(resolve, 50));\n }\n\n async type(selector: string, text: string, options?: TypeOptions): Promise<void> {\n this.runtime.logger.debug(`Typing \"${text}\" into ${selector}`);\n\n if (options) {\n this.runtime.logger.debug('Type options:', options);\n }\n\n // Simulate typing delay\n const delay = options?.delay || 10;\n await new Promise((resolve) => setTimeout(resolve, delay * text.length));\n }\n\n async waitForElement(selector: string | ElementSelector): Promise<void> {\n const selectorStr = typeof selector === 'string' ? selector : selector.selector;\n this.runtime.logger.debug(`Waiting for element ${selectorStr}`);\n\n // Simulate element wait\n await new Promise((resolve) => setTimeout(resolve, 100));\n }\n\n async evaluate<T = any>(script: string, ...args: any[]): Promise<T> {\n this.runtime.logger.debug(`Evaluating script: ${script}`);\n\n // Mock script evaluation\n if (script.includes('document.title')) {\n return 'Mock Page Title' as T;\n }\n\n if (script.includes('window.location.href')) {\n return this.currentUrl as T;\n }\n\n if (script.includes('document.body.innerHTML')) {\n return '<div>Mock page content</div>' as T;\n }\n\n // Default mock result\n return { result: 'mock evaluation result', args } as T;\n }\n\n async getCurrentUrl(): Promise<string> {\n return this.currentUrl;\n }\n\n async goBack(): Promise<void> {\n this.runtime.logger.debug('Going back in history');\n\n if (this.historyIndex > 0) {\n this.historyIndex--;\n this.currentUrl = this.history[this.historyIndex];\n }\n\n await new Promise((resolve) => setTimeout(resolve, 50));\n }\n\n async goForward(): Promise<void> {\n this.runtime.logger.debug('Going forward in history');\n\n if (this.historyIndex < this.history.length - 1) {\n this.historyIndex++;\n this.currentUrl = this.history[this.historyIndex];\n }\n\n await new Promise((resolve) => setTimeout(resolve, 50));\n }\n\n async refresh(): Promise<void> {\n this.runtime.logger.debug('Refreshing page');\n\n // Simulate page refresh\n await new Promise((resolve) => setTimeout(resolve, 100));\n }\n}\n","import { IAgentRuntime } from '@elizaos/core';\nimport {\n ITranscriptionService,\n TranscriptionOptions,\n TranscriptionResult,\n TranscriptionSegment,\n TranscriptionWord,\n SpeechToTextOptions,\n TextToSpeechOptions,\n} from '@elizaos/core';\n\n/**\n * Dummy transcription service for testing purposes\n * Provides mock implementations of transcription operations\n */\nexport class DummyTranscriptionService extends ITranscriptionService {\n static override readonly serviceType = ITranscriptionService.serviceType;\n\n private supportedLanguages = ['en', 'es', 'fr', 'de', 'it', 'pt', 'ru', 'zh', 'ja', 'ko'];\n private availableVoices = [\n { id: 'en-US-male', name: 'John', language: 'en-US', gender: 'male' as const },\n { id: 'en-US-female', name: 'Jane', language: 'en-US', gender: 'female' as const },\n { id: 'es-ES-male', name: 'Carlos', language: 'es-ES', gender: 'male' as const },\n { id: 'fr-FR-female', name: 'Marie', language: 'fr-FR', gender: 'female' as const },\n ];\n\n constructor(runtime: IAgentRuntime) {\n super(runtime);\n }\n\n static async start(runtime: IAgentRuntime): Promise<DummyTranscriptionService> {\n const service = new DummyTranscriptionService(runtime);\n await service.initialize();\n return service;\n }\n\n async initialize(): Promise<void> {\n this.runtime.logger.info('DummyTranscriptionService initialized');\n }\n\n async stop(): Promise<void> {\n this.runtime.logger.info('DummyTranscriptionService stopped');\n }\n\n async transcribeAudio(\n audioPath: string | Buffer,\n options?: TranscriptionOptions\n ): Promise<TranscriptionResult> {\n const filename = Buffer.isBuffer(audioPath) ? 'audio-buffer' : audioPath;\n this.runtime.logger.debug(`Transcribing audio from ${filename}`);\n\n if (options) {\n this.runtime.logger.debug('Transcription options:', options);\n }\n\n // Mock transcription result\n const mockText =\n 'Hello, this is a mock transcription from the dummy service. The audio has been processed and converted to text. This demonstrates the transcription capabilities of the system.';\n\n const words: TranscriptionWord[] = mockText.split(' ').map((word, index) => ({\n word: word.replace(/[.,!?]/, ''),\n start: index * 0.5,\n end: (index + 1) * 0.5,\n confidence: 0.9 + Math.random() * 0.1,\n }));\n\n const segments: TranscriptionSegment[] = [\n {\n id: 0,\n text: 'Hello, this is a mock transcription from the dummy service.',\n start: 0,\n end: 5,\n confidence: 0.95,\n temperature: 0.0,\n avg_logprob: -0.1,\n compression_ratio: 1.2,\n no_speech_prob: 0.01,\n },\n {\n id: 1,\n text: 'The audio has been processed and converted to text.',\n start: 5,\n end: 10,\n confidence: 0.92,\n temperature: 0.0,\n avg_logprob: -0.12,\n compression_ratio: 1.1,\n no_speech_prob: 0.02,\n },\n {\n id: 2,\n text: 'This demonstrates the transcription capabilities of the system.',\n start: 10,\n end: 15,\n confidence: 0.89,\n temperature: 0.0,\n avg_logprob: -0.15,\n compression_ratio: 1.3,\n no_speech_prob: 0.03,\n },\n ];\n\n return {\n text: mockText,\n language: options?.language || 'en',\n duration: 15,\n segments: options?.response_format === 'verbose_json' ? segments : undefined,\n words: options?.word_timestamps ? words : undefined,\n confidence: 0.92,\n };\n }\n\n async transcribeVideo(\n videoPath: string | Buffer,\n options?: TranscriptionOptions\n ): Promise<TranscriptionResult> {\n const filename = Buffer.isBuffer(videoPath) ? 'video-buffer' : videoPath;\n this.runtime.logger.debug(`Transcribing video from ${filename}`);\n\n // For video, we simulate extracting audio first, then transcribing\n const mockText =\n \"This is a mock transcription from a video file. The video's audio track has been extracted and processed. The speaker discusses various topics including technology, AI, and automation systems.\";\n\n const words: TranscriptionWord[] = mockText.split(' ').map((word, index) => ({\n word: word.replace(/[.,!?]/, ''),\n start: index * 0.6,\n end: (index + 1) * 0.6,\n confidence: 0.85 + Math.random() * 0.15,\n }));\n\n return {\n text: mockText,\n language: options?.language || 'en',\n duration: 20,\n words: options?.word_timestamps ? words : undefined,\n confidence: 0.88,\n };\n }\n\n async speechToText(\n audioStream: NodeJS.ReadableStream | Buffer,\n options?: SpeechToTextOptions\n ): Promise<TranscriptionResult> {\n this.runtime.logger.debug('Processing real-time speech to text');\n\n if (options) {\n this.runtime.logger.debug('Speech to text options:', options);\n }\n\n // Mock real-time transcription\n const mockText =\n 'Real-time speech recognition is working. This is a continuous transcription from the audio stream.';\n\n return {\n text: mockText,\n language: options?.language || 'en',\n duration: 5,\n confidence: 0.85,\n };\n }\n\n async textToSpeech(text: string, options?: TextToSpeechOptions): Promise<Buffer> {\n this.runtime.logger.debug(`Converting text to speech: \"${text.substring(0, 50)}...\"`);\n\n if (options) {\n this.runtime.logger.debug('Text to speech options:', options);\n }\n\n // Mock audio generation\n const mockAudioData = `Mock audio data for: ${text}`;\n const audioBuffer = Buffer.from(mockAudioData, 'utf8');\n\n // Simulate processing time based on text length\n await new Promise((resolve) => setTimeout(resolve, Math.min(text.length * 10, 1000)));\n\n return audioBuffer;\n }\n\n async getSupportedLanguages(): Promise<string[]> {\n return [...this.supportedLanguages];\n }\n\n async getAvailableVoices(): Promise<\n Array<{\n id: string;\n name: string;\n language: string;\n gender?: 'male' | 'female' | 'neutral';\n }>\n > {\n return [...this.availableVoices];\n }\n\n async detectLanguage(audioPath: string | Buffer): Promise<string> {\n const filename = Buffer.isBuffer(audioPath) ? 'audio-buffer' : audioPath;\n this.runtime.logger.debug(`Detecting language from ${filename}`);\n\n // Mock language detection - randomly pick a supported language\n const randomLanguage =\n this.supportedLanguages[Math.floor(Math.random() * this.supportedLanguages.length)];\n\n // Simulate processing time\n await new Promise((resolve) => setTimeout(resolve, 100));\n\n return randomLanguage;\n }\n}\n","import { IAgentRuntime } from '@elizaos/core';\nimport {\n IWebSearchService,\n SearchOptions,\n SearchResult,\n SearchResponse,\n NewsSearchOptions,\n ImageSearchOptions,\n VideoSearchOptions,\n} from '@elizaos/core';\n\n/**\n * Dummy web search service for testing purposes\n * Provides mock implementations of web search operations\n */\nexport class DummyWebSearchService extends IWebSearchService {\n static override readonly serviceType = IWebSearchService.serviceType;\n\n private trendingSearches = [\n 'artificial intelligence',\n 'machine learning',\n 'blockchain technology',\n 'climate change',\n 'space exploration',\n 'quantum computing',\n 'renewable energy',\n 'cybersecurity',\n 'biotechnology',\n 'autonomous vehicles',\n ];\n\n constructor(runtime: IAgentRuntime) {\n super(runtime);\n }\n\n static async start(runtime: IAgentRuntime): Promise<DummyWebSearchService> {\n const service = new DummyWebSearchService(runtime);\n await service.initialize();\n return service;\n }\n\n async initialize(): Promise<void> {\n this.runtime.logger.info('DummyWebSearchService initialized');\n }\n\n async stop(): Promise<void> {\n this.runtime.logger.info('DummyWebSearchService stopped');\n }\n\n async search(query: string, options?: SearchOptions): Promise<SearchResponse> {\n this.runtime.logger.debug(`Searching for: \"${query}\"`);\n\n if (options) {\n this.runtime.logger.debug('Search options:', options);\n }\n\n // Mock search results\n const results: SearchResult[] = [\n {\n title: `${query} - Comprehensive Guide`,\n url: `https://example.com/guide/${query.replace(/\\s+/g, '-')}`,\n description: `A comprehensive guide about ${query}. This mock result provides detailed information and explanations about the topic.`,\n displayUrl: 'example.com',\n thumbnail: 'https://example.com/thumbnail1.jpg',\n publishedDate: new Date('2024-01-15'),\n source: 'Example Guide',\n relevanceScore: 0.95,\n snippet: `Learn everything about ${query} with this detailed guide...`,\n },\n {\n title: `${query} - Latest News and Updates`,\n url: `https://news.example.com/latest/${query.replace(/\\s+/g, '-')}`,\n description: `Stay updated with the latest news about ${query}. Recent developments, trends, and insights.`,\n displayUrl: 'news.example.com',\n thumbnail: 'https://news.example.com/thumbnail2.jpg',\n publishedDate: new Date('2024-01-10'),\n source: 'Example News',\n relevanceScore: 0.88,\n snippet: `Breaking news about ${query}: Recent developments show...`,\n },\n {\n title: `${query} - Wikipedia`,\n url: `https://en.wikipedia.org/wiki/${query.replace(/\\s+/g, '_')}`,\n description: `Wikipedia article about ${query}. Comprehensive information from the free encyclopedia.`,\n displayUrl: 'en.wikipedia.org',\n publishedDate: new Date('2023-12-01'),\n source: 'Wikipedia',\n relevanceScore: 0.82,\n snippet: `${query} is a topic that encompasses various aspects...`,\n },\n ];\n\n return {\n query,\n results,\n totalResults: 156789,\n searchTime: 0.42,\n suggestions: [\n `${query} tutorial`,\n `${query} examples`,\n `${query} best practices`,\n `${query} 2024`,\n ],\n relatedSearches: [\n `what is ${query}`,\n `how to ${query}`,\n `${query} vs alternatives`,\n `${query} benefits`,\n ],\n };\n }\n\n async searchNews(query: string, options?: NewsSearchOptions): Promise<SearchResponse> {\n this.runtime.logger.debug(`Searching news for: \"${query}\"`);\n\n if (options) {\n this.runtime.logger.debug('News search options:', options);\n }\n\n // Mock news results\n const results: SearchResult[] = [\n {\n title: `Breaking: ${query} Makes Headlines`,\n url: `https://news.example.com/breaking/${query.replace(/\\s+/g, '-')}`,\n description: `Latest breaking news about ${query}. Important developments that are making headlines today.`,\n displayUrl: 'news.example.com',\n thumbnail: 'https://news.example.com/breaking.jpg',\n publishedDate: new Date(Date.now() - 3600000), // 1 hour ago\n source: 'Example News',\n relevanceScore: 0.93,\n },\n {\n title: `${query}: Analysis and Commentary`,\n url: `https://analysis.example.com/commentary/${query.replace(/\\s+/g, '-')}`,\n description: `Expert analysis and commentary on ${query}. In-depth perspectives from industry leaders.`,\n displayUrl: 'analysis.example.com',\n thumbnail: 'https://analysis.example.com/analysis.jpg',\n publishedDate: new Date(Date.now() - 7200000), // 2 hours ago\n source: 'Example Analysis',\n relevanceScore: 0.87,\n },\n ];\n\n return {\n query,\n results,\n totalResults: 12345,\n searchTime: 0.28,\n suggestions: [`${query} news`, `${query} headlines`, `${query} updates`],\n };\n }\n\n async searchImages(query: string, options?: ImageSearchOptions): Promise<SearchResponse> {\n this.runtime.logger.debug(`Searching images for: \"${query}\"`);\n\n if (options) {\n this.runtime.logger.debug('Image search options:', options);\n }\n\n // Mock image results\n const results: SearchResult[] = Array.from({ length: 12 }, (_, i) => ({\n title: `${query} Image ${i + 1}`,\n url: `https://images.example.com/${query.replace(/\\s+/g, '-')}-${i + 1}.jpg`,\n description: `High-quality image of ${query}. Perfect for various uses and applications.`,\n displayUrl: 'images.example.com',\n thumbnail: `https://images.example.com/thumb/${query.replace(/\\s+/g, '-')}-${i + 1}.jpg`,\n source: 'Example Images',\n relevanceScore: 0.9 - i * 0.05,\n }));\n\n return {\n query,\n results,\n totalResults: 45678,\n searchTime: 0.35,\n };\n }\n\n async searchVideos(query: string, options?: VideoSearchOptions): Promise<SearchResponse> {\n this.runtime.logger.debug(`Searching videos for: \"${query}\"`);\n\n if (options) {\n this.runtime.logger.debug('Video search options:', options);\n }\n\n // Mock video results\n const results: SearchResult[] = [\n {\n title: `${query} - Complete Tutorial`,\n url: `https://video.example.com/tutorial/${query.replace(/\\s+/g, '-')}`,\n description: `Complete tutorial about ${query}. Step-by-step guide with examples and demonstrations.`,\n displayUrl: 'video.example.com',\n thumbnail: `https://video.example.com/thumb/tutorial-${query.replace(/\\s+/g, '-')}.jpg`,\n publishedDate: new Date('2024-01-05'),\n source: 'Example Video',\n relevanceScore: 0.91,\n },\n {\n title: `${query} Explained in 5 Minutes`,\n url: `https://video.example.com/quick/${query.replace(/\\s+/g, '-')}`,\n description: `Quick explanation of ${query} in just 5 minutes. Perfect for beginners and quick reference.`,\n displayUrl: 'video.example.com',\n thumbnail: `https://video.example.com/thumb/quick-${query.replace(/\\s+/g, '-')}.jpg`,\n publishedDate: new Date('2024-01-03'),\n source: 'Example Video',\n relevanceScore: 0.86,\n },\n ];\n\n return {\n query,\n results,\n totalResults: 8765,\n searchTime: 0.31,\n };\n }\n\n async getSuggestions(query: string): Promise<string[]> {\n this.runtime.logger.debug(`Getting suggestions for: \"${query}\"`);\n\n // Mock suggestions based on query\n const suggestions = [\n `${query} tutorial`,\n `${query} guide`,\n `${query} examples`,\n `${query} best practices`,\n `${query} vs alternatives`,\n `how to ${query}`,\n `what is ${query}`,\n `${query} 2024`,\n ];\n\n return suggestions;\n }\n\n async getTrendingSearches(region?: string): Promise<string[]> {\n this.runtime.logger.debug(`Getting trending searches for region: ${region || 'global'}`);\n\n // Return shuffled trending searches\n return [...this.trendingSearches].sort(() => Math.random() - 0.5);\n }\n\n async getPageInfo(url: string): Promise<{\n title: string;\n description: string;\n content: string;\n metadata: Record<string, string>;\n images: string[];\n links: string[];\n }> {\n this.runtime.logger.debug(`Getting page info for: ${url}`);\n\n // Mock page information\n const domain = new URL(url).hostname;\n\n return {\n title: `Mock Page Title - ${domain}`,\n description: `This is a mock page description for ${url}. It provides detailed information about the page content.`,\n content: `Mock page content from ${url}.\\n\\nThis is a comprehensive analysis of the page including:\\n- Main content sections\\n- Important information\\n- Key topics covered\\n- Related resources\\n\\nThe page provides valuable insights and information for users interested in the topic.`,\n metadata: {\n 'og:title': `Mock Page Title - ${domain}`,\n 'og:description': `Mock page description for ${url}`,\n 'og:type': 'website',\n 'og:url': url,\n 'og:image': `${url}/og-image.jpg`,\n 'twitter:card': 'summary_large_image',\n 'twitter:title': `Mock Page Title - ${domain}`,\n 'twitter:description': `Mock page description for ${url}`,\n author: 'Mock Author',\n keywords: 'mock, page, content, analysis',\n },\n images: [`${url}/image1.jpg`, `${url}/image2.jpg`, `${url}/banner.jpg`],\n links: [\n `${url}/page1`,\n `${url}/page2`,\n `${url}/contact`,\n `${url}/about`,\n 'https://external-link.com',\n ],\n };\n }\n}\n","import { IAgentRuntime } from '@elizaos/core';\nimport {\n IEmailService,\n EmailAddress,\n EmailAttachment,\n EmailMessage,\n EmailSendOptions,\n EmailSearchOptions,\n EmailFolder,\n EmailAccount,\n} from '@elizaos/core';\n\n/**\n * Dummy email service for testing purposes\n * Provides mock implementations of email operations\n */\nexport class DummyEmailService extends IEmailService {\n static override readonly serviceType = IEmailService.serviceType;\n\n private mockEmails: EmailMessage[] = [];\n private mockFolders: EmailFolder[] = [\n {\n name: 'Inbox',\n path: 'INBOX',\n type: 'inbox',\n messageCount: 15,\n unreadCount: 3,\n },\n {\n name: 'Sent',\n path: 'SENT',\n type: 'sent',\n messageCount: 8,\n unreadCount: 0,\n },\n {\n name: 'Drafts',\n path: 'DRAFTS',\n type: 'drafts',\n messageCount: 2,\n unreadCount: 0,\n },\n {\n name: 'Trash',\n path: 'TRASH',\n type: 'trash',\n messageCount: 5,\n unreadCount: 0,\n },\n ];\n\n constructor(runtime: IAgentRuntime) {\n super(runtime);\n this.initializeMockEmails();\n }\n\n static async start(runtime: IAgentRuntime): Promise<DummyEmailService> {\n const service = new DummyEmailService(runtime);\n await service.initialize();\n return service;\n }\n\n async initialize(): Promise<void> {\n this.runtime.logger.info('DummyEmailService initialized');\n }\n\n async stop(): Promise<void> {\n this.runtime.logger.info('DummyEmailService stopped');\n }\n\n private initializeMockEmails(): void {\n this.mockEmails = [\n {\n from: { email: 'alice@example.com', name: 'Alice Smith' },\n to: [{ email: 'user@example.com', name: 'User' }],\n subject: 'Project Update',\n text: \"Hi! Just wanted to update you on the project progress. We've completed the first phase and are moving to the next milestone.\",\n date: new Date('2024-01-15T10:30:00Z'),\n messageId: 'msg-001',\n },\n {\n from: { email: 'bob@company.com', name: 'Bob Johnson' },\n to: [{ email: 'user@example.com', name: 'User' }],\n cc: [{ email: 'team@company.com', name: 'Team' }],\n subject: 'Meeting Tomorrow',\n text: \"Don't forget about our meeting tomorrow at 2 PM. We'll be discussing the quarterly results.\",\n date: new Date('2024-01-14T14:15:00Z'),\n messageId: 'msg-002',\n },\n {\n from: { email: 'newsletter@tech.com', name: 'Tech Newsletter' },\n to: [{ email: 'user@example.com', name: 'User' }],\n subject: 'Weekly Tech Update',\n html: '<h1>This Week in Tech</h1><p>Latest technology news and updates.</p>',\n text: 'This Week in Tech\\n\\nLatest technology news and updates.',\n date: new Date('2024-01-13T09:00:00Z'),\n messageId: 'msg-003',\n },\n ];\n }\n\n async sendEmail(message: EmailMessage, options?: EmailSendOptions): Promise<string> {\n this.runtime.logger.debug(`Sending email to ${message.to.map((t) => t.email).join(', ')}`);\n this.runtime.logger.debug(`Subject: ${message.subject}`);\n\n if (options) {\n this.runtime.logger.debug('Send options:', options);\n }\n\n // Generate a mock message ID\n const messageId = `mock-${Date.now()}-${Math.random().toString(36).substring(2, 9)}`;\n\n // Add to mock emails\n this.mockEmails.push({\n ...message,\n messageId,\n date: new Date(),\n });\n\n // Simulate sending delay\n await new Promise((resolve) => setTimeout(resolve, 100));\n\n return messageId;\n }\n\n async getEmails(options?: EmailSearchOptions): Promise<EmailMessage[]> {\n this.runtime.logger.debug('Getting emails');\n\n if (options) {\n this.runtime.logger.debug('Search options:', options);\n }\n\n let filteredEmails = [...this.mockEmails];\n\n // Apply filters\n if (options?.from) {\n filteredEmails = filteredEmails.filter(\n (email) =>\n email.from.email.includes(options.from!) || email.from.name?.includes(options.from!)\n );\n }\n\n if (options?.subject) {\n filteredEmails = filteredEmails.filter((email) =>\n email.subject.toLowerCase().includes(options.subject!.toLowerCase())\n );\n }\n\n if (options?.since) {\n filteredEmails = filteredEmails.filter((email) => email.date && email.date >= options.since!);\n }\n\n if (options?.before) {\n filteredEmails = filteredEmails.filter(\n (email) => email.date && email.date <= options.before!\n );\n }\n\n // Apply pagination\n const offset = options?.offset || 0;\n const limit = options?.limit || 50;\n\n return filteredEmails.slice(offset, offset + limit);\n }\n\n async getEmail(messageId: string): Promise<EmailMessage> {\n this.runtime.logger.debug(`Getting email with ID: ${messageId}`);\n\n const email = this.mockEmails.find((e) => e.messageId === messageId);\n if (!email) {\n throw new Error(`Email with ID ${messageId} not found`);\n }\n\n return email;\n }\n\n async deleteEmail(messageId: string): Promise<void> {\n this.runtime.logger.debug(`Deleting email with ID: ${messageId}`);\n\n const index = this.mockEmails.findIndex((e) => e.messageId === messageId);\n if (index === -1) {\n throw new Error(`Email with ID ${messageId} not found`);\n }\n\n this.mockEmails.splice(index, 1);\n }\n\n async markEmailAsRead(messageId: string, read: boolean): Promise<void> {\n this.runtime.logger.debug(`Marking email ${messageId} as ${read ? 'read' : 'unread'}`);\n\n const email = this.mockEmails.find((e) => e.messageId === messageId);\n if (!email) {\n throw new Error(`Email with ID ${messageId} not found`);\n }\n\n // In a real implementation, this would update email flags\n // For mock purposes, we just log the action\n }\n\n async flagEmail(messageId: string, flagged: boolean): Promise<void> {\n this.runtime.logger.debug(`${flagged ? 'Flagging' : 'Unflagging'} email ${messageId}`);\n\n const email = this.mockEmails.find((e) => e.messageId === messageId);\n if (!email) {\n throw new Error(`Email with ID ${messageId} not found`);\n }\n\n // In a real implementation, this would update email flags\n // For mock purposes, we just log the action\n }\n\n async moveEmail(messageId: string, folderPath: string): Promise<void> {\n this.runtime.logger.debug(`Moving email ${messageId} to folder ${folderPath}`);\n\n const email = this.mockEmails.find((e) => e.messageId === messageId);\n if (!email) {\n throw new Error(`Email with ID ${messageId} not found`);\n }\n\n const folder = this.mockFolders.find((f) => f.path === folderPath);\n if (!folder) {\n throw new Error(`Folder ${folderPath} not found`);\n }\n\n // In a real implementation, this would move the email\n // For mock purposes, we just log the action\n }\n\n async getFolders(): Promise<EmailFolder[]> {\n this.runtime.logger.debug('Getting email folders');\n return [...this.mockFolders];\n }\n\n async createFolder(folderName: string, parentPath?: string): Promise<void> {\n this.runtime.logger.debug(\n `Creating folder ${folderName}${parentPath ? ` under ${parentPath}` : ''}`\n );\n\n const newFolder: EmailFolder = {\n name: folderName,\n path: parentPath ? `${parentPath}/${folderName}` : folderName,\n type: 'custom',\n messageCount: 0,\n unreadCount: 0,\n };\n\n this.mockFolders.push(newFolder);\n }\n\n async getAccountInfo(): Promise<EmailAccount> {\n this.runtime.logger.debug('Getting account info');\n\n return {\n email: 'user@example.com',\n name: 'Mock User',\n provider: 'MockProvider',\n folders: [...this.mockFolders],\n quotaUsed: 512000000, // 512 MB\n quotaLimit: 1073741824, // 1 GB\n };\n }\n\n async searchEmails(query: string, options?: EmailSearchOptions): Promise<EmailMessage[]> {\n this.runtime.logger.debug(`Searching emails with query: \"${query}\"`);\n\n if (options) {\n this.runtime.logger.debug('Search options:', options);\n }\n\n const filteredEmails = this.mockEmails.filter((email) => {\n const searchText = `${email.subject} ${email.text || ''} ${email.html || ''} ${email.from.name || ''} ${email.from.email}`;\n return searchText.toLowerCase().includes(query.toLowerCase());\n });\n\n // Apply additional filters from options\n let results = filteredEmails;\n\n if (options?.from) {\n results = results.filter(\n (email) =>\n email.from.email.includes(options.from!) || email.from.name?.includes(options.from!)\n );\n }\n\n if (options?.since) {\n results = results.filter((email) => email.date && email.date >= options.since!);\n }\n\n if (options?.before) {\n results = results.filter((email) => email.date && email.date <= options.before!);\n }\n\n // Apply pagination\n const offset = options?.offset || 0;\n const limit = options?.limit || 50;\n\n return results.slice(offset, offset + limit);\n }\n}\n","import type { IAgentRuntime, TestSuite, IWalletService } from '@elizaos/core';\nimport { ILpService, ServiceType, logger } from '@elizaos/core';\nimport { strict as assert } from 'node:assert';\nimport { DummyLpService } from '../lp/service';\nimport { DummyTokenDataService } from '../tokenData/service';\nimport { DummyWalletService } from '../wallet/service';\nimport { setupScenario } from './test-utils';\n\nexport const dummyServicesScenariosSuite: TestSuite = {\n name: 'Dummy Services Plugin E2E Scenarios',\n tests: [\n {\n name: 'Scenario 1: Should initialize dummy services and verify they are available',\n fn: async (runtime: IAgentRuntime) => {\n logger.info('Testing dummy services initialization...');\n\n // Check DummyLpService\n const lpService = runtime.getService<DummyLpService>(ILpService.serviceType);\n assert(lpService, 'DummyLpService not found in runtime');\n assert.equal(\n lpService.getDexName(),\n 'dummy',\n 'DummyLpService should have correct DEX name'\n );\n\n // Check DummyTokenDataService\n const tokenDataService = runtime.getService<DummyTokenDataService>(\n DummyTokenDataService.serviceType\n );\n assert(tokenDataService, 'DummyTokenDataService not found in runtime');\n\n logger.info('Successfully verified both dummy services are initialized and available.');\n },\n },\n {\n name: 'Scenario 2: Should fetch pools from DummyLpService',\n fn: async (runtime: IAgentRuntime) => {\n const lpService = runtime.getService<DummyLpService>(ILpService.serviceType);\n assert(lpService, 'DummyLpService not found');\n\n logger.info('Fetching all pools from DummyLpService...');\n const allPools = await lpService.getPools();\n assert(Array.isArray(allPools), 'getPools should return an array');\n assert.equal(allPools.length, 2, 'Should return 2 dummy pools');\n\n // Verify pool structure\n const pool1 = allPools.find((p) => p.id === 'dummy-pool-1');\n assert(pool1, 'dummy-pool-1 should exist');\n assert.equal(pool1.dex, 'dummy', 'Pool should have correct DEX');\n assert.equal(pool1.tokenA.symbol, 'SOL', 'Pool should have SOL as tokenA');\n assert.equal(pool1.tokenB.symbol, 'USDC', 'Pool should have USDC as tokenB');\n assert.equal(pool1.tvl, 1234567.89, 'Pool should have correct TVL');\n\n logger.info('Successfully fetched and verified pool data.');\n },\n },\n {\n name: 'Scenario 3: Should filter pools by token mint',\n fn: async (runtime: IAgentRuntime) => {\n const lpService = runtime.getService<DummyLpService>(ILpService.serviceType);\n assert(lpService, 'DummyLpService not found');\n\n const solMint = 'So11111111111111111111111111111111111111112';\n logger.info(`Filtering pools containing SOL (${solMint})...`);\n\n const solPools = await lpService.getPools(solMint);\n assert(Array.isArray(solPools), 'getPools with filter should return an array');\n assert(solPools.length > 0, 'Should find pools containing SOL');\n\n // Verify all returned pools contain SOL\n solPools.forEach((pool) => {\n const containsSol = pool.tokenA.mint === solMint || pool.tokenB.mint === solMint;\n assert(containsSol, `Pool ${pool.id} should contain SOL`);\n });\n\n logger.info(`Found ${solPools.length} pools containing SOL.`);\n },\n },\n {\n name: 'Scenario 4: Should add liquidity to a dummy pool',\n fn: async (runtime: IAgentRuntime) => {\n const lpService = runtime.getService<DummyLpService>(ILpService.serviceType);\n assert(lpService, 'DummyLpService not found');\n\n // Create a mock vault object\n const mockVault = { publicKey: 'dummy-public-key', secretKey: 'dummy-secret-key' };\n\n logger.info('Testing add liquidity to dummy-pool-1...');\n const result = await lpService.addLiquidity({\n userVault: mockVault,\n poolId: 'dummy-pool-1',\n tokenAAmountLamports: '1000000000', // 1 SOL\n slippageBps: 100, // 1% slippage\n });\n\n assert.equal(result.success, true, 'Add liquidity should succeed');\n assert(result.transactionId, 'Should have a transaction ID');\n assert.match(result.transactionId, /^dummy-tx-/, 'Transaction ID should have dummy prefix');\n assert(result.lpTokensReceived, 'Should receive LP tokens');\n assert.equal(\n result.lpTokensReceived?.symbol,\n 'DUMMY-LP',\n 'LP token should have correct symbol'\n );\n assert.equal(\n result.lpTokensReceived?.address,\n 'dummy-lp-mint-dummy-pool-1',\n 'LP token should have correct address'\n );\n\n logger.info('Successfully added liquidity:', result);\n },\n },\n {\n name: 'Scenario 5: Should remove liquidity from a dummy pool',\n fn: async (runtime: IAgentRuntime) => {\n const lpService = runtime.getService<DummyLpService>(ILpService.serviceType);\n assert(lpService, 'DummyLpService not found');\n\n // Create a mock vault object\n const mockVault = { publicKey: 'dummy-public-key-2', secretKey: 'dummy-secret-key-2' };\n\n logger.info('Testing remove liquidity from dummy-pool-1...');\n const result = await lpService.removeLiquidity({\n userVault: mockVault,\n poolId: 'dummy-pool-1',\n lpTokenAmountLamports: '1000000', // 1 LP token\n slippageBps: 50, // 0.5% slippage\n });\n\n assert.equal(result.success, true, 'Remove liquidity should succeed');\n assert(result.transactionId, 'Should have a transaction ID');\n assert.match(result.transactionId, /^dummy-tx-/, 'Transaction ID should have dummy prefix');\n assert(result.tokensReceived, 'Should receive tokens');\n assert.equal(result.tokensReceived.length, 2, 'Should receive 2 tokens');\n\n // Verify underlying tokens\n const solToken = result.tokensReceived.find((t) => t.symbol === 'SOL');\n const usdcToken = result.tokensReceived.find((t) => t.symbol === 'USDC');\n assert(solToken, 'Should receive SOL');\n assert(usdcToken, 'Should receive USDC');\n assert.equal(solToken.uiAmount, 0.5, 'Should receive 0.5 SOL');\n assert.equal(usdcToken.uiAmount, 500, 'Should receive 500 USDC');\n\n logger.info('Successfully removed liquidity:', result);\n },\n },\n {\n name: 'Scenario 6: Should get LP position details',\n fn: async (runtime: IAgentRuntime) => {\n const lpService = runtime.getService<DummyLpService>(ILpService.serviceType);\n assert(lpService, 'DummyLpService not found');\n\n const userPublicKey = 'HtiYLjY9dGMrmpwjDcGmxQCo2VsCCAQiBgt5xPLanTJa';\n const lpMint = 'dummy-lp-mint-dummy-pool-1';\n\n logger.info(`Getting LP position details for user ${userPublicKey}...`);\n const position = await lpService.getLpPositionDetails(userPublicKey, lpMint);\n\n assert(position, 'Should return LP position details');\n assert.equal(position.poolId, 'dummy-pool-1', 'Position should reference correct pool');\n assert.equal(position.dex, 'dummy', 'Position should have correct DEX');\n assert.equal(position.valueUsd, 1000, 'Position should have correct USD value');\n\n // Verify LP token balance\n assert(position.lpTokenBalance, 'Should have LP token balance');\n assert.equal(\n position.lpTokenBalance.symbol,\n 'DUMMY-LP',\n 'LP token should have correct symbol'\n );\n assert.equal(position.lpTokenBalance.uiAmount, 100, 'Should have 100 LP tokens');\n\n // Verify underlying tokens\n assert(position.underlyingTokens, 'Should have underlying tokens');\n assert.equal(position.underlyingTokens.length, 2, 'Should have 2 underlying tokens');\n\n const sol = position.underlyingTokens.find((t) => t.symbol === 'SOL');\n const usdc = position.underlyingTokens.find((t) => t.symbol === 'USDC');\n assert(sol, 'Should have SOL in underlying tokens');\n assert(usdc, 'Should have USDC in underlying tokens');\n assert.equal(sol.uiAmount, 0.5, 'Should have 0.5 SOL');\n assert.equal(usdc.uiAmount, 500, 'Should have 500 USDC');\n\n logger.info('Successfully retrieved LP position details:', position);\n },\n },\n {\n name: 'Scenario 7: Should get market data for pools',\n fn: async (runtime: IAgentRuntime) => {\n const lpService = runtime.getService<DummyLpService>(ILpService.serviceType);\n assert(lpService, 'DummyLpService not found');\n\n const poolIds = ['dummy-pool-1', 'dummy-stable-pool-2'];\n logger.info(`Getting market data for pools: ${poolIds.join(', ')}...`);\n\n const marketData = await lpService.getMarketDataForPools(poolIds);\n assert(marketData, 'Should return market data');\n assert.equal(Object.keys(marketData).length, 2, 'Should have data for 2 pools');\n\n // Verify market data structure\n poolIds.forEach((poolId) => {\n const data = marketData[poolId];\n assert(data, `Should have market data for ${poolId}`);\n assert(typeof data.tvl === 'number', 'Should have TVL');\n assert(typeof data.apy === 'number', 'Should have APY');\n assert(typeof data.apr === 'number', 'Should have APR');\n\n // Verify reasonable ranges\n assert(data.tvl >= 0, 'TVL should be non-negative');\n assert(data.apy >= 0 && data.apy <= 1, 'APY should be between 0 and 1');\n assert(data.apr >= 0 && data.apr <= 1, 'APR should be between 0 and 1');\n });\n\n logger.info('Successfully retrieved market data:', marketData);\n },\n },\n {\n name: 'Scenario 8: Should fetch token data from DummyTokenDataService',\n fn: async (runtime: IAgentRuntime) => {\n const tokenDataService = runtime.getService<DummyTokenDataService>(\n DummyTokenDataService.serviceType\n );\n assert(tokenDataService, 'DummyTokenDataService not found');\n\n const solMint = 'So11111111111111111111111111111111111111112';\n logger.info(`Fetching token data for SOL (${solMint})...`);\n\n const tokenData = await tokenDataService.getTokenDetails(solMint, 'solana');\n assert(tokenData, 'Should return token data');\n assert(tokenData.symbol, 'Should have symbol');\n assert(tokenData.name, 'Should have name');\n assert.equal(tokenData.decimals, 18, 'Should have decimals');\n assert(typeof tokenData.price === 'number', 'Should have price');\n\n logger.info('Successfully fetched token data:', tokenData);\n },\n },\n {\n name: 'Scenario 9: Should test trending tokens',\n fn: async (runtime: IAgentRuntime) => {\n const tokenDataService = runtime.getService<DummyTokenDataService>(\n DummyTokenDataService.serviceType\n );\n assert(tokenDataService, 'DummyTokenDataService not found');\n\n logger.info('Fetching trending tokens...');\n\n const trendingTokens = await tokenDataService.getTrendingTokens('solana', 5);\n assert(Array.isArray(trendingTokens), 'Should return array of trending tokens');\n assert.equal(trendingTokens.length, 5, 'Should return requested number of tokens');\n\n trendingTokens.forEach((token, i) => {\n assert(token.symbol, `Token ${i} should have symbol`);\n assert(token.name, `Token ${i} should have name`);\n assert(typeof token.price === 'number', `Token ${i} should have price`);\n });\n\n logger.info('Successfully fetched trending tokens.');\n },\n },\n {\n name: 'Scenario 10: Integration test - LP service with custom pool configuration',\n fn: async (runtime: IAgentRuntime) => {\n const lpService = runtime.getService<DummyLpService>(ILpService.serviceType);\n assert(lpService, 'DummyLpService not found');\n\n // Test that we can work with both pools\n logger.info('Testing integration with multiple pools...');\n\n // Get all pools\n const allPools = await lpService.getPools();\n assert.equal(allPools.length, 2, 'Should have 2 pools');\n\n // Test operations on each pool\n for (const pool of allPools) {\n logger.info(`Testing operations on pool ${pool.id}...`);\n\n // Add liquidity\n const addResult = await lpService.addLiquidity({\n userVault: {} as any,\n poolId: pool.id,\n tokenAAmountLamports: '1000000000',\n slippageBps: 100,\n });\n assert.equal(addResult.success, true, `Add liquidity should succeed for ${pool.id}`);\n\n // Remove liquidity\n const removeResult = await lpService.removeLiquidity({\n userVault: {} as any,\n poolId: pool.id,\n lpTokenAmountLamports: '1000000',\n slippageBps: 50,\n });\n assert.equal(\n removeResult.success,\n true,\n `Remove liquidity should succeed for ${pool.id}`\n );\n }\n\n logger.info('Successfully tested operations on all pools.');\n },\n },\n {\n name: 'Scenario 11: Should initialize wallet service and verify functionality',\n fn: async (runtime: IAgentRuntime) => {\n logger.info('Testing wallet service initialization...');\n\n // Check DummyWalletService\n const walletService = runtime.getService<DummyWalletService>(ServiceType.WALLET);\n assert(walletService, 'DummyWalletService not found in runtime');\n\n // Test initial balance\n const initialBalance = await walletService.getBalance('USDC');\n assert.equal(initialBalance, 10000, 'Should have initial USDC balance of 10000');\n\n logger.info('Successfully verified wallet service is initialized.');\n },\n },\n {\n name: 'Scenario 12: Should test wallet operations',\n fn: async (runtime: IAgentRuntime) => {\n const walletService = runtime.getService<DummyWalletService>(ServiceType.WALLET);\n assert(walletService, 'DummyWalletService not found');\n\n logger.info('Testing wallet operations...');\n\n // Add funds\n await walletService.addFunds('SOL', 5);\n const solBalance = await walletService.getBalance('SOL');\n assert.equal(solBalance, 5, 'Should have 5 SOL after adding funds');\n\n // Get portfolio\n const portfolio = await walletService.getPortfolio();\n assert(portfolio.totalValueUsd > 0, 'Portfolio should have positive total value');\n assert(Array.isArray(portfolio.assets), 'Portfolio should have assets array');\n assert(portfolio.assets.length >= 2, 'Portfolio should have at least 2 assets');\n\n // Find SOL in portfolio\n const solAsset = portfolio.assets.find((a) => a.symbol === 'SOL');\n assert(solAsset, 'SOL should be in portfolio');\n assert.equal(solAsset.balance, '5', 'SOL balance string should be \"5\"');\n\n logger.info('Successfully tested wallet operations.');\n },\n },\n {\n name: 'Scenario 13: Should test SOL transfers',\n fn: async (runtime: IAgentRuntime) => {\n const walletService = runtime.getService<DummyWalletService>(ServiceType.WALLET);\n assert(walletService, 'DummyWalletService not found');\n\n logger.info('Testing SOL transfer functionality...');\n\n // Reset wallet to ensure clean state\n await walletService.resetWallet(10000, 'USDC');\n\n // Add SOL to wallet\n await walletService.addFunds('SOL', 10);\n\n // Transfer some SOL\n const txHash = await walletService.transferSol('dummy-from', 'dummy-to', 3e9); // 3 SOL\n assert(txHash, 'Should return transaction hash');\n assert.match(txHash, /^dummy-tx-/, 'Transaction hash should have dummy prefix');\n\n // Check remaining balance\n const remainingBalance = await walletService.getBalance('SOL');\n assert.equal(remainingBalance, 7, 'Should have 7 SOL remaining after transfer');\n\n // Test insufficient balance\n try {\n await walletService.transferSol('dummy-from', 'dummy-to', 10e9); // 10 SOL\n assert.fail('Should throw error for insufficient balance');\n } catch (error: any) {\n assert.match(\n error.message,\n /Insufficient SOL balance/,\n 'Should throw insufficient balance error'\n );\n }\n\n logger.info('Successfully tested SOL transfers.');\n },\n },\n ],\n};\n\nexport default dummyServicesScenariosSuite;\n","import { type Plugin } from '@elizaos/core';\nimport { DummyTokenDataService } from './tokenData/service';\nimport { DummyLpService } from './lp/service';\nimport { DummyWalletService } from './wallet/service';\nimport { DummyPdfService } from './pdf/service';\nimport { DummyVideoService } from './video/service';\nimport { DummyBrowserService } from './browser/service';\nimport { DummyTranscriptionService } from './transcription/service';\nimport { DummyWebSearchService } from './web-search/service';\nimport { DummyEmailService } from './email/service';\nimport { dummyServicesScenariosSuite } from './e2e/scenarios';\n\nexport const dummyServicesPlugin: Plugin = {\n name: 'dummy-services',\n description: 'Load standard dummy services for testing purposes.',\n services: [\n DummyTokenDataService,\n DummyLpService,\n DummyWalletService,\n DummyPdfService,\n DummyVideoService,\n DummyBrowserService,\n DummyTranscriptionService,\n DummyWebSearchService,\n DummyEmailService,\n ],\n tests: [dummyServicesScenariosSuite],\n init: async (runtime) => {\n console.log('Dummy Services Plugin Initialized');\n },\n};\n\nexport default dummyServicesPlugin;\n\n// Export services for direct use\nexport {\n DummyTokenDataService,\n DummyLpService,\n DummyWalletService,\n DummyPdfService,\n DummyVideoService,\n DummyBrowserService,\n DummyTranscriptionService,\n DummyWebSearchService,\n DummyEmailService,\n};\n"],"mappings":"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","names":["ServiceType","ServiceType","ILpService","ServiceType","logger","logger","ILpService","ServiceType"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@elizaos/plugin-dummy-services",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.4.2",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"main": "dist/index.js",
|
|
6
6
|
"module": "dist/index.js",
|
|
@@ -22,7 +22,7 @@
|
|
|
22
22
|
"dist"
|
|
23
23
|
],
|
|
24
24
|
"dependencies": {
|
|
25
|
-
"@elizaos/core": "1.
|
|
25
|
+
"@elizaos/core": "1.4.2",
|
|
26
26
|
"uuid": "^9.0.0"
|
|
27
27
|
},
|
|
28
28
|
"devDependencies": {
|
|
@@ -45,7 +45,7 @@
|
|
|
45
45
|
"publishConfig": {
|
|
46
46
|
"access": "public"
|
|
47
47
|
},
|
|
48
|
-
"gitHead": "
|
|
48
|
+
"gitHead": "f60dd270910361decc4d4e879e8b2f33c5ddfee2",
|
|
49
49
|
"agentConfig": {
|
|
50
50
|
"pluginType": "elizaos:plugin:1.0.0",
|
|
51
51
|
"pluginParameters": {
|