From 0ad1264d64e7ddb662b2234632872667bf9a3413 Mon Sep 17 00:00:00 2001 From: Shaw Date: Mon, 10 Feb 2025 20:48:34 -0500 Subject: [PATCH] migrate tee logs --- bun.lockb | Bin 1400360 -> 1375096 bytes packages/agent/src/api.ts | 99 ++++++ packages/core/src/types.ts | 118 +++++++ packages/plugin-tee/.npmignore | 6 + packages/plugin-tee/README.md | 136 ++++++++ packages/plugin-tee/biome.json | 41 +++ packages/plugin-tee/package.json | 29 ++ .../src/__tests__/deriveKey.test.ts | 111 ++++++ .../src/__tests__/remoteAttestation.test.ts | 81 +++++ .../__tests__/remoteAttestationAction.test.ts | 103 ++++++ .../plugin-tee/src/__tests__/timeout.test.ts | 117 +++++++ packages/plugin-tee/src/adapters/sqliteDAO.ts | 125 +++++++ .../plugin-tee/src/adapters/sqliteTables.ts | 26 ++ packages/plugin-tee/src/index.ts | 34 ++ .../src/providers/deriveKeyProvider.ts | 228 ++++++++++++ .../providers/remoteAttestationProvider.ts | 106 ++++++ .../src/providers/sgxAttestationProvider.ts | 105 ++++++ .../src/providers/walletProvider.ts | 326 ++++++++++++++++++ .../plugin-tee/src/services/teeLogManager.ts | 105 ++++++ .../plugin-tee/src/services/teeLogService.ts | 124 +++++++ packages/plugin-tee/src/types.ts | 66 ++++ packages/plugin-tee/tsconfig.json | 13 + packages/plugin-tee/tsup.config.ts | 21 ++ 23 files changed, 2120 insertions(+) create mode 100644 packages/plugin-tee/.npmignore create mode 100644 packages/plugin-tee/README.md create mode 100644 packages/plugin-tee/biome.json create mode 100644 packages/plugin-tee/package.json create mode 100644 packages/plugin-tee/src/__tests__/deriveKey.test.ts create mode 100644 packages/plugin-tee/src/__tests__/remoteAttestation.test.ts create mode 100644 packages/plugin-tee/src/__tests__/remoteAttestationAction.test.ts create mode 100644 packages/plugin-tee/src/__tests__/timeout.test.ts create mode 100644 packages/plugin-tee/src/adapters/sqliteDAO.ts create mode 100644 packages/plugin-tee/src/adapters/sqliteTables.ts create mode 100644 packages/plugin-tee/src/index.ts create mode 100644 packages/plugin-tee/src/providers/deriveKeyProvider.ts create mode 100644 packages/plugin-tee/src/providers/remoteAttestationProvider.ts create mode 100644 packages/plugin-tee/src/providers/sgxAttestationProvider.ts create mode 100644 packages/plugin-tee/src/providers/walletProvider.ts create mode 100644 packages/plugin-tee/src/services/teeLogManager.ts create mode 100644 packages/plugin-tee/src/services/teeLogService.ts create mode 100644 packages/plugin-tee/src/types.ts create mode 100644 packages/plugin-tee/tsconfig.json create mode 100644 packages/plugin-tee/tsup.config.ts diff --git a/bun.lockb b/bun.lockb index 5dffd68ce80ea9e641a5c7e8c5cad3e3d3c80e1f..9eda4ab2b6584bc2f5db2a93eb0f41c19e06729c 100755 GIT binary patch delta 242852 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ᘻ%(tbhgu58PaIhsVsieFs5&P`5P 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 O#IkN-S^2M#BmV`s@v|-f delta 259959 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/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 { + try { + const allAgents = []; + + for (const agentRuntime of agents.values()) { + const teeLogService = agentRuntime + .getService(ServiceType.TEE) + .getInstance(); + + const agents = await teeLogService.getAllAgents(); + allAgents.push(...agents); + } + + const runtime: IAgentRuntime = agents.values().next().value; + const teeLogService = runtime + .getService(ServiceType.TEE) + .getInstance() as ITeeLogService; + const attestation = await teeLogService.generateAttestation( + JSON.stringify(allAgents) + ); + res.json({ agents: allAgents, attestation: attestation }); + } catch (error) { + logger.error("Failed to get TEE agents:", error); + res.status(500).json({ + error: "Failed to get TEE agents", + }); + } + }); + + router.get("/tee/agents/:agentId", async (req, res) => { + try { + const agentId = req.params.agentId; + const agentRuntime = agents.get(agentId); + if (!agentRuntime) { + res.status(404).json({ error: "Agent not found" }); + return; + } + + const teeLogService = agentRuntime + .getService(ServiceType.TEE) + .getInstance(); + + const teeAgent = await teeLogService.getAgent(agentId); + const attestation = await teeLogService.generateAttestation( + JSON.stringify(teeAgent) + ); + res.json({ agent: teeAgent, attestation: attestation }); + } catch (error) { + logger.error("Failed to get TEE agent:", error); + res.status(500).json({ + error: "Failed to get TEE agent", + }); + } + }); + + router.post( + "/tee/logs", + async (req: express.Request, res: express.Response) => { + try { + const query = req.body.query || {}; + const page = Number.parseInt(req.body.page) || 1; + const pageSize = Number.parseInt(req.body.pageSize) || 10; + + const teeLogQuery: TeeLogQuery = { + agentId: query.agentId || "", + roomId: query.roomId || "", + userId: query.userId || "", + type: query.type || "", + containsContent: query.containsContent || "", + startTimestamp: query.startTimestamp || undefined, + endTimestamp: query.endTimestamp || undefined, + }; + const agentRuntime: IAgentRuntime = agents.values().next().value; + const teeLogService = agentRuntime + .getService(ServiceType.TEE); + const pageQuery = await teeLogService.getLogs( + teeLogQuery, + page, + pageSize + ); + const attestation = await teeLogService.generateAttestation( + JSON.stringify(pageQuery) + ); + res.json({ + logs: pageQuery, + attestation: attestation, + }); + } catch (error) { + logger.error("Failed to get TEE logs:", error); + res.status(500).json({ + error: "Failed to get TEE logs", + }); + } + } + ); + return router; } diff --git a/packages/core/src/types.ts b/packages/core/src/types.ts index 243f8908f34..4fd2bb6d84e 100644 --- a/packages/core/src/types.ts +++ b/packages/core/src/types.ts @@ -141,6 +141,7 @@ export enum ServiceType { REMOTE_FILES = "aws_s3", WEB_SEARCH = "web_search", EMAIL = "email", + TEE = "tee", } /** @@ -1105,6 +1106,23 @@ export interface IFileService extends Service { generateSignedUrl(fileName: string, expiresIn: number): Promise; } +export interface ITeeLogService extends Service { + getInstance(): ITeeLogService; + log( + agentId: string, + roomId: string, + userId: string, + type: string, + content: string, + ): Promise; + + generateAttestation(reportData: string, hashAlgorithm?: T | any): Promise; + getAllAgents(): Promise; + getAgent(agentId: string): Promise; + getLogs(query: TeeLogQuery, page: number, pageSize: number): Promise>; + +} + export interface TestCase { name: string; fn: (runtime: IAgentRuntime) => Promise | void; @@ -1113,4 +1131,104 @@ export interface TestCase { export interface TestSuite { name: string; tests: TestCase[]; +} + +// Represents a log entry in the TeeLog table, containing details about agent activities. +export interface TeeLog { + id: string; + agentId: string; + roomId: string; + userId: string; + type: string; + content: string; + timestamp: number; + signature: string; +} + +export interface TeeLogQuery { + agentId?: string; + roomId?: string; + userId?: string; + type?: string; + containsContent?: string; + startTimestamp?: number; + endTimestamp?: number; +} + +// Represents an agent in the TeeAgent table, containing details about the agent. +export interface TeeAgent { + id: string; // Primary key + // Allow duplicate agentId. + // This is to support the case where the same agentId is registered multiple times. + // Each time the agent restarts, we will generate a new keypair and attestation. + agentId: string; + agentName: string; + createdAt: number; + publicKey: string; + attestation: string; +} + +export interface TeePageQuery { + page: number; + pageSize: number; + total?: number; + data?: Result; +} + +export abstract class TeeLogDAO { + db: DB; + + abstract initialize(): Promise; + + abstract addLog(log: TeeLog): Promise; + + abstract getPagedLogs( + query: TeeLogQuery, + page: number, + pageSize: number + ): Promise>; + + abstract addAgent(agent: TeeAgent): Promise; + + abstract getAgent(agentId: string): Promise; + + abstract getAllAgents(): Promise; +} + +export enum TEEMode { + OFF = "OFF", + LOCAL = "LOCAL", // For local development with simulator + DOCKER = "DOCKER", // For docker development with simulator + PRODUCTION = "PRODUCTION", // For production without simulator +} + +export interface RemoteAttestationQuote { + quote: string; + timestamp: number; +} + +export interface DeriveKeyAttestationData { + agentId: string; + publicKey: string; + subject?: string; +} + +export interface RemoteAttestationMessage { + agentId: string; + timestamp: number; + message: { + userId: string; + roomId: string; + content: string; + } +} + +export interface SgxAttestation { + quote: string; + timestamp: number; +} + +export enum TeeType { + SGX_GRAMINE = "sgx_gramine", + TDX_DSTACK = "tdx_dstack", } \ No newline at end of file diff --git a/packages/plugin-tee/.npmignore b/packages/plugin-tee/.npmignore new file mode 100644 index 00000000000..078562eceab --- /dev/null +++ b/packages/plugin-tee/.npmignore @@ -0,0 +1,6 @@ +* + +!dist/** +!package.json +!readme.md +!tsup.config.ts \ No newline at end of file diff --git a/packages/plugin-tee/README.md b/packages/plugin-tee/README.md new file mode 100644 index 00000000000..cd8207b7c62 --- /dev/null +++ b/packages/plugin-tee/README.md @@ -0,0 +1,136 @@ +# TEE Log Plugin for Eliza + +The TEE Log Plugin for Eliza is designed to enhance the logging capabilities of the Eliza by providing a structured way to generate, store and verify TEE (Trusted Execution Environment) logs for agents. This plugin ensures that all sensitive interactions are securely logged, providing a transparent and tamper-resistant record of all sensitive activities. + +## Background + +As Eliza is a fully autonomous AI agent capable of running within a TEE, we need to demonstrate to the outside world that we are indeed operating within a TEE. This allows external parties to verify that our actions are protected by the TEE and that they are autonomously executed by Eliza, without any third-party interference. Therefore, it is necessary to leverage TEE's remote attestation and establish a TEE logging mechanism to prove that these operations are entirely and autonomously performed by Eliza within the TEE. + +## Requirements + +Since the TEE Logging is based on the TEE, it is necessary to have a TEE enabled environment. Currently, we support Intel SGX (Gramine) and Intel TDX (dstack). +- using Intel SGX (Gramine), you need to enable the plugin-sgx in the Eliza runtime, which is enabled in SGX env automatically. +- using Intel TDX (dstack), you need to enable the plugin-tee in the Eliza runtime. + +## TEE Logging Mechanism + +## TEE Logging Mechanism + +1. **Key Pair Generation and Attestation**: + - During startup, each agent generates a key pair and creates a remote attestation for the public key. The private key is securely stored in the TEE's encrypted memory. The agent's relevant information, along with the public key and attestation, is recorded in a local database. A new key pair is generated each time the agent is updated or restarted to ensure key security. + +2. **Log Recording**: + - For each log entry, basic information is recorded, including `agentId`, `roomId`, `userId`, `type`, `content`, and `timestamp`. This information is concatenated and signed using the agent's corresponding private key to ensure verifiability. The verification process follows this trust chain: + - Verify the attestation. + - Trust the public key contained in the attestation. + - Use the public key to verify the signature. + - Trust the complete log record. + +3. **Data Storage**: + - All log data must be stored in the TEE's encrypted file system in production environments. Storing data in plaintext is prohibited to prevent tampering. + +4. **Log Extraction for Verification**: + - Third parties can extract TEE logs for verification purposes. Two types of information can be extracted: + - **Agent Information**: This includes the agent's metadata, public key, and attestation, which can be used to verify the agent's public key. + - **Log Information**: Required logs can be extracted, with the agent's attestation and public key used to verify the signature, ensuring that each record remains untampered. + +5. **Integrity Protection**: + - When users extract TEE logs via the REST API, the results are hashed, and an attestation is generated. After extraction, users can verify the attestation by comparing the hash value contained within it to the extracted results, thereby ensuring the integrity of the data. + +## Services + +- **[TeeLogService]**: This service is responsible for generating and storing TEE logs for agents. + +### Class: TeeLogService + +The `TeeLogService` class implements the `ITeeLogService` interface and extends the `Service` class. It manages the logging of sensitive interactions within a Trusted Execution Environment (TEE). + +#### Methods + +- **getInstance()**: `TeeLogService` + - Returns the singleton instance of the `TeeLogService`. + +- **static get serviceType()**: `ServiceType` + - Returns the service type for TEE logging. + +- **async initialize(runtime: IAgentRuntime): Promise** + - Initializes the TEE log service. It checks the runtime settings to configure the TEE type and enables logging if configured. + +- **async log(agentId: string, roomId: string, userId: string, type: string, content: string): Promise** + - Logs an interaction with the specified parameters. Returns `false` if TEE logging is not enabled. + +- **async getAllAgents(): Promise** + - Retrieves all agents that have been logged. Returns an empty array if TEE logging is not enabled. + +- **async getAgent(agentId: string): Promise** + - Retrieves the details of a specific agent by their ID. Returns `undefined` if TEE logging is not enabled. + +- **async getLogs(query: TeeLogQuery, page: number, pageSize: number): Promise>** + - Retrieves logs based on the provided query parameters. Returns an empty result if TEE logging is not enabled. + +- **async generateAttestation(userReport: string): Promise** + - Generates an attestation based on the provided user report. + +### Storage + +The TEE logs are stored in a SQLite database, which is located at `./data/tee_log.sqlite`. The database is automatically created when the service is initialized. + +Important: You need to use the encrypted file system to store the database file in production, otherwise the database will be compromised. Since TEE only protects memory-in-use, the disk is not protected by the TEE. However, Many TEE development tools support the encrypted file system, for example, you can refer to the [Gramine Encrypted files](https://gramine.readthedocs.io/en/latest/manifest-syntax.html#encrypted-files) documentation for more information. + +### Usage + +To use the `TeeLogService`, ensure that the TEE environment is properly configured and initialized. + +Enable the TEE logging in the Eliza .env file: + +```env +TEE_LOG_ENABLED=true +``` + +The logging isn't integrated for actions by default, you need to integrate the logging for the actions you want to log. For example, if you want to log the `Continue` action of plugin-bootstrap, you can do the following: + +First, add plugin-tee-log to the dependencies of plugin-bootstrap: + +```json +"@elizaos/plugin-tee-log": "workspace:*", +``` + +Then, add the following code to the `Continue` action: + +```typescript +import { + ServiceType, + ITeeLogService, +} from "@elizaos/core"; + + +// In the handler of the action + handler: async ( + runtime: IAgentRuntime, + message: Memory, + state: State, + options: any, + callback: HandlerCallback + ) => { + // Continue the action + + // Log the action + const teeLogService = runtime + .getService(ServiceType.TEE_LOG) + .getInstance(); + if (teeLogService.log( + runtime.agentId, + message.roomId, + message.userId, + "The type of the log, for example, Action:CONTINUE", + "The content that you want to log" + ) + ) { + console.log("Logged TEE log successfully"); + } + + // Continue the action + } +``` + +After configuring the logging for the action, you can run the Eliza and see the logs through the client-direct REST API. See more details in the [Client-Direct REST API](../client-direct/src/README.md) documentation. \ No newline at end of file diff --git a/packages/plugin-tee/biome.json b/packages/plugin-tee/biome.json new file mode 100644 index 00000000000..818716a6219 --- /dev/null +++ b/packages/plugin-tee/biome.json @@ -0,0 +1,41 @@ +{ + "$schema": "https://biomejs.dev/schemas/1.5.3/schema.json", + "organizeImports": { + "enabled": false + }, + "linter": { + "enabled": true, + "rules": { + "recommended": true, + "correctness": { + "noUnusedVariables": "error" + }, + "suspicious": { + "noExplicitAny": "error" + }, + "style": { + "useConst": "error", + "useImportType": "off" + } + } + }, + "formatter": { + "enabled": true, + "indentStyle": "space", + "indentWidth": 4, + "lineWidth": 100 + }, + "javascript": { + "formatter": { + "quoteStyle": "single", + "trailingCommas": "es5" + } + }, + "files": { + "ignore": [ + "dist/**/*", + "extra/**/*", + "node_modules/**/*" + ] + } +} \ No newline at end of file diff --git a/packages/plugin-tee/package.json b/packages/plugin-tee/package.json new file mode 100644 index 00000000000..756e41297fd --- /dev/null +++ b/packages/plugin-tee/package.json @@ -0,0 +1,29 @@ +{ + "name": "@elizaos/plugin-tee", + "version": "0.25.6-alpha.1", + "main": "dist/index.js", + "type": "module", + "types": "dist/index.d.ts", + "dependencies": { + "@elizaos/core": "workspace:*", + "@phala/dstack-sdk": "^0.1.7", + "better-sqlite3": "11.8.1", + "elliptic": "6.6.1" + }, + "devDependencies": { + "@biomejs/biome": "1.5.3", + "@types/node": "^20.0.0", + "tsup": "^8.3.5" + }, + "scripts": { + "build": "tsup --format esm --dts", + "dev": "tsup --format esm --dts --watch", + "lint": "biome check src/", + "lint:fix": "biome check --apply src/", + "format": "biome format src/", + "format:fix": "biome format --write src/" + }, + "publishConfig": { + "access": "public" + } +} diff --git a/packages/plugin-tee/src/__tests__/deriveKey.test.ts b/packages/plugin-tee/src/__tests__/deriveKey.test.ts new file mode 100644 index 00000000000..deabae7bcaf --- /dev/null +++ b/packages/plugin-tee/src/__tests__/deriveKey.test.ts @@ -0,0 +1,111 @@ +import { describe, it, expect, vi, beforeEach } from 'vitest'; +import { DeriveKeyProvider } from '../src/providers/deriveKeyProvider'; +import { TappdClient } from '@phala/dstack-sdk'; +import { TEEMode } from '../src/types/tee'; + +// Mock dependencies +vi.mock('@phala/dstack-sdk', () => ({ + TappdClient: vi.fn().mockImplementation(() => ({ + deriveKey: vi.fn().mockResolvedValue({ + asUint8Array: () => new Uint8Array([1, 2, 3, 4, 5]) + }), + tdxQuote: vi.fn().mockResolvedValue({ + quote: 'mock-quote-data', + replayRtmrs: () => ['rtmr0', 'rtmr1', 'rtmr2', 'rtmr3'] + }), + rawDeriveKey: vi.fn() + })) +})); + +vi.mock('@solana/web3.js', () => ({ + Keypair: { + fromSeed: vi.fn().mockReturnValue({ + publicKey: { + toBase58: () => 'mock-solana-public-key' + } + }) + } +})); + +vi.mock('viem/accounts', () => ({ + privateKeyToAccount: vi.fn().mockReturnValue({ + address: 'mock-evm-address' + }) +})); + +describe('DeriveKeyProvider', () => { + beforeEach(() => { + vi.clearAllMocks(); + }); + + describe('constructor', () => { + it('should initialize with LOCAL mode', () => { + const _provider = new DeriveKeyProvider(TEEMode.LOCAL); + expect(TappdClient).toHaveBeenCalledWith('http://localhost:8090'); + }); + + it('should initialize with DOCKER mode', () => { + const _provider = new DeriveKeyProvider(TEEMode.DOCKER); + expect(TappdClient).toHaveBeenCalledWith('http://host.docker.internal:8090'); + }); + + it('should initialize with PRODUCTION mode', () => { + const _provider = new DeriveKeyProvider(TEEMode.PRODUCTION); + expect(TappdClient).toHaveBeenCalledWith(); + }); + + it('should throw error for invalid mode', () => { + expect(() => new DeriveKeyProvider('INVALID_MODE')).toThrow('Invalid TEE_MODE'); + }); + }); + + describe('rawDeriveKey', () => { + let _provider: DeriveKeyProvider; + + beforeEach(() => { + _provider = new DeriveKeyProvider(TEEMode.LOCAL); + }); + + it('should derive raw key successfully', async () => { + const path = 'test-path'; + const subject = 'test-subject'; + const result = await _provider.rawDeriveKey(path, subject); + + const client = TappdClient.mock.results[0].value; + expect(client.deriveKey).toHaveBeenCalledWith(path, subject); + expect(result.asUint8Array()).toEqual(new Uint8Array([1, 2, 3, 4, 5])); + }); + + it('should handle errors during raw key derivation', async () => { + const mockError = new Error('Key derivation failed'); + vi.mocked(TappdClient).mockImplementationOnce(() => { + const instance = new TappdClient(); + instance.deriveKey = vi.fn().mockRejectedValueOnce(mockError); + instance.tdxQuote = vi.fn(); + instance.rawDeriveKey = vi.fn(); + return instance; + }); + + const provider = new DeriveKeyProvider(TEEMode.LOCAL); + await expect(provider.rawDeriveKey('path', 'subject')).rejects.toThrow(mockError); + }); + }); + + describe('deriveEd25519Keypair', () => { + let provider: DeriveKeyProvider; + + beforeEach(() => { + provider = new DeriveKeyProvider(TEEMode.LOCAL); + }); + + it('should derive Ed25519 keypair successfully', async () => { + const path = 'test-path'; + const subject = 'test-subject'; + const result = await provider.deriveEd25519Keypair(path, subject); + + const client = TappdClient.mock.results[0].value; + expect(client.deriveKey).toHaveBeenCalledWith(path, subject); + expect(result.keypair.publicKey.toBase58()).toEqual('mock-solana-public-key'); + }); + }); +}); \ No newline at end of file diff --git a/packages/plugin-tee/src/__tests__/remoteAttestation.test.ts b/packages/plugin-tee/src/__tests__/remoteAttestation.test.ts new file mode 100644 index 00000000000..4890d6683e5 --- /dev/null +++ b/packages/plugin-tee/src/__tests__/remoteAttestation.test.ts @@ -0,0 +1,81 @@ +import { describe, it, expect, vi, beforeEach } from 'vitest'; +import { RemoteAttestationProvider } from '../src/providers/remoteAttestationProvider'; +import { TappdClient } from '@phala/dstack-sdk'; +import { TEEMode } from '../src/types/tee'; + +// Mock TappdClient +vi.mock('@phala/dstack-sdk', () => ({ + TappdClient: vi.fn().mockImplementation(() => ({ + tdxQuote: vi.fn().mockResolvedValue({ + quote: 'mock-quote-data', + replayRtmrs: () => ['rtmr0', 'rtmr1', 'rtmr2', 'rtmr3'] + }), + deriveKey: vi.fn() + })) +})); + +describe('RemoteAttestationProvider', () => { + beforeEach(() => { + vi.clearAllMocks(); + }); + + describe('constructor', () => { + it('should initialize with LOCAL mode', () => { + const _provider = new RemoteAttestationProvider(TEEMode.LOCAL); + expect(TappdClient).toHaveBeenCalledWith('http://localhost:8090'); + }); + + it('should initialize with DOCKER mode', () => { + const _provider = new RemoteAttestationProvider(TEEMode.DOCKER); + expect(TappdClient).toHaveBeenCalledWith('http://host.docker.internal:8090'); + }); + + it('should initialize with PRODUCTION mode', () => { + const _provider = new RemoteAttestationProvider(TEEMode.PRODUCTION); + expect(TappdClient).toHaveBeenCalledWith(); + }); + + it('should throw error for invalid mode', () => { + expect(() => new RemoteAttestationProvider('INVALID_MODE')).toThrow('Invalid TEE_MODE'); + }); + }); + + describe('generateAttestation', () => { + let provider: RemoteAttestationProvider; + + beforeEach(() => { + provider = new RemoteAttestationProvider(TEEMode.LOCAL); + }); + + it('should generate attestation successfully', async () => { + const reportData = 'test-report-data'; + const quote = await provider.generateAttestation(reportData); + + expect(quote).toEqual({ + quote: 'mock-quote-data', + timestamp: expect.any(Number) + }); + }); + + it('should handle errors during attestation generation', async () => { + const mockError = new Error('TDX Quote generation failed'); + const mockTdxQuote = vi.fn().mockRejectedValue(mockError); + vi.mocked(TappdClient).mockImplementationOnce(() => ({ + tdxQuote: mockTdxQuote, + deriveKey: vi.fn() + })); + + const provider = new RemoteAttestationProvider(TEEMode.LOCAL); + await expect(provider.generateAttestation('test-data')).rejects.toThrow('Failed to generate TDX Quote'); + }); + + it('should pass hash algorithm to tdxQuote when provided', async () => { + const reportData = 'test-report-data'; + const hashAlgorithm = 'raw'; + await provider.generateAttestation(reportData, hashAlgorithm); + + const client = TappdClient.mock.results[0].value; + expect(client.tdxQuote).toHaveBeenCalledWith(reportData, hashAlgorithm); + }); + }); +}); \ No newline at end of file diff --git a/packages/plugin-tee/src/__tests__/remoteAttestationAction.test.ts b/packages/plugin-tee/src/__tests__/remoteAttestationAction.test.ts new file mode 100644 index 00000000000..897de2c7d86 --- /dev/null +++ b/packages/plugin-tee/src/__tests__/remoteAttestationAction.test.ts @@ -0,0 +1,103 @@ +import { describe, it, expect, vi, beforeEach } from 'vitest'; +import { remoteAttestationAction } from '../src/actions/remoteAttestation'; +import { RemoteAttestationProvider } from '../src/providers/remoteAttestationProvider'; + +// Mock dependencies +vi.mock('../src/providers/remoteAttestationProvider'); +vi.mock('undici', () => ({ + fetch: vi.fn().mockResolvedValue({ + json: () => Promise.resolve({ checksum: 'mock-checksum' }) + }) +})); + +describe('remoteAttestationAction', () => { + const mockRuntime = { + agentId: 'test-agent-id', + getSetting: vi.fn().mockReturnValue('LOCAL'), + getState: vi.fn(), + setState: vi.fn(), + message:{ userId: 'user', roomId: 'room', content: { text: 'If you are running in a TEE, generate a remote attestation' } }, + setConversation: vi.fn() + }; + + const mockCallback = vi.fn(); + + beforeEach(() => { + vi.clearAllMocks(); + vi.mocked(RemoteAttestationProvider).mockImplementation(() => ({ + generateAttestation: vi.fn().mockResolvedValue({ + quote: '0x1234', + timestamp: Date.now() + }) + })); + }); + + it('should have correct name and similes', () => { + expect(remoteAttestationAction.name).toBe('REMOTE_ATTESTATION'); + expect(remoteAttestationAction.similes).toContain('REMOTE_ATTESTATION'); + expect(remoteAttestationAction.similes).toContain('TEE_REMOTE_ATTESTATION'); + expect(remoteAttestationAction.similes).toContain('TEE_ATTESTATION'); + }); + + describe('handler', () => { + it('should generate and upload attestation successfully', async () => { + const result = await remoteAttestationAction.handler( + mockRuntime, + mockRuntime.message, + {}, + {}, + mockCallback + ); + + expect(result).toBe(true); + expect(mockCallback).toHaveBeenCalledWith({ + text: expect.stringContaining('https://proof.t16z.com/reports/mock-checksum'), + action: 'NONE' + }); + }); + + it('should handle errors during attestation generation', async () => { + const mockError = new Error('Attestation generation failed'); + vi.mocked(RemoteAttestationProvider).mockImplementation(() => ({ + generateAttestation: vi.fn().mockRejectedValueOnce(mockError), + client: { + tdxQuote: vi.fn(), + deriveKey: vi.fn() + } + })); + + const result = await remoteAttestationAction.handler( + mockRuntime, + {}, + {}, + {}, + mockCallback + ); + + expect(result).toBe(false); + }); + }); + + describe('validate', () => { + it('should always return true', async () => { + const result = await remoteAttestationAction.validate(mockRuntime); + expect(result).toBe(true); + }); + }); + + describe('examples', () => { + it('should have valid example conversations', () => { + expect(remoteAttestationAction.examples).toBeInstanceOf(Array); + expect(remoteAttestationAction.examples[0]).toBeInstanceOf(Array); + + const [userMessage, agentMessage] = remoteAttestationAction.examples[0]; + expect(userMessage.user).toBe('{{user1}}'); + expect(userMessage.content.text).toBe('If you are running in a TEE, generate a remote attestation'); + expect(userMessage.content.action).toBe('REMOTE_ATTESTATION'); + + expect(agentMessage.user).toBe('{{user2}}'); + expect(agentMessage.content.text).toBe('Of course, one second...'); + expect(agentMessage.content.action).toBeUndefined(); + }); + }); +}); \ No newline at end of file diff --git a/packages/plugin-tee/src/__tests__/timeout.test.ts b/packages/plugin-tee/src/__tests__/timeout.test.ts new file mode 100644 index 00000000000..f16a54d8a49 --- /dev/null +++ b/packages/plugin-tee/src/__tests__/timeout.test.ts @@ -0,0 +1,117 @@ +import { describe, it, expect, vi, beforeEach } from 'vitest'; +import { RemoteAttestationProvider } from '../src/providers/remoteAttestationProvider'; +import { DeriveKeyProvider } from '../src/providers/deriveKeyProvider'; +import { TEEMode } from '../src/types/tee'; +import { TappdClient } from '@phala/dstack-sdk'; + +// Mock TappdClient +vi.mock('@phala/dstack-sdk', () => ({ + TappdClient: vi.fn().mockImplementation(() => ({ + tdxQuote: vi.fn(), + deriveKey: vi.fn() + })) +})); + +describe('TEE Provider Timeout Tests', () => { + beforeEach(() => { + vi.clearAllMocks(); + }); + + describe('RemoteAttestationProvider', () => { + it('should handle API timeout during attestation generation', async () => { + const mockTdxQuote = vi.fn() + .mockRejectedValueOnce(new Error('Request timed out')); + + vi.mocked(TappdClient).mockImplementation(() => ({ + tdxQuote: mockTdxQuote, + deriveKey: vi.fn() + })); + + const provider = new RemoteAttestationProvider(TEEMode.LOCAL); + await expect(() => provider.generateAttestation('test-data')) + .rejects + .toThrow('Failed to generate TDX Quote: Request timed out'); + + // Verify the call was made once + expect(mockTdxQuote).toHaveBeenCalledTimes(1); + expect(mockTdxQuote).toHaveBeenCalledWith('test-data', undefined); + }); + + it('should handle network errors during attestation generation', async () => { + const mockTdxQuote = vi.fn() + .mockRejectedValueOnce(new Error('Network error')); + + vi.mocked(TappdClient).mockImplementation(() => ({ + tdxQuote: mockTdxQuote, + deriveKey: vi.fn() + })); + + const provider = new RemoteAttestationProvider(TEEMode.LOCAL); + await expect(() => provider.generateAttestation('test-data')) + .rejects + .toThrow('Failed to generate TDX Quote: Network error'); + + expect(mockTdxQuote).toHaveBeenCalledTimes(1); + }); + + it('should handle successful attestation generation', async () => { + const mockQuote = { + quote: 'test-quote', + replayRtmrs: () => ['rtmr0', 'rtmr1', 'rtmr2', 'rtmr3'] + }; + + const mockTdxQuote = vi.fn().mockResolvedValueOnce(mockQuote); + + vi.mocked(TappdClient).mockImplementation(() => ({ + tdxQuote: mockTdxQuote, + deriveKey: vi.fn() + })); + + const provider = new RemoteAttestationProvider(TEEMode.LOCAL); + const result = await provider.generateAttestation('test-data'); + + expect(mockTdxQuote).toHaveBeenCalledTimes(1); + expect(result).toEqual({ + quote: 'test-quote', + timestamp: expect.any(Number) + }); + }); + }); + + describe('DeriveKeyProvider', () => { + it('should handle API timeout during key derivation', async () => { + const mockDeriveKey = vi.fn() + .mockRejectedValueOnce(new Error('Request timed out')); + + vi.mocked(TappdClient).mockImplementation(() => ({ + tdxQuote: vi.fn(), + deriveKey: mockDeriveKey + })); + + const provider = new DeriveKeyProvider(TEEMode.LOCAL); + await expect(() => provider.rawDeriveKey('test-path', 'test-subject')) + .rejects + .toThrow('Request timed out'); + + expect(mockDeriveKey).toHaveBeenCalledTimes(1); + expect(mockDeriveKey).toHaveBeenCalledWith('test-path', 'test-subject'); + }); + + it('should handle API timeout during Ed25519 key derivation', async () => { + const mockDeriveKey = vi.fn() + .mockRejectedValueOnce(new Error('Request timed out')); + + vi.mocked(TappdClient).mockImplementation(() => ({ + tdxQuote: vi.fn(), + deriveKey: mockDeriveKey + })); + + const provider = new DeriveKeyProvider(TEEMode.LOCAL); + await expect(() => provider.deriveEd25519Keypair('test-path', 'test-subject')) + .rejects + .toThrow('Request timed out'); + + expect(mockDeriveKey).toHaveBeenCalledTimes(1); + }); + }); +}); diff --git a/packages/plugin-tee/src/adapters/sqliteDAO.ts b/packages/plugin-tee/src/adapters/sqliteDAO.ts new file mode 100644 index 00000000000..9d985c23c8b --- /dev/null +++ b/packages/plugin-tee/src/adapters/sqliteDAO.ts @@ -0,0 +1,125 @@ +import type { Database } from "better-sqlite3"; +import { TeeLogDAO, type TeeAgent, type TeeLog, type TeeLogQuery, type TeePageQuery } from "../types.ts"; +import { sqliteTables } from "./sqliteTables.ts"; + +export class SqliteTeeLogDAO extends TeeLogDAO { + constructor(db: Database) { + super(); + this.db = db; + } + + async initialize(): Promise { + this.db.exec(sqliteTables); + } + + async addLog(log: TeeLog): Promise { + const stmt = this.db.prepare( + "INSERT INTO tee_logs (id, agentId, roomId, userId, type, content, timestamp, signature) VALUES (?, ?, ?, ?, ?, ?, ?, ?)" + ); + try { + stmt.run(log.id, log.agentId, log.roomId, log.userId, log.type, log.content, log.timestamp, log.signature); + return true; + } catch (error) { + console.error("Error adding log to database", error); + return false; + } + } + + async getPagedLogs(query: TeeLogQuery, page: number, pageSize: number): Promise> { + if (page < 1) { + page = 1; + } + const offset = (page - 1) * pageSize; + const limit = pageSize; + + const whereConditions = []; + const params = []; + + if (query.agentId && query.agentId !== "") { + whereConditions.push("agentId = ?"); + params.push(query.agentId); + } + if (query.roomId && query.roomId !== "") { + whereConditions.push("roomId = ?"); + params.push(query.roomId); + } + if (query.userId && query.userId !== "") { + whereConditions.push("userId = ?"); + params.push(query.userId); + } + if (query.type && query.type !== "") { + whereConditions.push("type = ?"); + params.push(query.type); + } + if (query.containsContent && query.containsContent !== "") { + whereConditions.push("content LIKE ?"); + params.push(`%${query.containsContent}%`); + } + if (query.startTimestamp) { + whereConditions.push("timestamp >= ?"); + params.push(query.startTimestamp); + } + if (query.endTimestamp) { + whereConditions.push("timestamp <= ?"); + params.push(query.endTimestamp); + } + + const whereClause = + whereConditions.length > 0 ? `WHERE ${whereConditions.join(" AND ")}` : ""; + + try { + const total_stmt = this.db.prepare( + `SELECT COUNT(*) as total FROM tee_logs ${whereClause}` + ); + const total = total_stmt.get(params).total; + + const logs_stmt = this.db.prepare( + `SELECT * FROM tee_logs ${whereClause} ORDER BY timestamp ASC LIMIT ? OFFSET ?` + ); + const logs = logs_stmt.all(...params, limit, offset); + + return { + page, + pageSize, + total, + data: logs, + }; + } catch (error) { + console.error("Error getting paged logs from database", error); + throw error; + } + } + + async addAgent(agent: TeeAgent): Promise { + const stmt = this.db.prepare( + "INSERT INTO tee_agents (id, agentId, agentName, createdAt, publicKey, attestation) VALUES (?, ?, ?, ?, ?, ?)" + ); + try { + stmt.run(agent.id, agent.agentId, agent.agentName, agent.createdAt, agent.publicKey, agent.attestation); + return true; + } catch (error) { + console.error("Error adding agent to database", error); + return false; + } + } + + async getAgent(agentId: string): Promise { + const stmt = this.db.prepare("SELECT * FROM tee_agents WHERE agentId = ? ORDER BY createdAt DESC LIMIT 1"); + try { + return stmt.get(agentId); + } catch (error) { + console.error("Error getting agent from database", error); + throw error; + } + } + + async getAllAgents(): Promise { + const stmt = this.db.prepare("SELECT * FROM tee_agents"); + try { + return stmt.all(); + } catch (error) { + console.error("Error getting all agents from database", error); + throw error; + } + } +} diff --git a/packages/plugin-tee/src/adapters/sqliteTables.ts b/packages/plugin-tee/src/adapters/sqliteTables.ts new file mode 100644 index 00000000000..9d24b7820ad --- /dev/null +++ b/packages/plugin-tee/src/adapters/sqliteTables.ts @@ -0,0 +1,26 @@ +export const sqliteTables = ` +BEGIN TRANSACTION; + +-- Table: tee_logs +CREATE TABLE IF NOT EXISTS "tee_logs" ( + "id" TEXT PRIMARY KEY, + "agentId" TEXT NOT NULL, + "roomId" TEXT NOT NULL, + "userId" TEXT NOT NULL, + "type" TEXT NOT NULL, + "content" TEXT NOT NULL, + "timestamp" TIMESTAMP DEFAULT CURRENT_TIMESTAMP, + "signature" TEXT NOT NULL +); + +-- Table: tee_agents +CREATE TABLE IF NOT EXISTS "tee_agents" ( + "id" TEXT PRIMARY KEY, + "agentId" TEXT NOT NULL, + "agentName" TEXT NOT NULL, + "createdAt" TIMESTAMP DEFAULT CURRENT_TIMESTAMP, + "publicKey" TEXT NOT NULL, + "attestation" TEXT NOT NULL +); + +COMMIT;`; diff --git a/packages/plugin-tee/src/index.ts b/packages/plugin-tee/src/index.ts new file mode 100644 index 00000000000..7d2ba0a4af8 --- /dev/null +++ b/packages/plugin-tee/src/index.ts @@ -0,0 +1,34 @@ +import type { Plugin } from "@elizaos/core"; +import { + deriveKeyProvider, +} from "./providers/deriveKeyProvider"; +import { + remoteAttestationProvider +} from "./providers/remoteAttestationProvider"; + +export { + DeriveKeyProvider +} from "./providers/deriveKeyProvider"; + +import { sgxAttestationProvider } from "./providers/sgxAttestationProvider"; +import { TeeLogService } from "./services/teeLogService"; + +export { TeeLogService }; + +export const teePlugin: Plugin = { + name: "tee", + description: + "TEE plugin with actions to generate remote attestations and derive keys", + actions: [ + ], + evaluators: [ + ], + providers: [ + remoteAttestationProvider, + deriveKeyProvider, + sgxAttestationProvider, + ], + services: [ + new TeeLogService() + ], +}; \ No newline at end of file diff --git a/packages/plugin-tee/src/providers/deriveKeyProvider.ts b/packages/plugin-tee/src/providers/deriveKeyProvider.ts new file mode 100644 index 00000000000..2e41b14010a --- /dev/null +++ b/packages/plugin-tee/src/providers/deriveKeyProvider.ts @@ -0,0 +1,228 @@ +import { + type IAgentRuntime, + type Memory, + type Provider, + type State, + elizaLogger, +} from "@elizaos/core"; +import { Keypair } from "@solana/web3.js"; +import crypto from "crypto"; +import { type DeriveKeyResponse, TappdClient } from "@phala/dstack-sdk"; +import { privateKeyToAccount } from "viem/accounts"; +import { type PrivateKeyAccount, keccak256 } from "viem"; +import { RemoteAttestationProvider } from "./remoteAttestationProvider"; +import { TEEMode, type RemoteAttestationQuote, type DeriveKeyAttestationData } from "@elizaos/core"; + +class DeriveKeyProvider { + private client: TappdClient; + private raProvider: RemoteAttestationProvider; + + constructor(teeMode?: string) { + let endpoint: string | undefined; + + // Both LOCAL and DOCKER modes use the simulator, just with different endpoints + switch (teeMode) { + case TEEMode.LOCAL: + endpoint = "http://localhost:8090"; + elizaLogger.log( + "TEE: Connecting to local simulator at localhost:8090" + ); + break; + case TEEMode.DOCKER: + endpoint = "http://host.docker.internal:8090"; + elizaLogger.log( + "TEE: Connecting to simulator via Docker at host.docker.internal:8090" + ); + break; + case TEEMode.PRODUCTION: + endpoint = undefined; + elizaLogger.log( + "TEE: Running in production mode without simulator" + ); + break; + default: + throw new Error( + `Invalid TEE_MODE: ${teeMode}. Must be one of: LOCAL, DOCKER, PRODUCTION` + ); + } + + this.client = endpoint ? new TappdClient(endpoint) : new TappdClient(); + this.raProvider = new RemoteAttestationProvider(teeMode); + } + + private async generateDeriveKeyAttestation( + agentId: string, + publicKey: string, + subject?: string + ): Promise { + const deriveKeyData: DeriveKeyAttestationData = { + agentId, + publicKey, + subject, + }; + const reportdata = JSON.stringify(deriveKeyData); + elizaLogger.log( + "Generating Remote Attestation Quote for Derive Key..." + ); + const quote = await this.raProvider.generateAttestation(reportdata); + elizaLogger.log("Remote Attestation Quote generated successfully!"); + return quote; + } + + /** + * Derives a raw key from the given path and subject. + * @param path - The path to derive the key from. This is used to derive the key from the root of trust. + * @param subject - The subject to derive the key from. This is used for the certificate chain. + * @returns The derived key. + */ + async rawDeriveKey( + path: string, + subject: string + ): Promise { + try { + if (!path || !subject) { + elizaLogger.error( + "Path and Subject are required for key derivation" + ); + } + + elizaLogger.log("Deriving Raw Key in TEE..."); + const derivedKey = await this.client.deriveKey(path, subject); + + elizaLogger.log("Raw Key Derived Successfully!"); + return derivedKey; + } catch (error) { + elizaLogger.error("Error deriving raw key:", error); + throw error; + } + } + + /** + * Derives an Ed25519 keypair from the given path and subject. + * @param path - The path to derive the key from. This is used to derive the key from the root of trust. + * @param subject - The subject to derive the key from. This is used for the certificate chain. + * @param agentId - The agent ID to generate an attestation for. + * @returns An object containing the derived keypair and attestation. + */ + async deriveEd25519Keypair( + path: string, + subject: string, + agentId: string + ): Promise<{ keypair: Keypair; attestation: RemoteAttestationQuote }> { + try { + if (!path || !subject) { + elizaLogger.error( + "Path and Subject are required for key derivation" + ); + } + + elizaLogger.log("Deriving Key in TEE..."); + const derivedKey = await this.client.deriveKey(path, subject); + const uint8ArrayDerivedKey = derivedKey.asUint8Array(); + + const hash = crypto.createHash("sha256"); + hash.update(uint8ArrayDerivedKey); + const seed = hash.digest(); + const seedArray = new Uint8Array(seed); + const keypair = Keypair.fromSeed(seedArray.slice(0, 32)); + + // Generate an attestation for the derived key data for public to verify + const attestation = await this.generateDeriveKeyAttestation( + agentId, + keypair.publicKey.toBase58() + ); + elizaLogger.log("Key Derived Successfully!"); + + return { keypair, attestation }; + } catch (error) { + elizaLogger.error("Error deriving key:", error); + throw error; + } + } + + /** + * Derives an ECDSA keypair from the given path and subject. + * @param path - The path to derive the key from. This is used to derive the key from the root of trust. + * @param subject - The subject to derive the key from. This is used for the certificate chain. + * @param agentId - The agent ID to generate an attestation for. This is used for the certificate chain. + * @returns An object containing the derived keypair and attestation. + */ + async deriveEcdsaKeypair( + path: string, + subject: string, + agentId: string + ): Promise<{ + keypair: PrivateKeyAccount; + attestation: RemoteAttestationQuote; + }> { + try { + if (!path || !subject) { + elizaLogger.error( + "Path and Subject are required for key derivation" + ); + } + + elizaLogger.log("Deriving ECDSA Key in TEE..."); + const deriveKeyResponse: DeriveKeyResponse = + await this.client.deriveKey(path, subject); + const hex = keccak256(deriveKeyResponse.asUint8Array()); + const keypair: PrivateKeyAccount = privateKeyToAccount(hex); + + // Generate an attestation for the derived key data for public to verify + const attestation = await this.generateDeriveKeyAttestation( + agentId, + keypair.address + ); + elizaLogger.log("ECDSA Key Derived Successfully!"); + + return { keypair, attestation }; + } catch (error) { + elizaLogger.error("Error deriving ecdsa key:", error); + throw error; + } + } +} + +const deriveKeyProvider: Provider = { + get: async (runtime: IAgentRuntime, _message?: Memory, _state?: State) => { + const teeMode = runtime.getSetting("TEE_MODE"); + const provider = new DeriveKeyProvider(teeMode); + const agentId = runtime.agentId; + try { + // Validate wallet configuration + if (!runtime.getSetting("WALLET_SECRET_SALT")) { + elizaLogger.error( + "Wallet secret salt is not configured in settings" + ); + return ""; + } + + try { + const secretSalt = + runtime.getSetting("WALLET_SECRET_SALT") || "secret_salt"; + const solanaKeypair = await provider.deriveEd25519Keypair( + secretSalt, + "solana", + agentId + ); + const evmKeypair = await provider.deriveEcdsaKeypair( + secretSalt, + "evm", + agentId + ); + return JSON.stringify({ + solana: solanaKeypair.keypair.publicKey, + evm: evmKeypair.keypair.address, + }); + } catch (error) { + elizaLogger.error("Error creating PublicKey:", error); + return ""; + } + } catch (error) { + elizaLogger.error("Error in derive key provider:", error.message); + return `Failed to fetch derive key information: ${error instanceof Error ? error.message : "Unknown error"}`; + } + }, +}; + +export { deriveKeyProvider, DeriveKeyProvider }; diff --git a/packages/plugin-tee/src/providers/remoteAttestationProvider.ts b/packages/plugin-tee/src/providers/remoteAttestationProvider.ts new file mode 100644 index 00000000000..59bfd2bb2b9 --- /dev/null +++ b/packages/plugin-tee/src/providers/remoteAttestationProvider.ts @@ -0,0 +1,106 @@ +import { + type IAgentRuntime, + type Memory, + type Provider, + type State, + elizaLogger, +} from "@elizaos/core"; +import { type TdxQuoteResponse, TappdClient, type TdxQuoteHashAlgorithms } from "@phala/dstack-sdk"; +import { type RemoteAttestationQuote, TEEMode, type RemoteAttestationMessage } from "@elizaos/core"; + +class RemoteAttestationProvider { + private client: TappdClient; + + constructor(teeMode?: string) { + let endpoint: string | undefined; + + // Both LOCAL and DOCKER modes use the simulator, just with different endpoints + switch (teeMode) { + case TEEMode.LOCAL: + endpoint = "http://localhost:8090"; + elizaLogger.log( + "TEE: Connecting to local simulator at localhost:8090" + ); + break; + case TEEMode.DOCKER: + endpoint = "http://host.docker.internal:8090"; + elizaLogger.log( + "TEE: Connecting to simulator via Docker at host.docker.internal:8090" + ); + break; + case TEEMode.PRODUCTION: + endpoint = undefined; + elizaLogger.log( + "TEE: Running in production mode without simulator" + ); + break; + default: + throw new Error( + `Invalid TEE_MODE: ${teeMode}. Must be one of: LOCAL, DOCKER, PRODUCTION` + ); + } + + this.client = endpoint ? new TappdClient(endpoint) : new TappdClient(); + } + + async generateAttestation( + reportData: string, + hashAlgorithm?: TdxQuoteHashAlgorithms + ): Promise { + try { + elizaLogger.log("Generating attestation for: ", reportData); + const tdxQuote: TdxQuoteResponse = + await this.client.tdxQuote(reportData, hashAlgorithm); + const rtmrs = tdxQuote.replayRtmrs(); + elizaLogger.log( + `rtmr0: ${rtmrs[0]}\nrtmr1: ${rtmrs[1]}\nrtmr2: ${rtmrs[2]}\nrtmr3: ${rtmrs[3]}f` + ); + const quote: RemoteAttestationQuote = { + quote: tdxQuote.quote, + timestamp: Date.now(), + }; + elizaLogger.log("Remote attestation quote: ", quote); + return quote; + } catch (error) { + console.error("Error generating remote attestation:", error); + throw new Error( + `Failed to generate TDX Quote: ${ + error instanceof Error ? error.message : "Unknown error" + }` + ); + } + } +} + +// Keep the original provider for backwards compatibility +const remoteAttestationProvider: Provider = { + get: async (runtime: IAgentRuntime, message: Memory, _state?: State) => { + const teeMode = runtime.getSetting("TEE_MODE"); + const provider = new RemoteAttestationProvider(teeMode); + const agentId = runtime.agentId; + + try { + const attestationMessage: RemoteAttestationMessage = { + agentId: agentId, + timestamp: Date.now(), + message: { + userId: message.userId, + roomId: message.roomId, + content: message.content.text, + } + }; + elizaLogger.log("Generating attestation for: ", JSON.stringify(attestationMessage)); + const attestation = await provider.generateAttestation(JSON.stringify(attestationMessage)); + return `Your Agent's remote attestation is: ${JSON.stringify(attestation)}`; + } catch (error) { + console.error("Error in remote attestation provider:", error); + throw new Error( + `Failed to generate TDX Quote: ${ + error instanceof Error ? error.message : "Unknown error" + }` + ); + } + }, +}; + +export { remoteAttestationProvider, RemoteAttestationProvider }; diff --git a/packages/plugin-tee/src/providers/sgxAttestationProvider.ts b/packages/plugin-tee/src/providers/sgxAttestationProvider.ts new file mode 100644 index 00000000000..a50462f7d8b --- /dev/null +++ b/packages/plugin-tee/src/providers/sgxAttestationProvider.ts @@ -0,0 +1,105 @@ +import type { IAgentRuntime, Memory, Provider, State } from "@elizaos/core"; +import type { SgxAttestation } from "@elizaos/core"; +import { promises as fs } from 'node:fs'; // Fix: Use node: protocol +import { createHash } from 'node:crypto'; // Fix: Use node: protocol + +// Function to calculate SHA-256 and return a Buffer (32 bytes) +function calculateSHA256(input: string): Buffer { + const hash = createHash('sha256'); + hash.update(input); + return hash.digest(); +} + +class SgxAttestationProvider { + private readonly SGX_QUOTE_MAX_SIZE: number = 8192 * 4; + private readonly SGX_TARGET_INFO_SIZE: number = 512; + + private readonly MY_TARGET_INFO_PATH: string = "/dev/attestation/my_target_info"; + private readonly TARGET_INFO_PATH: string = "/dev/attestation/target_info"; + private readonly USER_REPORT_DATA_PATH: string = "/dev/attestation/user_report_data"; + private readonly QUOTE_PATH: string = "/dev/attestation/quote"; + + // Remove unnecessary constructor + // constructor() {} + + async generateAttestation( + reportData: string + ): Promise { + // Hash the report data to generate the raw user report. + // The resulting hash value is 32 bytes long. + // Ensure that the length of the raw user report does not exceed 64 bytes. + const rawUserReport = calculateSHA256(reportData); + + try { + // Check if the gramine attestation device file exists + await fs.access(this.MY_TARGET_INFO_PATH); + + const quote = await this.generateQuoteByGramine(rawUserReport); + const attestation: SgxAttestation = { + quote: quote, + timestamp: Date.now(), + }; + // console.log("SGX remote attestation: ", attestation); + return attestation; + } catch (error) { + console.error("Error generating SGX remote attestation:", error); + throw new Error( + `Failed to generate SGX Quote: ${ + error instanceof Error ? error.message : "Unknown error" + }` + ); + } + } + + async generateQuoteByGramine( + rawUserReport: Buffer + ): Promise { + if (rawUserReport.length > 64) { + throw new Error("the length of rawUserReport exceeds 64 bytes"); + } + + const myTargetInfo = await fs.readFile(this.MY_TARGET_INFO_PATH); + if (myTargetInfo.length !== this.SGX_TARGET_INFO_SIZE) { + throw new Error("Invalid my_target_info length"); + } + + await fs.writeFile(this.TARGET_INFO_PATH, myTargetInfo); + await fs.writeFile(this.USER_REPORT_DATA_PATH, rawUserReport); + + // Read quote + const quoteData = await fs.readFile(this.QUOTE_PATH); + if (quoteData.length > this.SGX_QUOTE_MAX_SIZE) { + throw new Error("Invalid quote length"); + } + + const realLen = quoteData.lastIndexOf(0); + if (realLen === -1) { + throw new Error("quote without EOF"); + } + + //return '0x' + quoteData.subarray(0, realLen + 1).toString('hex'); + return `0x${quoteData.subarray(0, realLen + 1).toString('hex')}`; // Fix: Use template literal + } +} + +const sgxAttestationProvider: Provider = { + get: async (runtime: IAgentRuntime, _message: Memory, _state?: State) => { + const provider = new SgxAttestationProvider(); + const agentId = runtime.agentId; + + try { + // console.log("Generating attestation for agent: ", agentId); + const attestation = await provider.generateAttestation(agentId); + return `Your Agent's remote attestation is: ${JSON.stringify(attestation)}`; + } catch (error) { + console.error("Error in remote attestation provider:", error); + throw new Error( + `Failed to generate SGX Quote: ${ + error instanceof Error ? error.message : "Unknown error" + }` + ); + } + }, +}; + +export { sgxAttestationProvider, SgxAttestationProvider }; diff --git a/packages/plugin-tee/src/providers/walletProvider.ts b/packages/plugin-tee/src/providers/walletProvider.ts new file mode 100644 index 00000000000..6f0f6dddb02 --- /dev/null +++ b/packages/plugin-tee/src/providers/walletProvider.ts @@ -0,0 +1,326 @@ +/* This is an example of how WalletProvider can use DeriveKeyProvider to generate a Solana Keypair */ +import { + type IAgentRuntime, + type Memory, + type Provider, + type State, + elizaLogger, +} from "@elizaos/core"; +import { Connection, type Keypair, type PublicKey } from "@solana/web3.js"; +import BigNumber from "bignumber.js"; +import NodeCache from "node-cache"; +import { DeriveKeyProvider } from "./deriveKeyProvider"; +import type { RemoteAttestationQuote } from "@elizaos/core"; +// Provider configuration +const PROVIDER_CONFIG = { + BIRDEYE_API: "https://public-api.birdeye.so", + MAX_RETRIES: 3, + RETRY_DELAY: 2000, + DEFAULT_RPC: "https://api.mainnet-beta.solana.com", + TOKEN_ADDRESSES: { + SOL: "So11111111111111111111111111111111111111112", + BTC: "3NZ9JMVBmGAqocybic2c7LQCJScmgsAZ6vQqTDzcqmJh", + ETH: "7vfCXTUXx5WJV5JADk17DUJ4ksgau7utNKj4b963voxs", + }, +}; + +export interface Item { + name: string; + address: string; + symbol: string; + decimals: number; + balance: string; + uiAmount: string; + priceUsd: string; + valueUsd: string; + valueSol?: string; +} + +interface WalletPortfolio { + totalUsd: string; + totalSol?: string; + items: Array; +} + +interface _BirdEyePriceData { + data: { + [key: string]: { + price: number; + priceChange24h: number; + }; + }; +} + +interface Prices { + solana: { usd: string }; + bitcoin: { usd: string }; + ethereum: { usd: string }; +} + +export class WalletProvider { + private cache: NodeCache; + + constructor( + private connection: Connection, + private walletPublicKey: PublicKey + ) { + this.cache = new NodeCache({ stdTTL: 300 }); // Cache TTL set to 5 minutes + } + + private async fetchWithRetry( + runtime, + url: string, + options: RequestInit = {} + ): Promise { + let lastError: Error; + + for (let i = 0; i < PROVIDER_CONFIG.MAX_RETRIES; i++) { + try { + const apiKey = runtime.getSetting("BIRDEYE_API_KEY"); + const response = await fetch(url, { + ...options, + headers: { + Accept: "application/json", + "x-chain": "solana", + "X-API-KEY": apiKey || "", + ...options.headers, + }, + }); + + if (!response.ok) { + const errorText = await response.text(); + throw new Error( + `HTTP error! status: ${response.status}, message: ${errorText}` + ); + } + + const data = await response.json(); + return data; + } catch (error) { + elizaLogger.error(`Attempt ${i + 1} failed:`, error); + lastError = error; + if (i < PROVIDER_CONFIG.MAX_RETRIES - 1) { + const delay = PROVIDER_CONFIG.RETRY_DELAY * Math.pow(2, i); + await new Promise((resolve) => setTimeout(resolve, delay)); + continue; + } + } + } + + elizaLogger.error( + "All attempts failed. Throwing the last error:", + lastError + ); + throw lastError; + } + + async fetchPortfolioValue(runtime): Promise { + try { + const cacheKey = `portfolio-${this.walletPublicKey.toBase58()}`; + const cachedValue = this.cache.get(cacheKey); + + if (cachedValue) { + elizaLogger.log("Cache hit for fetchPortfolioValue"); + return cachedValue; + } + elizaLogger.log("Cache miss for fetchPortfolioValue"); + + const walletData = await this.fetchWithRetry( + runtime, + `${PROVIDER_CONFIG.BIRDEYE_API}/v1/wallet/token_list?wallet=${this.walletPublicKey.toBase58()}` + ); + + if (!walletData?.success || !walletData?.data) { + elizaLogger.error("No portfolio data available", walletData); + throw new Error("No portfolio data available"); + } + + const data = walletData.data; + const totalUsd = new BigNumber(data.totalUsd.toString()); + const prices = await this.fetchPrices(runtime); + const solPriceInUSD = new BigNumber(prices.solana.usd.toString()); + + const items = data.items.map((item: any) => ({ + ...item, + valueSol: new BigNumber(item.valueUsd || 0) + .div(solPriceInUSD) + .toFixed(6), + name: item.name || "Unknown", + symbol: item.symbol || "Unknown", + priceUsd: item.priceUsd || "0", + valueUsd: item.valueUsd || "0", + })); + + const totalSol = totalUsd.div(solPriceInUSD); + const portfolio = { + totalUsd: totalUsd.toString(), + totalSol: totalSol.toFixed(6), + items: items.sort((a, b) => + new BigNumber(b.valueUsd) + .minus(new BigNumber(a.valueUsd)) + .toNumber() + ), + }; + this.cache.set(cacheKey, portfolio); + return portfolio; + } catch (error) { + elizaLogger.error("Error fetching portfolio:", error); + throw error; + } + } + + async fetchPrices(runtime): Promise { + try { + const cacheKey = "prices"; + const cachedValue = this.cache.get(cacheKey); + + if (cachedValue) { + elizaLogger.log("Cache hit for fetchPrices"); + return cachedValue; + } + elizaLogger.log("Cache miss for fetchPrices"); + + const { SOL, BTC, ETH } = PROVIDER_CONFIG.TOKEN_ADDRESSES; + const tokens = [SOL, BTC, ETH]; + const prices: Prices = { + solana: { usd: "0" }, + bitcoin: { usd: "0" }, + ethereum: { usd: "0" }, + }; + + for (const token of tokens) { + const response = await this.fetchWithRetry( + runtime, + `${PROVIDER_CONFIG.BIRDEYE_API}/defi/price?address=${token}`, + { + headers: { + "x-chain": "solana", + }, + } + ); + + if (response?.data?.value) { + const price = response.data.value.toString(); + prices[ + token === SOL + ? "solana" + : token === BTC + ? "bitcoin" + : "ethereum" + ].usd = price; + } else { + elizaLogger.warn( + `No price data available for token: ${token}` + ); + } + } + + this.cache.set(cacheKey, prices); + return prices; + } catch (error) { + elizaLogger.error("Error fetching prices:", error); + throw error; + } + } + + formatPortfolio( + runtime, + portfolio: WalletPortfolio, + prices: Prices + ): string { + let output = `${runtime.character.description}\n`; + output += `Wallet Address: ${this.walletPublicKey.toBase58()}\n\n`; + + const totalUsdFormatted = new BigNumber(portfolio.totalUsd).toFixed(2); + const totalSolFormatted = portfolio.totalSol; + + output += `Total Value: $${totalUsdFormatted} (${totalSolFormatted} SOL)\n\n`; + output += "Token Balances:\n"; + + const nonZeroItems = portfolio.items.filter((item) => + new BigNumber(item.uiAmount).isGreaterThan(0) + ); + + if (nonZeroItems.length === 0) { + output += "No tokens found with non-zero balance\n"; + } else { + for (const item of nonZeroItems) { + const valueUsd = new BigNumber(item.valueUsd).toFixed(2); + output += `${item.name} (${item.symbol}): ${new BigNumber( + item.uiAmount + ).toFixed(6)} ($${valueUsd} | ${item.valueSol} SOL)\n`; + } + } + + output += "\nMarket Prices:\n"; + output += `SOL: $${new BigNumber(prices.solana.usd).toFixed(2)}\n`; + output += `BTC: $${new BigNumber(prices.bitcoin.usd).toFixed(2)}\n`; + output += `ETH: $${new BigNumber(prices.ethereum.usd).toFixed(2)}\n`; + + return output; + } + + async getFormattedPortfolio(runtime): Promise { + try { + const [portfolio, prices] = await Promise.all([ + this.fetchPortfolioValue(runtime), + this.fetchPrices(runtime), + ]); + + return this.formatPortfolio(runtime, portfolio, prices); + } catch (error) { + elizaLogger.error("Error generating portfolio report:", error); + return "Unable to fetch wallet information. Please try again later."; + } + } +} + +const walletProvider: Provider = { + get: async ( + runtime: IAgentRuntime, + _message: Memory, + _state?: State + ): Promise => { + const agentId = runtime.agentId; + const teeMode = runtime.getSetting("TEE_MODE"); + const deriveKeyProvider = new DeriveKeyProvider(teeMode); + try { + // Validate wallet configuration + if (!runtime.getSetting("WALLET_SECRET_SALT")) { + elizaLogger.error( + "Wallet secret salt is not configured in settings" + ); + return ""; + } + + let publicKey: PublicKey; + try { + const derivedKeyPair: { + keypair: Keypair; + attestation: RemoteAttestationQuote; + } = await deriveKeyProvider.deriveEd25519Keypair( + runtime.getSetting("WALLET_SECRET_SALT"), + "solana", + agentId + ); + publicKey = derivedKeyPair.keypair.publicKey; + elizaLogger.log("Wallet Public Key: ", publicKey.toBase58()); + } catch (error) { + elizaLogger.error("Error creating PublicKey:", error); + return ""; + } + + const connection = new Connection(PROVIDER_CONFIG.DEFAULT_RPC); + const provider = new WalletProvider(connection, publicKey); + + const porfolio = await provider.getFormattedPortfolio(runtime); + return porfolio; + } catch (error) { + elizaLogger.error("Error in wallet provider:", error.message); + return `Failed to fetch wallet information: ${error instanceof Error ? error.message : "Unknown error"}`; + } + }, +}; + +// Module exports +export { walletProvider }; diff --git a/packages/plugin-tee/src/services/teeLogManager.ts b/packages/plugin-tee/src/services/teeLogManager.ts new file mode 100644 index 00000000000..fcba701a810 --- /dev/null +++ b/packages/plugin-tee/src/services/teeLogManager.ts @@ -0,0 +1,105 @@ +import { SgxAttestationProvider } from "../providers/sgxAttestationProvider"; +import { RemoteAttestationProvider as TdxAttestationProvider } from "../providers/remoteAttestationProvider"; +import { TEEMode, TeeType, type TeeLogDAO, type TeeAgent, type TeeLog, type TeeLogQuery, type TeePageQuery } from "@elizaos/core"; +import elliptic from "elliptic"; +import { v4 } from "uuid"; + +export class TeeLogManager { + private teeLogDAO: TeeLogDAO; + private teeType: TeeType; + private teeMode: TEEMode; // Only used for plugin-tee with TDX dstack + + // Map of agentId to its key pair + // These keypairs only store in memory. + // When the agent restarts, we will generate new keypair. + private keyPairs: Map = new Map(); + + constructor(teeLogDAO: TeeLogDAO, teeType: TeeType, teeMode: TEEMode) { + this.teeLogDAO = teeLogDAO; + this.teeType = teeType; + this.teeMode = teeMode; + } + + public async registerAgent(agentId: string, agentName: string): Promise { + if (!agentId) { + throw new Error("Agent ID is required"); + } + + const keyPair = this.generateKeyPair(); + this.keyPairs.set(agentId, keyPair); + + const publicKey = keyPair.getPublic().encode('hex', true); + const attestation = await this.generateAttestation(publicKey); + + const new_agent = { + id: v4(), + agentId, + agentName: agentName || "", + createdAt: new Date().getTime(), + publicKey, + attestation, + }; + + console.log("registerAgent new_agent", new_agent); + + return this.teeLogDAO.addAgent(new_agent); + } + + public async getAllAgents(): Promise { + return this.teeLogDAO.getAllAgents(); + } + + public async getAgent(agentId: string): Promise { + return this.teeLogDAO.getAgent(agentId); + } + + public async log(agentId: string, roomId: string, userId: string, type: string, content: string): Promise { + const keyPair = this.keyPairs.get(agentId); + if (!keyPair) { + throw new Error(`Agent ${agentId} not found`); + } + + const timestamp = new Date().getTime(); + + // Join the information into a single string + const messageToSign = `${agentId}|${roomId}|${userId}|${type}|${content}|${timestamp}`; + + // Sign the joined message + const signature = "0x" + keyPair.sign(messageToSign).toDER('hex'); + + return this.teeLogDAO.addLog({ + id: v4(), + agentId, + roomId, + userId, + type, + content, + timestamp, + signature, + }); + } + + public async getLogs(query: TeeLogQuery, page: number, pageSize: number): Promise> { + return this.teeLogDAO.getPagedLogs(query, page, pageSize); + } + + public generateKeyPair(): elliptic.ec.KeyPair { + const ec = new elliptic.ec('secp256k1'); + const key = ec.genKeyPair(); + return key; + } + + public async generateAttestation(userReport: string): Promise { + if (this.teeType === TeeType.SGX_GRAMINE) { + const sgxAttestationProvider = new SgxAttestationProvider(); + const sgxAttestation = await sgxAttestationProvider.generateAttestation(userReport); + return JSON.stringify(sgxAttestation); + } else if (this.teeType === TeeType.TDX_DSTACK) { + const tdxAttestationProvider = new TdxAttestationProvider(this.teeMode); + const tdxAttestation = await tdxAttestationProvider.generateAttestation(userReport); + return JSON.stringify(tdxAttestation); + } else { + throw new Error("Invalid TEE type"); + } + } +} diff --git a/packages/plugin-tee/src/services/teeLogService.ts b/packages/plugin-tee/src/services/teeLogService.ts new file mode 100644 index 00000000000..1178b4f92d4 --- /dev/null +++ b/packages/plugin-tee/src/services/teeLogService.ts @@ -0,0 +1,124 @@ +import { type IAgentRuntime, Service, ServiceType, type ITeeLogService, TeeType, type TeeLogDAO, type TeeAgent, type TeeLog, type TeeLogQuery, type TeePageQuery, TEEMode } from "@elizaos/core"; +import { SqliteTeeLogDAO } from "../adapters/sqliteDAO"; +import { TeeLogManager } from "./teeLogManager"; +import Database from "better-sqlite3"; +import path from "path"; + +export class TeeLogService extends Service implements ITeeLogService { + private dbPath: string; + + private initialized = false; + private enableTeeLog = false; + private teeType: TeeType; + private teeMode: TEEMode = TEEMode.OFF; // Only used for plugin-tee with TDX dstack + + private teeLogDAO: TeeLogDAO; + private teeLogManager: TeeLogManager; + + + getInstance(): ITeeLogService { + return this; + } + + static get serviceType(): ServiceType { + return ServiceType.TEE; + } + + async initialize(runtime: IAgentRuntime): Promise { + if (this.initialized) { + return; + } + + const enableValues = ["true", "1", "yes", "enable", "enabled", "on"]; + + const enableTeeLog = runtime.getSetting("ENABLE_TEE_LOG"); + if (enableTeeLog === null) { + throw new Error("ENABLE_TEE_LOG is not set."); + } + this.enableTeeLog = enableValues.includes(enableTeeLog.toLowerCase()); + if (!this.enableTeeLog) { + console.log("TEE log is not enabled."); + return; + } + + const runInSgx = runtime.getSetting("SGX"); + const teeMode = runtime.getSetting("TEE_MODE"); + const walletSecretSalt = runtime.getSetting("WALLET_SECRET_SALT"); + + this.teeMode = teeMode ? TEEMode[teeMode as keyof typeof TEEMode] : TEEMode.OFF; + + const useSgxGramine = runInSgx && enableValues.includes(runInSgx.toLowerCase()); + const useTdxDstack = teeMode && teeMode !== TEEMode.OFF && walletSecretSalt; + + if (useSgxGramine && useTdxDstack) { + throw new Error("Cannot configure both SGX and TDX at the same time."); + } else if (useSgxGramine) { + this.teeType = TeeType.SGX_GRAMINE; + } else if (useTdxDstack) { + this.teeType = TeeType.TDX_DSTACK; + } else { + throw new Error("Invalid TEE configuration."); + } + + const dbPathSetting = runtime.getSetting("TEE_LOG_DB_PATH"); + this.dbPath = dbPathSetting || path.resolve("data/tee_log.sqlite"); + + const db = new Database(this.dbPath); + this.teeLogDAO = new SqliteTeeLogDAO(db); + await this.teeLogDAO.initialize(); + this.teeLogManager = new TeeLogManager(this.teeLogDAO, this.teeType, this.teeMode); + + const isRegistered = await this.teeLogManager.registerAgent( + runtime?.agentId, + runtime?.character?.name, + ); + if (!isRegistered) { + throw new Error(`Failed to register agent ${runtime.agentId}`); + } + + this.initialized = true; + } + + async log(agentId: string, roomId: string, userId: string, type: string, content: string): Promise { + if (!this.enableTeeLog) { + return false; + } + + return this.teeLogManager.log(agentId, roomId, userId, type, content); + } + + async getAllAgents(): Promise { + if (!this.enableTeeLog) { + return []; + } + + return this.teeLogManager.getAllAgents(); + } + + async getAgent(agentId: string): Promise { + if (!this.enableTeeLog) { + return undefined; + } + + return this.teeLogManager.getAgent(agentId); + } + + async getLogs(query: TeeLogQuery, page: number, pageSize: number): Promise> { + if (!this.enableTeeLog) { + return { + data: [], + total: 0, + page: page, + pageSize: pageSize, + }; + } + + return this.teeLogManager.getLogs(query, page, pageSize); + } + + async generateAttestation(userReport: string): Promise { + return this.teeLogManager.generateAttestation(userReport); + } +} + +export default TeeLogService; diff --git a/packages/plugin-tee/src/types.ts b/packages/plugin-tee/src/types.ts new file mode 100644 index 00000000000..3f4bee57aac --- /dev/null +++ b/packages/plugin-tee/src/types.ts @@ -0,0 +1,66 @@ +export enum TeeType { + SGX_GRAMINE = "sgx_gramine", + TDX_DSTACK = "tdx_dstack", +} + +// Represents a log entry in the TeeLog table, containing details about agent activities. +export interface TeeLog { + id: string; + agentId: string; + roomId: string; + userId: string; + type: string; + content: string; + timestamp: number; + signature: string; +} + +export interface TeeLogQuery { + agentId?: string; + roomId?: string; + userId?: string; + type?: string; + containsContent?: string; + startTimestamp?: number; + endTimestamp?: number; +} + +// Represents an agent in the TeeAgent table, containing details about the agent. +export interface TeeAgent { + id: string; // Primary key + // Allow duplicate agentId. + // This is to support the case where the same agentId is registered multiple times. + // Each time the agent restarts, we will generate a new keypair and attestation. + agentId: string; + agentName: string; + createdAt: number; + publicKey: string; + attestation: string; +} + +export interface TeePageQuery { + page: number; + pageSize: number; + total?: number; + data?: Result; +} + +export abstract class TeeLogDAO { + db: DB; + + abstract initialize(): Promise; + + abstract addLog(log: TeeLog): Promise; + + abstract getPagedLogs( + query: TeeLogQuery, + page: number, + pageSize: number + ): Promise>; + + abstract addAgent(agent: TeeAgent): Promise; + + abstract getAgent(agentId: string): Promise; + + abstract getAllAgents(): Promise; +} \ No newline at end of file diff --git a/packages/plugin-tee/tsconfig.json b/packages/plugin-tee/tsconfig.json new file mode 100644 index 00000000000..18c600eec05 --- /dev/null +++ b/packages/plugin-tee/tsconfig.json @@ -0,0 +1,13 @@ +{ + "extends": "../core/tsconfig.json", + "compilerOptions": { + "outDir": "dist", + "rootDir": "src", + "types": [ + "node" + ] + }, + "include": [ + "src/**/*.ts", + ] +} \ No newline at end of file diff --git a/packages/plugin-tee/tsup.config.ts b/packages/plugin-tee/tsup.config.ts new file mode 100644 index 00000000000..1a96f24afa1 --- /dev/null +++ b/packages/plugin-tee/tsup.config.ts @@ -0,0 +1,21 @@ +import { defineConfig } from "tsup"; + +export default defineConfig({ + entry: ["src/index.ts"], + outDir: "dist", + sourcemap: true, + clean: true, + format: ["esm"], // Ensure you're targeting CommonJS + external: [ + "dotenv", // Externalize dotenv to prevent bundling + "fs", // Externalize fs to use Node.js built-in module + "path", // Externalize other built-ins if necessary + "@reflink/reflink", + "@node-llama-cpp", + "https", + "http", + "agentkeepalive", + "safe-buffer", + // Add other modules you want to externalize + ], +});