{"version":3,"sources":["../../src/agent/WalletManager.ts","../../src/agent/GatewayConnector.ts","../../src/agent/ComputeNode.ts","../../src/agent/TokenSpendingManager.ts","../../src/agent/AgentManager.ts","../../src/agent/SystemTray.ts","../../src/agent/setup.ts"],"names":["fs","path","fetch"],"mappings":"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","file":"index.mjs","sourcesContent":["/**\n * Wallet Manager - Handles local key generation and encrypted storage\n */\n\nimport { randomBytes } from 'crypto';\nimport type { WalletConfig } from './types';\n\nexport interface WalletManagerOptions {\n  configDir?: string;\n  encryptionKey?: string;\n}\n\n/**\n * Manages local encrypted wallet storage\n *\n * @example\n * ```typescript\n * const walletMgr = new WalletManager();\n *\n * // Create new wallet (auto-generates keys)\n * const wallet = await walletMgr.createWallet();\n * console.log(wallet.address); // 0x...\n *\n * // Load existing wallet\n * const existing = await walletMgr.loadWallet();\n *\n * // Sign data\n * const signature = await walletMgr.sign('0x' + Buffer.from('hello').toString('hex'));\n * ```\n */\nexport class WalletManager {\n  private configDir: string;\n  private encryptionKey: string;\n  private wallet: WalletConfig | null = null;\n  private keyPath: string;\n\n  constructor(options: WalletManagerOptions = {}) {\n    this.configDir = options.configDir || this.getDefaultConfigDir();\n    this.keyPath = `${this.configDir}/wallet.json.enc`;\n\n    // Derive device-specific encryption key if not provided\n    this.encryptionKey = options.encryptionKey || this.deriveDeviceKey();\n  }\n\n  /**\n   * Get default config directory\n   */\n  private getDefaultConfigDir(): string {\n    const homeDir = process.env.HOME || process.env.USERPROFILE || '/root';\n    return `${homeDir}/.edgework`;\n  }\n\n  /**\n   * Derive device-specific encryption key\n   * Uses hostname, OS, and hardware fingerprint\n   */\n  private deriveDeviceKey(): string {\n    const crypto = require('crypto');\n    const os = require('os');\n\n    const components = [\n      os.hostname(),\n      process.env.USER || process.env.USERNAME || 'system',\n      os.platform(),\n      os.arch(),\n    ].join('|');\n\n    return crypto.createHash('sha256').update(components).digest('hex');\n  }\n\n  /**\n   * Generate a new Ethereum wallet (secp256k1)\n   */\n  async generateWallet(): Promise<WalletConfig> {\n    const crypto = require('crypto');\n\n    // Generate random private key\n    const privateKey = crypto.randomBytes(32);\n\n    // Compute address from private key using simple keccak256 approach\n    // Implementation note: , would use proper secp256k1 library\n    // Current behavior: create a consistent address from the key\n    const keyHex = privateKey.toString('hex');\n    const addressHash = crypto\n      .createHash('sha256')\n      .update(keyHex)\n      .digest('hex');\n\n    // Take first 20 bytes (40 chars) as ethereum-like address\n    const address = '0x' + addressHash.substring(0, 40);\n\n    const wallet: WalletConfig = {\n      privateKey: '0x' + privateKey.toString('hex'),\n      address: address,\n      encryptionKey: this.encryptionKey,\n      isLocal: true,\n    };\n\n    this.wallet = wallet;\n    return wallet;\n  }\n\n  /**\n   * Save wallet locally (encrypted)\n   */\n  async saveWallet(): Promise<void> {\n    if (!this.wallet) {\n      throw new Error('No wallet loaded or created');\n    }\n\n    const crypto = require('crypto');\n    const fs = require('fs').promises;\n    const path = require('path');\n\n    // Ensure config directory exists\n    const dir = path.dirname(this.keyPath);\n    await fs.mkdir(dir, { recursive: true });\n\n    // Encrypt private key with device key\n    // Ensure key is 32 bytes (sha256 hex is 64 chars -> 32 bytes)\n    const key = Buffer.from(this.encryptionKey, 'hex');\n    const iv = crypto.randomBytes(16);\n\n    const cipher = crypto.createCipheriv('aes-256-cbc', key, iv);\n    let encrypted = cipher.update(this.wallet.privateKey, 'utf8', 'hex');\n    encrypted += cipher.final('hex');\n\n    // Store address, encrypted key, and IV\n    const data = JSON.stringify(\n      {\n        address: this.wallet.address,\n        encryptedKey: encrypted,\n        iv: iv.toString('hex'),\n        createdAt: new Date().toISOString(),\n      },\n      null,\n      2\n    );\n\n    // Write with restricted permissions (owner read/write only)\n    await fs.writeFile(this.keyPath, data, {\n      mode: 0o600,\n      flag: 'w',\n    });\n  }\n\n  /**\n   * Load wallet from local storage\n   */\n  async loadWallet(): Promise<WalletConfig | null> {\n    const fs = require('fs').promises;\n    const crypto = require('crypto');\n\n    try {\n      const data = await fs.readFile(this.keyPath, 'utf8');\n      const stored = JSON.parse(data);\n\n      // Decrypt private key with device key\n      const key = Buffer.from(this.encryptionKey, 'hex');\n      // Support legacy wallets (no IV) if necessary, but we can't efficiently decrypt them without createDecipher\n      // Assuming fresh setup or migration isn't required for needs attention state\n      if (!stored.iv) {\n        throw new Error('Invalid wallet format: missing IV');\n      }\n\n      const iv = Buffer.from(stored.iv, 'hex');\n      const decipher = crypto.createDecipheriv('aes-256-cbc', key, iv);\n\n      let decrypted = decipher.update(stored.encryptedKey, 'hex', 'utf8');\n      decrypted += decipher.final('utf8');\n\n      this.wallet = {\n        privateKey: decrypted,\n        address: stored.address,\n        encryptionKey: this.encryptionKey,\n        isLocal: true,\n      };\n\n      return this.wallet;\n    } catch {\n      return null;\n    }\n  }\n\n  /**\n   * Check if wallet exists\n   */\n  async walletExists(): Promise<boolean> {\n    const fs = require('fs').promises;\n\n    try {\n      await fs.access(this.keyPath);\n      return true;\n    } catch {\n      return false;\n    }\n  }\n\n  /**\n   * Sign data with wallet private key\n   */\n  async sign(message: string): Promise<string> {\n    if (!this.wallet) {\n      throw new Error('No wallet loaded');\n    }\n\n    const crypto = require('crypto');\n\n    // Create HMAC signature as placeholder\n    // Implementation note: , would use secp256k1 signing\n    const hmac = crypto.createHmac('sha256', this.wallet.privateKey);\n    hmac.update(message);\n    const signature = '0x' + hmac.digest('hex');\n\n    return signature;\n  }\n\n  /**\n   * Delete wallet (security feature)\n   */\n  async deleteWallet(): Promise<void> {\n    const fs = require('fs').promises;\n\n    try {\n      await fs.unlink(this.keyPath);\n      this.wallet = null;\n    } catch {\n      // File doesn't exist, ignore\n    }\n  }\n\n  /**\n   * Get current wallet address\n   */\n  getAddress(): string | null {\n    return this.wallet?.address || null;\n  }\n\n  /**\n   * Verify wallet is loaded\n   */\n  isLoaded(): boolean {\n    return this.wallet !== null;\n  }\n}\n","/**\n * Gateway Connector - Registers agents with Edgework on Optimism\n */\n\nimport type {\n  GatewayConnectorOptions,\n  GatewayConfig,\n  GatewayRegistration,\n  WalletConfig,\n} from './types';\nimport { WalletManager } from './WalletManager';\nimport {\n  createEdgeworkAuthHeader,\n  resolveEdgeworkApiKey,\n} from '../edgework-api-key';\n\nexport interface RegistrationMetadata {\n  name: string;\n  region: string;\n  gpuType?: string;\n  cpuCores?: number;\n  country?: string;\n  customData?: Record<string, unknown>;\n}\n\n/**\n * Connects to Optimism and registers gateway\n *\n * @example\n * ```typescript\n * const connector = new GatewayConnector({\n *   walletAddress: '0x...',\n *   provider: 'https://sepolia.optimism.io',\n * });\n *\n * // Register existing wallet\n * const reg = await connector.register();\n *\n * // Or create new wallet and register\n * const { wallet, registration } = await connector.registerWithNewWallet({\n *   name: 'My Gateway',\n *   region: 'us-west',\n * });\n * ```\n */\nexport class GatewayConnector {\n  private provider: string;\n  private walletAddress: string;\n  private registryAddress: string;\n  private apiKey: string | undefined;\n  private chainId: number;\n  private walletManager: WalletManager;\n  private web3Provider: any = null;\n  private contract: any = null;\n  private logger: any;\n\n  constructor(options: GatewayConnectorOptions) {\n    this.provider = options.provider || 'https://sepolia.optimism.io';\n    this.walletAddress = options.walletAddress;\n    this.registryAddress = options.registryAddress || '0x' + '0'.repeat(40); // Placeholder\n    this.apiKey = resolveEdgeworkApiKey(options.apiKey);\n    this.chainId = options.chainId || 11155420; // Optimism Sepolia\n    this.walletManager = new WalletManager();\n    this.logger = this.createLogger();\n  }\n\n  private createLogger() {\n    return {\n      debug: (msg: string, data?: any) =>\n        console.debug(`[GatewayConnector] ${msg}`, data),\n      info: (msg: string, data?: any) =>\n        console.info(`[GatewayConnector] ${msg}`, data),\n      warn: (msg: string, data?: any) =>\n        console.warn(`[GatewayConnector] ${msg}`, data),\n      error: (msg: string, data?: any) =>\n        console.error(`[GatewayConnector] ${msg}`, data),\n    };\n  }\n\n  /**\n   * Connect to provider\n   */\n  async connect(): Promise<void> {\n    try {\n      // when motivation is low-load ethers.js\n      const ethers = require('ethers');\n\n      // Create provider\n      this.web3Provider = new ethers.JsonRpcProvider(\n        this.provider,\n        this.chainId\n      );\n\n      // Test connection\n      const network = await this.web3Provider.getNetwork();\n      this.logger.info('Connected to network', {\n        chainId: network.chainId,\n        name: network.name,\n      });\n\n      // Create contract instance (ABI stub for registry)\n      const registryAbi = [\n        'function registerGateway(bytes32 ucanRoot, string metadata) external',\n        'function getGateway(address) view returns (tuple(address owner, bytes32 ucanRoot, string metadata, uint256 totalComputeUnits, uint256 pendingRewards, uint256 claimedRewards, uint256 lastHeartbeat, uint256 registeredAt, bool isActive, bool isBanned))',\n        'function sendHeartbeat() external',\n      ];\n\n      this.contract = new ethers.Contract(\n        this.registryAddress,\n        registryAbi,\n        this.web3Provider\n      );\n\n      this.logger.debug('Connected to registry', {\n        address: this.registryAddress,\n      });\n    } catch (error) {\n      this.logger.error('Failed to connect', { error });\n      throw error;\n    }\n  }\n\n  /**\n   * Disconnect from provider\n   */\n  async disconnect(): Promise<void> {\n    this.web3Provider = null;\n    this.contract = null;\n    this.logger.debug('Disconnected from provider');\n  }\n\n  /**\n   * Register with existing wallet\n   */\n  async register(\n    config?: Partial<GatewayConfig>\n  ): Promise<GatewayRegistration> {\n    if (!this.contract) {\n      throw new Error('Not connected. Call connect() first.');\n    }\n\n    if (!this.walletAddress) {\n      throw new Error('No wallet address configured');\n    }\n\n    try {\n      // Load wallet\n      const wallet = await this.walletManager.loadWallet();\n      if (!wallet) {\n        throw new Error(\n          'Wallet not found. Create one with registerWithNewWallet()'\n        );\n      }\n\n      const ethers = require('ethers');\n\n      // Create signer\n      const signer = new ethers.Wallet(wallet.privateKey, this.web3Provider);\n\n      // Prepare metadata\n      const metadata = JSON.stringify(config || {});\n      const ucanRoot = ethers.id('edgework-gateway');\n\n      this.logger.info('Registering gateway', {\n        address: this.walletAddress,\n        metadata,\n      });\n\n      // Sign transaction\n      const contractWithSigner = this.contract.connect(signer);\n      const tx = await contractWithSigner.registerGateway(ucanRoot, metadata);\n\n      this.logger.info('Registration transaction sent', { txHash: tx.hash });\n\n      // Wait for confirmation\n      const receipt = await tx.wait();\n\n      this.logger.info('Gateway registered', {\n        txHash: receipt.hash,\n        blockNumber: receipt.blockNumber,\n      });\n\n      // Get registration details\n      const registration = await this.getStatus();\n      if (!registration) {\n        throw new Error('Failed to retrieve registration details');\n      }\n\n      return registration;\n    } catch (error) {\n      this.logger.error('Registration failed', { error });\n      throw error;\n    }\n  }\n\n  /**\n   * Register with a new auto-generated wallet\n   */\n  async registerWithNewWallet(\n    config: Omit<GatewayConfig, 'walletAddress'>\n  ): Promise<{ wallet: WalletConfig; registration: GatewayRegistration }> {\n    try {\n      this.logger.info('Creating new wallet');\n\n      // Generate wallet\n      const wallet = await this.walletManager.generateWallet();\n\n      // Save it locally\n      await this.walletManager.saveWallet();\n\n      this.logger.info('Wallet created and saved', {\n        address: wallet.address,\n      });\n\n      // Update wallet address\n      this.walletAddress = wallet.address;\n\n      // Register with this wallet\n      const fullConfig: GatewayConfig = {\n        ...config,\n        walletAddress: wallet.address,\n      };\n\n      const registration = await this.register(fullConfig);\n\n      this.logger.info('Registered with new wallet', {\n        address: wallet.address,\n        registration,\n      });\n\n      return { wallet, registration };\n    } catch (error) {\n      this.logger.error('Failed to register with new wallet', { error });\n      throw error;\n    }\n  }\n\n  /**\n   * Get current registration status\n   */\n  async getStatus(): Promise<GatewayRegistration | null> {\n    if (!this.contract) {\n      throw new Error('Not connected. Call connect() first.');\n    }\n\n    try {\n      const gateway = await this.contract.getGateway(this.walletAddress);\n\n      if (!gateway.registeredAt || gateway.registeredAt === 0n) {\n        return null;\n      }\n\n      return {\n        gatewayAddress: this.walletAddress,\n        owner: gateway.owner,\n        ucanRoot: gateway.ucanRoot,\n        registeredAt: Number(gateway.registeredAt),\n        isActive: gateway.isActive,\n        totalComputeUnits: Number(gateway.totalComputeUnits),\n        pendingRewards: Number(gateway.pendingRewards),\n      };\n    } catch (error) {\n      this.logger.warn('Failed to get status', { error });\n      return null;\n    }\n  }\n\n  /**\n   * Send heartbeat to keep gateway active\n   */\n  async sendHeartbeat(): Promise<void> {\n    if (!this.contract) {\n      throw new Error('Not connected. Call connect() first.');\n    }\n\n    try {\n      const wallet = await this.walletManager.loadWallet();\n      if (!wallet) {\n        throw new Error('Wallet not loaded');\n      }\n\n      const ethers = require('ethers');\n      const signer = new ethers.Wallet(wallet.privateKey, this.web3Provider);\n\n      const contractWithSigner = this.contract.connect(signer);\n      const tx = await contractWithSigner.sendHeartbeat();\n\n      this.logger.debug('Heartbeat sent', { txHash: tx.hash });\n\n      await tx.wait();\n      this.logger.debug('Heartbeat confirmed');\n    } catch (error) {\n      this.logger.error('Heartbeat failed', { error });\n      throw error;\n    }\n  }\n\n  /**\n   * Unregister from gateway\n   */\n  async unregister(reason = 'User requested'): Promise<void> {\n    if (!this.contract) {\n      throw new Error('Not connected. Call connect() first.');\n    }\n\n    try {\n      const wallet = await this.walletManager.loadWallet();\n      if (!wallet) {\n        throw new Error('Wallet not loaded');\n      }\n\n      const ethers = require('ethers');\n      const signer = new ethers.Wallet(wallet.privateKey, this.web3Provider);\n\n      // Note: This assumes a deregister function exists\n      // In practice, you'd call the actual registry method\n      this.logger.info('Unregistering gateway', { reason });\n\n      // Clean up local wallet\n      await this.walletManager.deleteWallet();\n      this.walletAddress = '';\n\n      this.logger.info('Gateway unregistered and wallet deleted');\n    } catch (error) {\n      this.logger.error('Unregistration failed', { error });\n      throw error;\n    }\n  }\n\n  /**\n   * Register via a relayer (gas-sponsored)\n   */\n  async registerViaRelayer(\n    relayerUrl: string,\n    config: GatewayConfig\n  ): Promise<GatewayRegistration> {\n    if (!this.walletAddress) {\n      throw new Error('No wallet address configured');\n    }\n\n    try {\n      const wallet = await this.walletManager.loadWallet();\n      if (!wallet) {\n        throw new Error('Wallet not found for signing');\n      }\n\n      const ethers = require('ethers');\n      const signer = new ethers.Wallet(wallet.privateKey); // No provider needed for signing\n\n      // Prepare metadata\n      const metadata = JSON.stringify(config || {});\n      const ucanRoot = ethers.id('edgework-gateway');\n\n      // prepare hash\n      // bytes32 hash = keccak256(abi.encodePacked(gateway, ucanRoot, metadata));\n      const hash = ethers.solidityPackedKeccak256(\n        ['address', 'bytes32', 'string'],\n        [this.walletAddress, ucanRoot, metadata]\n      );\n\n      // Sign the hash (EIP-191)\n      const signature = await signer.signMessage(ethers.getBytes(hash));\n\n      this.logger.info('Sending signed registration to relayer', {\n        relayerUrl,\n        address: this.walletAddress,\n      });\n\n      // Post to relayer\n      const response = await fetch(relayerUrl, {\n        method: 'POST',\n        headers: {\n          'Content-Type': 'application/json',\n          'User-Agent': `Edgework-SDK/0.1.0`,\n          Accept: 'application/json',\n          ...createEdgeworkAuthHeader(this.apiKey),\n        },\n        body: JSON.stringify({\n          gateway: this.walletAddress,\n          ucanRoot,\n          metadata,\n          signature,\n        }),\n      });\n\n      if (!response.ok) {\n        const errorText = await response.text();\n        this.logger.error('Relayer request failed', {\n          status: response.status,\n          statusText: response.statusText,\n          body: errorText,\n        });\n        throw new Error(\n          `Relayer error: ${response.status} ${response.statusText} - ${errorText}`\n        );\n      }\n\n      const result = await response.json();\n      this.logger.info('Relayer accepted request', result);\n\n      // Poll for status or assume success based on relayer response\n      // Current behavior: we'll try to get status from the chain (might take a moment)\n      // Implementation note: implementation, we might wait for the tx hash returned by relayer\n\n      // Wait a bit for indexing\n      await new Promise((resolve) => setTimeout(resolve, 2000));\n\n      // Attempt to get status\n      // Note: This might still return null if tx hasn't mined.\n      // The caller might need to poll getStatus().\n      return {\n        gatewayAddress: this.walletAddress,\n        owner: this.walletAddress, // Approximated\n        ucanRoot,\n        registeredAt: Date.now(),\n        isActive: true,\n        totalComputeUnits: 0,\n        pendingRewards: 0,\n      };\n    } catch (error) {\n      this.logger.error('Relayer registration failed', { error });\n      throw error;\n    }\n  }\n}\n","/**\n * Compute Node - Handles task pooling and execution with token spending support\n */\n\nimport type {\n  ComputeNodeOptions,\n  ComputeStats,\n  ComputeTask,\n  ComputeResult,\n} from './types';\nimport { TokenSpendingManager } from './TokenSpendingManager';\nimport {\n  createEdgeworkAuthHeader,\n  resolveEdgeworkApiKey,\n} from '../edgework-api-key';\n\n/**\n * Manages compute task execution with optional token-based payment\n *\n * @example\n * ```typescript\n * const node = new ComputeNode({\n *   gatewayUrl: 'http://localhost:8080',\n *   cpuAllocation: 0.8,\n *   memoryMB: 2048,\n *   maxTaskDuration: 600,\n *   walletAddress: '0x...',\n *   tokenSpendingManager: tokenManager, // optional\n * });\n *\n * await node.start();\n * ```\n */\nexport class ComputeNode {\n  private config: ComputeNodeOptions;\n  private isRunning = false;\n  private taskQueue: ComputeTask[] = [];\n  private stats: ComputeStats = {\n    tasksCompleted: 0,\n    totalComputeTime: 0,\n    estimatedEarnings: 0,\n    activeTaskCount: 0,\n    cpuUsage: 0,\n    memoryUsage: 0,\n    uptime: 0,\n  };\n  private startTime = 0;\n  private logger: any;\n  private apiKey?: string;\n  private tokenSpendingManager?: TokenSpendingManager;\n  private walletAddress?: string;\n  private hasSubscription = false;\n\n  constructor(\n    config: ComputeNodeOptions,\n    tokenSpendingManager?: TokenSpendingManager,\n    walletAddress?: string,\n    hasSubscription?: boolean\n  ) {\n    this.config = config;\n    this.logger = this.createLogger();\n    this.apiKey = resolveEdgeworkApiKey(config.apiKey);\n    this.tokenSpendingManager = tokenSpendingManager;\n    this.walletAddress = walletAddress;\n    this.hasSubscription = hasSubscription || false;\n  }\n\n  private createLogger() {\n    return {\n      debug: (msg: string, data?: any) =>\n        console.debug(`[ComputeNode] ${msg}`, data),\n      info: (msg: string, data?: any) =>\n        console.info(`[ComputeNode] ${msg}`, data),\n      warn: (msg: string, data?: any) =>\n        console.warn(`[ComputeNode] ${msg}`, data),\n      error: (msg: string, data?: any) =>\n        console.error(`[ComputeNode] ${msg}`, data),\n    };\n  }\n\n  private getRequestHeaders(\n    headers: Record<string, string> = {}\n  ): Record<string, string> {\n    return {\n      ...headers,\n      ...createEdgeworkAuthHeader(this.apiKey),\n    };\n  }\n\n  /**\n   * Connect to gateway\n   */\n  async connect(): Promise<void> {\n    try {\n      // when motivation is low-load fetch\n      const fetch = globalThis.fetch || (await import('node-fetch')).default;\n\n      const response = await fetch(`${this.config.gatewayUrl}/health`, {\n        headers: this.getRequestHeaders(),\n      });\n      if (!response.ok) {\n        throw new Error(`Gateway health check failed: ${response.status}`);\n      }\n\n      this.logger.info('Connected to gateway', {\n        url: this.config.gatewayUrl,\n      });\n    } catch (error) {\n      this.logger.error('Failed to connect to gateway', { error });\n      throw error;\n    }\n  }\n\n  /**\n   * Disconnect from gateway\n   */\n  async disconnect(): Promise<void> {\n    this.logger.debug('Disconnected from gateway');\n  }\n\n  /**\n   * Start compute node\n   */\n  async start(): Promise<void> {\n    if (this.isRunning) {\n      this.logger.warn('Compute node already running');\n      return;\n    }\n\n    try {\n      await this.connect();\n      this.isRunning = true;\n      this.startTime = Date.now();\n\n      this.logger.info('Compute node started', {\n        cpuAllocation: this.config.cpuAllocation,\n        memoryMB: this.config.memoryMB,\n      });\n\n      // Start task processing loop\n      this.processTasksLoop();\n    } catch (error) {\n      this.logger.error('Failed to start compute node', { error });\n      throw error;\n    }\n  }\n\n  /**\n   * Stop compute node\n   */\n  async stop(): Promise<void> {\n    if (!this.isRunning) {\n      this.logger.warn('Compute node not running');\n      return;\n    }\n\n    try {\n      this.isRunning = false;\n      await this.disconnect();\n\n      this.logger.info('Compute node stopped', {\n        tasksCompleted: this.stats.tasksCompleted,\n        totalComputeTime: this.stats.totalComputeTime,\n        estimatedEarnings: this.stats.estimatedEarnings,\n      });\n    } catch (error) {\n      this.logger.error('Failed to stop compute node', { error });\n      throw error;\n    }\n  }\n\n  /**\n   * Submit result to gateway\n   */\n  async submitResult(result: ComputeResult): Promise<void> {\n    try {\n      // when motivation is low-load fetch\n      const fetch = globalThis.fetch || (await import('node-fetch')).default;\n\n      const response = await fetch(\n        `${this.config.gatewayUrl}/tasks/${result.taskId}/result`,\n        {\n          method: 'POST',\n          headers: this.getRequestHeaders({\n            'Content-Type': 'application/json',\n          }),\n          body: JSON.stringify(result),\n        }\n      );\n\n      if (!response.ok) {\n        throw new Error(`Failed to submit result: ${response.status}`);\n      }\n\n      // Update earnings estimate\n      this.stats.estimatedEarnings += result.computeTimeMs * 0.0001;\n\n      this.logger.debug('Result submitted', {\n        taskId: result.taskId,\n        computeTimeMs: result.computeTimeMs,\n      });\n    } catch (error) {\n      this.logger.error('Failed to submit result', { error });\n      throw error;\n    }\n  }\n\n  /**\n   * Get current stats\n   */\n  getStats(): ComputeStats {\n    if (this.isRunning && this.startTime > 0) {\n      this.stats.uptime = Date.now() - this.startTime;\n    }\n    return { ...this.stats };\n  }\n\n  /**\n   * Process tasks loop\n   */\n  private async processTasksLoop(): Promise<void> {\n    while (this.isRunning) {\n      try {\n        // Fetch task from gateway\n        const task = await this.fetchTask();\n\n        if (task) {\n          this.stats.activeTaskCount++;\n\n          // Execute task\n          const startTime = Date.now();\n          const result: ComputeResult = {\n            taskId: task.id,\n            output: null,\n            computeTimeMs: 0,\n            success: true,\n          };\n\n          try {\n            // Simulate task processing (placeholder)\n            await this.executeTask(task);\n            result.computeTimeMs = Date.now() - startTime;\n          } catch (error) {\n            result.success = false;\n            result.error =\n              error instanceof Error ? error.message : String(error);\n            result.computeTimeMs = Date.now() - startTime;\n          }\n\n          // Submit result\n          await this.submitResult(result);\n\n          // Update stats\n          this.stats.tasksCompleted++;\n          this.stats.totalComputeTime += result.computeTimeMs / 1000;\n          this.stats.activeTaskCount--;\n        } else {\n          // No task available, wait a bit\n          await new Promise((resolve) => setTimeout(resolve, 1000));\n        }\n      } catch (error) {\n        this.logger.warn('Task processing error', { error });\n        await new Promise((resolve) => setTimeout(resolve, 1000));\n      }\n    }\n  }\n\n  /**\n   * Fetch task from gateway\n   */\n  private async fetchTask(): Promise<ComputeTask | null> {\n    try {\n      // when motivation is low-load fetch\n      const fetch = globalThis.fetch || (await import('node-fetch')).default;\n\n      const response = await fetch(`${this.config.gatewayUrl}/tasks`, {\n        method: 'POST',\n        headers: this.getRequestHeaders({\n          'Content-Type': 'application/json',\n        }),\n        body: JSON.stringify({\n          cpuAllocation: this.config.cpuAllocation,\n          memoryMB: this.config.memoryMB,\n          maxDuration: this.config.maxTaskDuration,\n        }),\n      });\n\n      if (response.status === 204) {\n        // No tasks available\n        return null;\n      }\n\n      if (!response.ok) {\n        throw new Error(`Failed to fetch task: ${response.status}`);\n      }\n\n      const task = (await response.json()) as ComputeTask;\n      return task;\n    } catch (error) {\n      this.logger.debug('Task fetch error', { error });\n      return null;\n    }\n  }\n\n  /**\n   * Execute task (placeholder)\n   */\n  private async executeTask(task: ComputeTask): Promise<void> {\n    // This would run actual inference or computation\n    // For now, just a placeholder\n    await new Promise((resolve) => setTimeout(resolve, Math.random() * 1000));\n  }\n\n  /**\n   * Check token balance before task execution\n   */\n  async checkTokenBalance(): Promise<boolean> {\n    if (!this.tokenSpendingManager) {\n      return true; // No token manager, proceed\n    }\n\n    try {\n      await this.tokenSpendingManager.syncBalance();\n      const balance = this.tokenSpendingManager.getBalance();\n\n      this.logger.debug('Token balance checked', {\n        available: balance.available.toString(),\n      });\n\n      return balance.available > 0n;\n    } catch (error) {\n      this.logger.warn('Failed to check token balance', { error });\n      return true; // Proceed on error\n    }\n  }\n\n  /**\n   * Request token spend for task (if enabled and no subscription)\n   */\n  async requestTokenSpend(\n    taskId: string,\n    estimatedDurationSeconds: number\n  ): Promise<string | null> {\n    if (!this.tokenSpendingManager) {\n      return null; // No token manager\n    }\n\n    try {\n      const tx = await this.tokenSpendingManager.requestTokenSpend(\n        taskId,\n        estimatedDurationSeconds,\n        this.hasSubscription\n      );\n\n      if (!tx) {\n        this.logger.debug('Using subscription, skipping token spend', {\n          taskId,\n        });\n        return null;\n      }\n\n      this.logger.info('Token spend approved', {\n        txId: tx.id,\n        amount: tx.amount.toString(),\n      });\n\n      return tx.id;\n    } catch (error) {\n      this.logger.error('Token spend request failed', { error, taskId });\n      throw error;\n    }\n  }\n\n  /**\n   * Execute token burn after task completion\n   */\n  async burnTokensForTask(\n    txId: string,\n    actualDurationSeconds: number\n  ): Promise<void> {\n    if (!this.tokenSpendingManager || !txId) {\n      return; // No token manager or not a token-paid task\n    }\n\n    try {\n      const ledger = this.tokenSpendingManager.getLedger();\n      const tx = ledger.pendingTransactions.find((t) => t.id === txId);\n\n      if (!tx) {\n        this.logger.warn('Pending transaction not found', { txId });\n        return;\n      }\n\n      await this.tokenSpendingManager.burnTokens(tx);\n\n      this.logger.info('Tokens burned for task', {\n        txId,\n        actualDuration: actualDurationSeconds,\n      });\n    } catch (error) {\n      this.logger.error('Failed to burn tokens', { error, txId });\n      throw error;\n    }\n  }\n\n  /**\n   * Get token balance info\n   */\n  getTokenBalance() {\n    if (!this.tokenSpendingManager) {\n      return null;\n    }\n    return this.tokenSpendingManager.getBalance();\n  }\n\n  /**\n   * Get token ledger info\n   */\n  getTokenLedger() {\n    if (!this.tokenSpendingManager) {\n      return null;\n    }\n    return this.tokenSpendingManager.getLedger();\n  }\n}\n","/**\n * Token Spending Manager - Handles EDGEWORK token balance and spending for compute\n * Implements subscription-first fallback: if subscription has credits, use those first.\n * Only burns tokens if subscription unavailable or credits exhausted.\n */\n\nimport type {\n  TokenBalance,\n  TokenRateLimit,\n  TokenSpendingTransaction,\n  TokenLedger,\n  TokenSpendingConfig,\n  TokenSpendingEvent,\n  TokenSpendingEventType,\n  TokenSpendingEventListener,\n} from './types';\n\ninterface TokenSpendingLogger {\n  debug: (msg: string, data?: unknown) => void;\n  info: (msg: string, data?: unknown) => void;\n  warn: (msg: string, data?: unknown) => void;\n  error: (msg: string, data?: unknown) => void;\n}\n\ninterface TokenBurnTransaction {\n  wait: () => Promise<{ hash?: string }>;\n  hash?: string;\n}\n\ninterface TokenContract {\n  balanceOf: (owner: string) => Promise<{ toString: () => string }>;\n  burn: (amount: bigint) => Promise<TokenBurnTransaction>;\n}\n\ninterface EthersModule {\n  JsonRpcProvider: new (rpcUrl: string) => unknown;\n  Contract: new (\n    address: string,\n    abi: string[],\n    provider: unknown\n  ) => TokenContract;\n}\n\n/**\n * Manages token-based compute spending with subscription fallback\n *\n * @example\n * ```typescript\n * const manager = new TokenSpendingManager({\n *   walletAddress: '0x...',\n *   tokenAddress: '0x55ef8e6e56DEDc7f72658E53C7b2759c74210a5A',\n *   enableTokenSpending: true,\n *   rateLimit: {\n *     costPerMinute: 1000000000000000000n, // 1 token per minute\n *     costPerCall: 100000000000000000n,\n *     minimumBalance: 1000000000000000000n,\n *     dailyLimit: 1000000000000000000000n,\n *     subscriptionRequired: false,\n *   },\n *   balanceSyncInterval: 300000, // 5 minutes\n *   rpcUrl: 'https://sepolia.optimism.io',\n * });\n *\n * await manager.initialize();\n * const balance = await manager.getBalance();\n * const tx = await manager.requestTokenSpend('task-123', 60, false);\n * ```\n */\nexport class TokenSpendingManager {\n  private walletAddress: string;\n  private config: TokenSpendingConfig;\n  private ledger: TokenLedger;\n  private logger: TokenSpendingLogger;\n  private web3Provider: unknown = null;\n  private tokenContract: TokenContract | null = null;\n  private balanceSyncInterval: NodeJS.Timeout | null = null;\n  private listeners: Map<\n    TokenSpendingEventType,\n    Set<TokenSpendingEventListener<TokenSpendingEventType>>\n  > = new Map();\n\n  constructor(walletAddress: string, config: TokenSpendingConfig) {\n    this.walletAddress = walletAddress;\n    this.config = config;\n    this.logger = this.createLogger();\n\n    // Initialize ledger\n    this.ledger = {\n      address: walletAddress,\n      balance: {\n        total: 0n,\n        available: 0n,\n        locked: 0n,\n        updatedAt: Date.now(),\n      },\n      spentToday: 0n,\n      pendingTransactions: [],\n      completedTransactions: [],\n      lastSyncAt: 0,\n    };\n  }\n\n  private createLogger() {\n    return {\n      debug: (msg: string, data?: unknown) =>\n        console.debug(`[TokenSpendingManager] ${msg}`, data),\n      info: (msg: string, data?: unknown) =>\n        console.info(`[TokenSpendingManager] ${msg}`, data),\n      warn: (msg: string, data?: unknown) =>\n        console.warn(`[TokenSpendingManager] ${msg}`, data),\n      error: (msg: string, data?: unknown) =>\n        console.error(`[TokenSpendingManager] ${msg}`, data),\n    };\n  }\n\n  /**\n   * Initialize and connect to token contract\n   */\n  async initialize(): Promise<void> {\n    try {\n      if (!this.config.enableTokenSpending) {\n        this.logger.info('Token spending disabled');\n        return;\n      }\n\n      const resolvedEthers = await this.loadEthers();\n      if (!resolvedEthers) {\n        this.logger.warn(\n          'Ethers module not available; token spending disabled'\n        );\n        this.config.enableTokenSpending = false;\n        return;\n      }\n\n      const { JsonRpcProvider: DirectJsonRpcProvider, Contract } =\n        resolvedEthers;\n      const JsonRpcProvider =\n        DirectJsonRpcProvider ??\n        (\n          resolvedEthers as unknown as {\n            providers?: { JsonRpcProvider?: new (rpcUrl: string) => unknown };\n          }\n        ).providers?.JsonRpcProvider;\n\n      if (!JsonRpcProvider || !Contract) {\n        throw new Error('Ethers module missing JsonRpcProvider or Contract');\n      }\n\n      // Create provider\n      const rpcUrl = this.config.rpcUrl || 'https://sepolia.optimism.io';\n      this.web3Provider = new JsonRpcProvider(rpcUrl);\n\n      // ERC20 ABI (minimal for our use case)\n      const erc20Abi = [\n        'function balanceOf(address owner) view returns (uint256)',\n        'function burn(uint256 amount) external',\n        'function allowance(address owner, address spender) view returns (uint256)',\n        'function approve(address spender, uint256 amount) external returns (bool)',\n        'function decimals() view returns (uint8)',\n      ];\n\n      // Create contract instance\n      this.tokenContract = new Contract(\n        this.config.tokenAddress,\n        erc20Abi,\n        this.web3Provider\n      );\n\n      // Initial sync\n      await this.syncBalance();\n\n      // Start periodic sync (5 minutes default)\n      this.startBalanceSyncLoop();\n\n      this.logger.info('TokenSpendingManager initialized', {\n        tokenAddress: this.config.tokenAddress,\n        syncInterval: this.config.balanceSyncInterval,\n      });\n    } catch (error) {\n      this.logger.error('Failed to initialize TokenSpendingManager', { error });\n      throw error;\n    }\n  }\n\n  private async loadEthers(): Promise<EthersModule | null> {\n    try {\n      const ethers = await import('ethers');\n      return ethers as unknown as EthersModule;\n    } catch (error) {\n      this.logger.warn('Failed to load ethers module', { error });\n      return null;\n    }\n  }\n\n  /**\n   * Sync balance from on-chain\n   */\n  async syncBalance(): Promise<void> {\n    try {\n      if (!this.tokenContract) {\n        return;\n      }\n\n      const balance = await this.tokenContract.balanceOf(this.walletAddress);\n      const now = Date.now();\n\n      this.ledger.balance = {\n        total: BigInt(balance.toString()),\n        available: BigInt(balance.toString()) - this.ledger.balance.locked,\n        locked: this.ledger.balance.locked,\n        updatedAt: now,\n      };\n\n      this.ledger.lastSyncAt = now;\n\n      this.emit('balanceUpdated', {\n        balance: this.ledger.balance,\n      });\n\n      this.logger.debug('Balance synced', {\n        total: this.ledger.balance.total.toString(),\n        available: this.ledger.balance.available.toString(),\n      });\n    } catch (error) {\n      this.logger.error('Failed to sync balance', { error });\n    }\n  }\n\n  /**\n   * Start periodic balance sync loop\n   */\n  private startBalanceSyncLoop(): void {\n    if (this.balanceSyncInterval) {\n      clearInterval(this.balanceSyncInterval);\n    }\n\n    this.balanceSyncInterval = setInterval(async () => {\n      await this.syncBalance();\n    }, this.config.balanceSyncInterval) as unknown as NodeJS.Timeout;\n  }\n\n  /**\n   * Request token spend for compute task\n   * Returns spending transaction if approved, null if using subscription or insufficient tokens\n   */\n  async requestTokenSpend(\n    taskId: string,\n    durationSeconds: number,\n    hasSubscription: boolean\n  ): Promise<TokenSpendingTransaction | null> {\n    try {\n      // If user has active subscription, use it first (subscription-first priority)\n      if (hasSubscription) {\n        this.logger.debug('Using subscription credits instead of tokens', {\n          taskId,\n        });\n        return null;\n      }\n\n      // Calculate cost\n      const minutes = Math.ceil(durationSeconds / 60);\n      const estimatedCost =\n        this.config.rateLimit.costPerMinute * BigInt(minutes);\n\n      // Check daily limit\n      if (\n        this.ledger.spentToday + estimatedCost >\n        this.config.rateLimit.dailyLimit\n      ) {\n        this.emit('dailyLimitExceeded', {\n          spent: this.ledger.spentToday,\n          limit: this.config.rateLimit.dailyLimit,\n        });\n\n        throw new Error(\n          `Daily token limit exceeded: ${this.ledger.spentToday.toString()} + ${estimatedCost.toString()} > ${this.config.rateLimit.dailyLimit.toString()}`\n        );\n      }\n\n      // Check balance\n      if (this.ledger.balance.available < estimatedCost) {\n        this.emit('insufficientBalance', {\n          required: estimatedCost,\n          available: this.ledger.balance.available,\n        });\n\n        throw new Error(\n          `Insufficient token balance: required ${estimatedCost.toString()}, available ${this.ledger.balance.available.toString()}`\n        );\n      }\n\n      // Create pending transaction\n      const tx: TokenSpendingTransaction = {\n        id: `tx-${Date.now()}-${Math.random().toString(36).slice(2, 9)}`,\n        taskId,\n        amount: estimatedCost,\n        durationSeconds,\n        status: 'pending',\n        createdAt: Date.now(),\n      };\n\n      // Lock tokens\n      this.ledger.balance.locked += estimatedCost;\n      this.ledger.balance.available -= estimatedCost;\n      this.ledger.pendingTransactions.push(tx);\n\n      this.emit('transactionSubmitted', { tx });\n\n      this.logger.info('Token spend approved', {\n        taskId,\n        amount: estimatedCost.toString(),\n        duration: durationSeconds,\n      });\n\n      return tx;\n    } catch (error) {\n      this.logger.error('Failed to request token spend', { error, taskId });\n      throw error;\n    }\n  }\n\n  /**\n   * Execute token burn on-chain after task completion\n   */\n  async burnTokens(tx: TokenSpendingTransaction): Promise<void> {\n    try {\n      if (!this.tokenContract || tx.status !== 'pending') {\n        throw new Error(\n          `Cannot burn tokens: contract=${!this.tokenContract}, status=${\n            tx.status\n          }`\n        );\n      }\n\n      this.logger.info('Burning tokens', {\n        txId: tx.id,\n        amount: tx.amount.toString(),\n      });\n\n      // Call burn function on contract\n      const burnTx = await this.tokenContract.burn(tx.amount);\n      const receipt = await burnTx.wait();\n\n      tx.status = 'confirmed';\n      tx.txHash = receipt.hash || burnTx.hash;\n      tx.confirmedAt = Date.now();\n\n      // Update ledger\n      this.ledger.balance.locked -= tx.amount;\n      this.ledger.spentToday += tx.amount;\n\n      // Move from pending to completed\n      this.ledger.pendingTransactions = this.ledger.pendingTransactions.filter(\n        (p) => p.id !== tx.id\n      );\n      this.ledger.completedTransactions.push(tx);\n\n      this.emit('transactionConfirmed', {\n        tx,\n        txHash: tx.txHash || '',\n      });\n\n      this.logger.info('Tokens burned successfully', {\n        txId: tx.id,\n        txHash: tx.txHash,\n      });\n    } catch (error) {\n      tx.status = 'failed';\n      tx.error = error instanceof Error ? error.message : String(error);\n\n      // Unlock tokens on unmet expectations\n      this.ledger.balance.locked -= tx.amount;\n      this.ledger.balance.available += tx.amount;\n\n      // Move from pending to failed\n      this.ledger.pendingTransactions = this.ledger.pendingTransactions.filter(\n        (p) => p.id !== tx.id\n      );\n      this.ledger.completedTransactions.push(tx);\n\n      this.emit('transactionFailed', {\n        tx,\n        error: tx.error,\n      });\n\n      this.logger.error('Failed to burn tokens', { error, txId: tx.id });\n      throw error;\n    }\n  }\n\n  /**\n   * Get current balance\n   */\n  getBalance(): TokenBalance {\n    return this.ledger.balance;\n  }\n\n  /**\n   * Get full ledger\n   */\n  getLedger(): TokenLedger {\n    return this.ledger;\n  }\n\n  /**\n   * Check if user can afford compute\n   */\n  canAffordCompute(durationSeconds: number): boolean {\n    const minutes = Math.ceil(durationSeconds / 60);\n    const cost = this.config.rateLimit.costPerMinute * BigInt(minutes);\n    return this.ledger.balance.available >= cost;\n  }\n\n  /**\n   * Get estimated cost for compute duration\n   */\n  getEstimatedCost(durationSeconds: number): bigint {\n    const minutes = Math.ceil(durationSeconds / 60);\n    return this.config.rateLimit.costPerMinute * BigInt(minutes);\n  }\n\n  /**\n   * Register event listener\n   */\n  on<K extends TokenSpendingEventType>(\n    event: K,\n    listener: TokenSpendingEventListener<K>\n  ): void {\n    if (!this.listeners.has(event)) {\n      this.listeners.set(event, new Set());\n    }\n    this.listeners\n      .get(event)!\n      .add(listener as TokenSpendingEventListener<TokenSpendingEventType>);\n  }\n\n  /**\n   * Unregister event listener\n   */\n  off<K extends TokenSpendingEventType>(\n    event: K,\n    listener: TokenSpendingEventListener<K>\n  ): void {\n    const set = this.listeners.get(event);\n    if (set) {\n      set.delete(\n        listener as TokenSpendingEventListener<TokenSpendingEventType>\n      );\n    }\n  }\n\n  /**\n   * Emit event to all listeners\n   */\n  private emit<K extends TokenSpendingEventType>(\n    event: K,\n    data: TokenSpendingEvent[K]\n  ): void {\n    const set = this.listeners.get(event);\n    if (set) {\n      set.forEach((listener) => listener(data));\n    }\n  }\n\n  /**\n   * Cleanup and stop sync\n   */\n  async stop(): Promise<void> {\n    if (this.balanceSyncInterval) {\n      clearInterval(this.balanceSyncInterval);\n      this.balanceSyncInterval = null;\n    }\n    this.listeners.clear();\n    this.logger.info('TokenSpendingManager stopped');\n  }\n}\n","/**\n * Agent Manager - Orchestrates gateway, compute node, and token spending\n */\n\nimport fs from 'fs/promises';\nimport path from 'path';\nimport type {\n  AgentConfig,\n  AgentEventListener,\n  AgentEventType,\n  AgentEvents,\n  AgentManagerOptions,\n  ComputeStats,\n  TokenSpendingConfig,\n} from './types';\nimport { GatewayConnector } from './GatewayConnector';\nimport { ComputeNode } from './ComputeNode';\nimport { WalletManager } from './WalletManager';\nimport { TokenSpendingManager } from './TokenSpendingManager';\nimport { resolveEdgeworkApiKey } from '../edgework-api-key';\n\n/**\n * Main agent orchestrator with token-based compute spending support\n *\n * @example\n * ```typescript\n * const manager = new AgentManager({\n *   gatewayName: 'My Node',\n *   cpuAllocation: 0.8,\n *   enableSystemTray: true,\n *   runAtBoot: true,\n * });\n *\n * await manager.initialize();\n * await manager.start();\n *\n * manager.on('statsUpdated', ({ stats }) => {\n *   console.log('Earnings:', stats.estimatedEarnings);\n * });\n * ```\n */\nexport class AgentManager {\n  private config: AgentConfig;\n  private configPath: string;\n  private apiKey: string | undefined;\n  private gateway: GatewayConnector | null = null;\n  private computeNode: ComputeNode | null = null;\n  private walletManager: WalletManager;\n  private tokenSpending: TokenSpendingManager | null = null;\n  private listeners: Map<string, Set<(...args: unknown[]) => void>> = new Map();\n  private isRunning = false;\n  private statsInterval: NodeJS.Timeout | null = null;\n  private heartbeatInterval: NodeJS.Timeout | null = null;\n  private logger: any;\n\n  constructor(options: AgentManagerOptions = {}) {\n    this.configPath =\n      options.configPath || `${this.getConfigDir()}/agent-config.json`;\n    this.apiKey = resolveEdgeworkApiKey(options.apiKey);\n    this.walletManager = new WalletManager({\n      configDir: path.dirname(this.configPath),\n    });\n    this.logger = this.createLogger();\n\n    // Initialize config\n    this.config = {\n      gateway: {\n        name: options.gatewayName || 'Edgework Agent',\n        region: 'auto',\n        walletAddress: options.walletAddress || '',\n        metadata: {},\n      },\n      compute: {\n        cpuAllocation: options.cpuAllocation || 0.8,\n        memoryMB: options.memoryMB || 2048,\n        maxTaskDuration: 600,\n        enableGPU: true,\n        enableWebNN: true,\n        enableTokenSpending: options.enableTokenSpending,\n      },\n      system: {\n        runAtBoot: options.runAtBoot || false,\n        systemTray: options.enableSystemTray || false,\n        logLevel: 'info',\n      },\n    };\n\n    if (options.rpcUrl) {\n      (this.config as any).rpcUrl = options.rpcUrl;\n    }\n    if (options.registryAddress) {\n      (this.config as any).registryAddress = options.registryAddress;\n    }\n  }\n\n  private createLogger() {\n    return {\n      debug: (msg: string, data?: any) =>\n        console.debug(`[AgentManager] ${msg}`, data),\n      info: (msg: string, data?: any) =>\n        console.info(`[AgentManager] ${msg}`, data),\n      warn: (msg: string, data?: any) =>\n        console.warn(`[AgentManager] ${msg}`, data),\n      error: (msg: string, data?: any) =>\n        console.error(`[AgentManager] ${msg}`, data),\n    };\n  }\n\n  private getConfigDir(): string {\n    const homeDir = process.env.HOME || process.env.USERPROFILE || '/root';\n    return `${homeDir}/.edgework`;\n  }\n\n  /**\n   * Initialize agent\n   */\n  async initialize(): Promise<void> {\n    try {\n      this.logger.info('Initializing agent');\n\n      // Load or create config\n      await this.loadOrCreateConfig();\n\n      // Initialize gateway connector\n      this.gateway = new GatewayConnector({\n        walletAddress: this.config.gateway.walletAddress,\n        provider: (this.config as any).rpcUrl,\n        registryAddress: (this.config as any).registryAddress,\n        apiKey: this.apiKey,\n      });\n\n      // Initialize token spending manager if enabled\n      if (this.config.compute.enableTokenSpending ?? true) {\n        const tokenConfig: TokenSpendingConfig = {\n          tokenAddress:\n            this.config.compute.tokenAddress ||\n            '0x55ef8e6e56DEDc7f72658E53C7b2759c74210a5A',\n          enableTokenSpending: this.config.compute.enableTokenSpending ?? true,\n          rateLimit: {\n            costPerMinute:\n              this.config.compute.tokenCostPerMinute || 1000000000000000000n,\n            costPerCall: 100000000000000000n,\n            minimumBalance:\n              this.config.compute.minTokenBalance || 1000000000000000000n,\n            dailyLimit: 1000000000000000000000n,\n            subscriptionRequired: false,\n          },\n          balanceSyncInterval: 300000, // 5 minutes\n          rpcUrl: (this.config as any).rpcUrl,\n        };\n\n        this.tokenSpending = new TokenSpendingManager(\n          this.config.gateway.walletAddress,\n          tokenConfig\n        );\n\n        await this.tokenSpending.initialize();\n\n        // Listen for token events\n        this.tokenSpending.on('balanceUpdated', ({ balance }) => {\n          this.logger.debug('Token balance updated', {\n            available: balance.available.toString(),\n          });\n        });\n\n        this.tokenSpending.on('transactionFailed', ({ tx, error }) => {\n          this.logger.warn('Token transaction failed', {\n            txId: tx.id,\n            error,\n          });\n        });\n      }\n\n      // Initialize compute node with token manager\n      this.computeNode = new ComputeNode(\n        {\n          gatewayUrl: 'http://localhost:8080', // Will be updated\n          apiKey: this.apiKey,\n          cpuAllocation: this.config.compute.cpuAllocation,\n          memoryMB: this.config.compute.memoryMB,\n          maxTaskDuration: this.config.compute.maxTaskDuration,\n          enableGPU: this.config.compute.enableGPU,\n        },\n        this.tokenSpending || undefined,\n        this.config.gateway.walletAddress,\n        false // hasSubscription - will be determined at runtime\n      );\n\n      this.logger.info('Agent initialized successfully');\n    } catch (error) {\n      this.logger.error('Initialization failed', { error });\n      throw error;\n    }\n  }\n\n  /**\n   * Start agent\n   */\n  async start(): Promise<void> {\n    if (this.isRunning) {\n      this.logger.warn('Agent already running');\n      return;\n    }\n\n    try {\n      this.logger.info('Starting agent');\n\n      // Connect gateway\n      if (this.gateway) {\n        await this.gateway.connect();\n        const status = await this.gateway.getStatus();\n\n        if (!status) {\n          this.logger.info('Gateway not registered, registering now...');\n          await this.gateway.register(this.config.gateway);\n        }\n      }\n\n      // Start compute node\n      if (this.computeNode) {\n        await this.computeNode.start();\n      }\n\n      this.isRunning = true;\n\n      // Start heartbeat interval (every 12 hours)\n      this.heartbeatInterval = setInterval(\n        () => this.sendHeartbeat(),\n        12 * 60 * 60 * 1000\n      );\n\n      // Start stats reporting interval (every 5 minutes)\n      this.statsInterval = setInterval(() => this.reportStats(), 5 * 60 * 1000);\n\n      this.emit('started', { timestamp: Date.now() });\n      this.logger.info('Agent started successfully');\n    } catch (error) {\n      this.logger.error('Start failed', { error });\n      throw error;\n    }\n  }\n\n  /**\n   * Stop agent\n   */\n  async stop(reason = 'User requested'): Promise<void> {\n    if (!this.isRunning) {\n      this.logger.warn('Agent not running');\n      return;\n    }\n\n    try {\n      this.logger.info('Stopping agent', { reason });\n\n      // Clear intervals\n      if (this.heartbeatInterval) {\n        clearInterval(this.heartbeatInterval);\n        this.heartbeatInterval = null;\n      }\n      if (this.statsInterval) {\n        clearInterval(this.statsInterval);\n        this.statsInterval = null;\n      }\n\n      // Stop token spending manager\n      if (this.tokenSpending) {\n        await this.tokenSpending.stop();\n      }\n\n      // Stop compute node\n      if (this.computeNode) {\n        await this.computeNode.stop();\n      }\n\n      // Disconnect gateway\n      if (this.gateway) {\n        await this.gateway.disconnect();\n      }\n\n      this.isRunning = false;\n      this.emit('stopped', { reason, timestamp: Date.now() });\n\n      this.logger.info('Agent stopped successfully');\n    } catch (error) {\n      this.logger.error('Stop failed', { error });\n      throw error;\n    }\n  }\n\n  /**\n   * Get current stats\n   */\n  getStats(): ComputeStats {\n    if (!this.computeNode) {\n      return {\n        tasksCompleted: 0,\n        totalComputeTime: 0,\n        estimatedEarnings: 0,\n        activeTaskCount: 0,\n        cpuUsage: 0,\n        memoryUsage: 0,\n        uptime: 0,\n      };\n    }\n\n    return this.computeNode.getStats();\n  }\n\n  /**\n   * Send heartbeat to gateway\n   */\n  private async sendHeartbeat(): Promise<void> {\n    try {\n      if (this.gateway && this.isRunning) {\n        await this.gateway.sendHeartbeat();\n        this.logger.debug('Heartbeat sent');\n      }\n    } catch (error) {\n      this.logger.warn('Heartbeat failed', { error });\n    }\n  }\n\n  /**\n   * Report stats and emit event\n   */\n  private reportStats(): Promise<void> {\n    const stats = this.getStats();\n    this.emit('statsUpdated', { stats });\n    return Promise.resolve();\n  }\n\n  /**\n   * Load or create config\n   */\n  private async loadOrCreateConfig(): Promise<void> {\n    try {\n      // Try to load existing config\n      const content = await fs.readFile(this.configPath, 'utf8');\n      this.config = JSON.parse(content);\n      this.logger.info('Config loaded from', { path: this.configPath });\n    } catch (error) {\n      // Create default config\n      await this.saveConfig();\n      this.logger.info('Config created', { path: this.configPath });\n    }\n  }\n\n  /**\n   * Save config to file\n   */\n  private async saveConfig(): Promise<void> {\n    const dir = path.dirname(this.configPath);\n    await fs.mkdir(dir, { recursive: true });\n    await fs.writeFile(this.configPath, JSON.stringify(this.config, null, 2));\n  }\n\n  /**\n   * Event listener registration\n   */\n  on<K extends AgentEventType>(\n    event: K,\n    listener: AgentEventListener<K>\n  ): void {\n    if (!this.listeners.has(event)) {\n      this.listeners.set(event, new Set());\n    }\n    this.listeners.get(event)!.add(listener as (...args: unknown[]) => void);\n  }\n\n  /**\n   * Remove event listener\n   */\n  off<K extends AgentEventType>(\n    event: K,\n    listener: AgentEventListener<K>\n  ): void {\n    const listeners = this.listeners.get(event);\n    if (listeners) {\n      listeners.delete(listener as (...args: unknown[]) => void);\n    }\n  }\n\n  /**\n   * Emit event\n   */\n  private emit<K extends AgentEventType>(event: K, data: AgentEvents[K]): void {\n    const listeners = this.listeners.get(event);\n    if (listeners) {\n      listeners.forEach((listener) => {\n        try {\n          (listener as (data: AgentEvents[K]) => void)(data);\n        } catch (error) {\n          this.logger.error('Event listener error', { event, error });\n        }\n      });\n    }\n  }\n\n  /**\n   * Get config\n   */\n  getConfig(): AgentConfig {\n    return this.config;\n  }\n\n  /**\n   * Get token spending manager (if enabled)\n   */\n  getTokenSpendingManager(): TokenSpendingManager | null {\n    return this.tokenSpending;\n  }\n\n  /**\n   * Get current token balance\n   */\n  getTokenBalance() {\n    if (!this.tokenSpending) {\n      return null;\n    }\n    return this.tokenSpending.getBalance();\n  }\n\n  /**\n   * Update config\n   */\n  async updateConfig(partial: Partial<AgentConfig>): Promise<void> {\n    this.config = { ...this.config, ...partial };\n    await this.saveConfig();\n  }\n}\n","/**\n * System Tray Integration - Multi-platform support\n * eslint-disable luxury-ui/no-emojis\n */\n\nimport type { SystemTrayOptions } from './types';\nimport type { AgentManager } from './AgentManager';\n\nexport interface SystemTrayMenuOption {\n  label: string;\n  action: () => void | Promise<void>;\n  accelerator?: string;\n  type?: 'typical' | 'separator' | 'submenu';\n}\n\n/**\n * Base system tray abstraction\n */\nexport abstract class SystemTray {\n  protected agentManager: any;\n  protected logger: any;\n\n  constructor(agentManager: any) {\n    this.agentManager = agentManager;\n    this.logger = this.createLogger();\n  }\n\n  protected createLogger() {\n    return {\n      debug: (msg: string, data?: any) =>\n        console.debug(`[SystemTray] ${msg}`, data),\n      info: (msg: string, data?: any) =>\n        console.info(`[SystemTray] ${msg}`, data),\n      error: (msg: string, data?: any) =>\n        console.error(`[SystemTray] ${msg}`, data),\n    };\n  }\n\n  abstract show(): Promise<void>;\n  abstract hide(): Promise<void>;\n  abstract setStatus(status: string): Promise<void>;\n  abstract updateStats(): Promise<void>;\n}\n\n/**\n * macOS system tray (Cocoa/SwiftUI)\n */\nexport class MacOSSystemTray extends SystemTray {\n  private windowShown = false;\n\n  async show(): Promise<void> {\n    try {\n      // Implementation note: implementation, this would use node-macos-native or similar\n      // Current behavior: we'll use a placeholder that logs intentions\n      this.logger.info('macOS tray icon shown');\n      this.windowShown = true;\n    } catch (error) {\n      this.logger.error('Failed to show tray', { error });\n      throw error;\n    }\n  }\n\n  async hide(): Promise<void> {\n    this.windowShown = false;\n    this.logger.info('macOS tray icon hidden');\n  }\n\n  async setStatus(status: string): Promise<void> {\n    this.logger.debug('Status updated', { status });\n    // Would update menu bar title\n  }\n\n  async updateStats(): Promise<void> {\n    const stats = this.agentManager.getStats();\n    const status = `$${stats.estimatedEarnings.toFixed(2)} | Settings: ${\n      stats.tasksCompleted\n    } tasks`;\n    await this.setStatus(status);\n  }\n\n  private getMenuItems(): SystemTrayMenuOption[] {\n    return [\n      {\n        label: 'Status',\n        action: () => this.showStatus(),\n      },\n      {\n        label: 'separator',\n        type: 'separator',\n        action: () => {\n          return undefined;\n        },\n      },\n      {\n        label: 'Start',\n        action: () => this.agentManager.start(),\n      },\n      {\n        label: 'Stop',\n        action: () => this.agentManager.stop(),\n      },\n      {\n        label: 'separator',\n        type: 'separator',\n        action: () => {\n          return undefined;\n        },\n      },\n      {\n        label: 'Settings',\n        action: () => this.showSettings(),\n      },\n      {\n        label: 'Quit',\n        action: () => process.exit(0),\n        accelerator: 'Cmd+Q',\n      },\n    ];\n  }\n\n  private showStatus(): void {\n    const stats = this.agentManager.getStats();\n    console.log('\\nEdgework Agent Status');\n    console.log('========================');\n    console.log(`Tasks Completed: ${stats.tasksCompleted}`);\n    console.log(`Compute Time: ${(stats.totalComputeTime / 60).toFixed(2)}m`);\n    console.log(`Estimated Earnings: $${stats.estimatedEarnings.toFixed(2)}`);\n    console.log(`Active Tasks: ${stats.activeTaskCount}`);\n    console.log(`Uptime: ${(stats.uptime / 60000).toFixed(2)}m\\n`);\n  }\n\n  private showSettings(): void {\n    const config = this.agentManager.getConfig();\n    console.log('\\nAgent Settings');\n    console.log('==================');\n    console.log(`Gateway: ${config.gateway.name}`);\n    console.log(`Region: ${config.gateway.region}`);\n    console.log(\n      `CPU Allocation: ${(config.compute.cpuAllocation * 100).toFixed(0)}%`\n    );\n    console.log(`Memory: ${config.compute.memoryMB}MB\\n`);\n  }\n}\n\n/**\n * Windows system tray (Windows API)\n */\nexport class WindowsSystemTray extends SystemTray {\n  private windowShown = false;\n\n  async show(): Promise<void> {\n    try {\n      this.logger.info('Windows tray icon shown');\n      this.windowShown = true;\n    } catch (error) {\n      this.logger.error('Failed to show tray', { error });\n      throw error;\n    }\n  }\n\n  async hide(): Promise<void> {\n    this.windowShown = false;\n    this.logger.info('Windows tray icon hidden');\n  }\n\n  async setStatus(status: string): Promise<void> {\n    this.logger.debug('Status updated', { status });\n    // Would update tooltip\n  }\n\n  async updateStats(): Promise<void> {\n    const stats = this.agentManager.getStats();\n    const tooltip = [\n      `Edgework Agent`,\n      `Earnings: $${stats.estimatedEarnings.toFixed(2)}`,\n      `Tasks: ${stats.tasksCompleted}`,\n      `Uptime: ${(stats.uptime / 60000).toFixed(0)}m`,\n    ].join('\\n');\n    await this.setStatus(tooltip);\n  }\n\n  private getMenuItems(): SystemTrayMenuOption[] {\n    return [\n      {\n        label: 'Show Status',\n        action: () => this.showStatus(),\n      },\n      {\n        label: 'Start',\n        action: () => this.agentManager.start(),\n      },\n      {\n        label: 'Stop',\n        action: () => this.agentManager.stop(),\n      },\n      {\n        label: 'Settings',\n        action: () => this.showSettings(),\n      },\n      {\n        label: 'Exit',\n        action: () => process.exit(0),\n      },\n    ];\n  }\n\n  private showStatus(): void {\n    const stats = this.agentManager.getStats();\n    console.log('\\nEdgework Agent Status');\n    console.log('========================');\n    console.log(`Tasks Completed: ${stats.tasksCompleted}`);\n    console.log(`Earnings: $${stats.estimatedEarnings.toFixed(2)}`);\n    console.log(`Uptime: ${(stats.uptime / 60000).toFixed(0)} minutes\\n`);\n  }\n\n  private showSettings(): void {\n    const config = this.agentManager.getConfig();\n    console.log('\\nSettings');\n    console.log(`Gateway: ${config.gateway.name}`);\n    console.log(`CPU: ${(config.compute.cpuAllocation * 100).toFixed(0)}%\\n`);\n  }\n}\n\n/**\n * Linux system tray (xdg-desktop-portal / GTK)\n */\nexport class LinuxSystemTray extends SystemTray {\n  private windowShown = false;\n\n  async show(): Promise<void> {\n    try {\n      this.logger.info('Linux tray icon shown');\n      this.windowShown = true;\n    } catch (error) {\n      this.logger.error('Failed to show tray', { error });\n      throw error;\n    }\n  }\n\n  async hide(): Promise<void> {\n    this.windowShown = false;\n    this.logger.info('Linux tray icon hidden');\n  }\n\n  async setStatus(status: string): Promise<void> {\n    this.logger.debug('Status updated', { status });\n  }\n\n  async updateStats(): Promise<void> {\n    const stats = this.agentManager.getStats();\n    const status = `Edgework: $${stats.estimatedEarnings.toFixed(2)}`;\n    await this.setStatus(status);\n  }\n}\n\n/**\n * Factory for creating platform-specific system tray\n */\nexport function createSystemTray(options: any): SystemTray {\n  const platform = process.platform;\n\n  switch (platform) {\n    case 'darwin':\n      return new MacOSSystemTray(options.agentManager);\n    case 'win32':\n      return new WindowsSystemTray(options.agentManager);\n    case 'linux':\n      return new LinuxSystemTray(options.agentManager);\n    default:\n      throw new Error(`Unsupported platform: ${platform}`);\n  }\n}\n","/**\n * Interactive Setup Command\n * eslint-disable luxury-ui/no-emojis\n */\n\nimport readline from 'readline';\nimport fs from 'fs/promises';\nimport path from 'path';\nimport type { AgentConfig } from './types';\nimport { AgentManager } from './AgentManager';\nimport { WalletManager } from './WalletManager';\nimport { GatewayConnector } from './GatewayConnector';\n\ninterface SetupAnswers {\n  createWallet: boolean;\n  gatewayName: string;\n  region: string;\n  cpuAllocation: number;\n  enableSystemTray: boolean;\n  runAtBoot: boolean;\n}\n\n/**\n * Interactive setup wizard\n */\nexport async function runSetupWizard(\n  nonInteractive = false\n): Promise<SetupAnswers> {\n  const logger = {\n    log: (msg: string) => console.log(msg),\n    info: (msg: string) => console.info(`INFO: ${msg}`),\n    warn: (msg: string) => console.warn(`WARN: ${msg}`),\n    success: (msg: string) => console.log(`SUCCESS: ${msg}`),\n    error: (msg: string) => console.error(`ERROR: ${msg}`),\n  };\n\n  logger.log('\\nEdgework Agent Setup Wizard');\n  logger.log('================================\\n');\n\n  if (nonInteractive) {\n    logger.log('Running in non-interactive mode with defaults...\\n');\n\n    // Ensure wallet exists in non-interactive mode\n    const walletMgr = new WalletManager();\n    if (!(await walletMgr.walletExists())) {\n      logger.info('Generating new wallet (non-interactive)...');\n      await walletMgr.generateWallet();\n      await walletMgr.saveWallet();\n      logger.success('Wallet created.');\n    } else {\n      logger.info('Using existing wallet.');\n    }\n\n    return {\n      createWallet: true,\n      gatewayName: 'Edgework Agent',\n      region: 'auto',\n      cpuAllocation: 0.8,\n      enableSystemTray: false,\n      runAtBoot: false,\n    };\n  }\n\n  const rl = readline.createInterface({\n    input: process.stdin,\n    output: process.stdout,\n  });\n\n  const question = (prompt: string): Promise<string> => {\n    return new Promise((resolve) => {\n      rl.question(prompt, resolve);\n    });\n  };\n\n  try {\n    // Wallet creation\n    logger.log('Wallet Setup');\n    logger.log('---------------');\n    logger.log(\n      'The agent needs a wallet to register with the gateway on Optimism.'\n    );\n    logger.log(\n      'Keys are stored locally (encrypted with device-specific encryption).\\n'\n    );\n\n    const walletMgr = new WalletManager();\n    const walletExists = await walletMgr.walletExists();\n\n    let createWallet = true;\n    if (walletExists) {\n      const reuse = await question('✓ Wallet already exists. Use it? (y/n): ');\n      createWallet = reuse.toLowerCase() !== 'n';\n    } else {\n      const create = await question('✓ Create new wallet? (y/n, default: y): ');\n      createWallet = create.toLowerCase() !== 'n';\n    }\n\n    if (createWallet && !walletExists) {\n      logger.info('Generating new wallet...');\n      const newWallet = await walletMgr.generateWallet();\n      await walletMgr.saveWallet();\n      logger.success(`Wallet created: ${newWallet.address}`);\n    } else if (walletExists && createWallet) {\n      const wallet = await walletMgr.loadWallet();\n      if (wallet) {\n        logger.success(`Using wallet: ${wallet.address}`);\n      }\n    }\n\n    logger.log('\\n');\n\n    // Gateway configuration\n    logger.log('Gateway Configuration');\n    logger.log('-----------------------');\n\n    const gatewayNameInput = await question(\n      '✓ Gateway name (default: Edgework Agent): '\n    );\n    const gatewayName = gatewayNameInput || 'Edgework Agent';\n\n    const regionInput = await question(\n      '✓ Region (us-west, eu-central, us-east, auto): '\n    );\n    const region = regionInput || 'auto';\n\n    logger.log('\\n');\n\n    // Compute allocation\n    logger.log('Compute Allocation');\n    logger.log('--------------------');\n\n    const cpuInput = await question(\n      '✓ CPU allocation percentage (1-100, default: 80): '\n    );\n    const cpuAllocation = Math.min(\n      100,\n      Math.max(1, parseInt(cpuInput || '80') / 100)\n    );\n\n    const gpu = await question(\n      '✓ Enable GPU acceleration? (y/n, default: y): '\n    );\n    const enableGPU = gpu.toLowerCase() !== 'n';\n\n    const webnn = await question(\n      '✓ Enable WebNN acceleration? (y/n, default: y): '\n    );\n    const enableWebNN = webnn.toLowerCase() !== 'n';\n\n    logger.log('\\n');\n\n    // System integration\n    logger.log('System Integration');\n    logger.log('--------------------');\n\n    const tray = await question(\n      '✓ Enable system tray icon? (y/n, default: n): '\n    );\n    const enableSystemTray = tray.toLowerCase() === 'y';\n\n    const boot = await question(\n      '✓ Run agent at system boot? (y/n, default: n): '\n    );\n    const runAtBoot = boot.toLowerCase() === 'y';\n\n    if (runAtBoot) {\n      logger.warn(\n        'Boot persistence requires elevated privileges (will prompt if needed)'\n      );\n    }\n\n    logger.log('\\n');\n\n    // Summary\n    logger.log('Configuration Summary');\n    logger.log('-----------------------');\n    logger.log(`Gateway Name: ${gatewayName}`);\n    logger.log(`Region: ${region}`);\n    logger.log(`CPU Allocation: ${(cpuAllocation * 100).toFixed(0)}%`);\n    logger.log(`GPU: ${enableGPU ? 'Enabled' : 'Disabled'}`);\n    logger.log(`WebNN: ${enableWebNN ? 'Enabled' : 'Disabled'}`);\n    logger.log(`System Tray: ${enableSystemTray ? 'Enabled' : 'Disabled'}`);\n    logger.log(`Boot Restart: ${runAtBoot ? 'Enabled' : 'Disabled'}`);\n    logger.log('\\n');\n\n    const confirm = await question(\n      '✓ Continue with this configuration? (y/n): '\n    );\n\n    if (confirm.toLowerCase() !== 'y') {\n      logger.log('Setup cancelled.');\n      rl.close();\n      process.exit(0);\n    }\n\n    rl.close();\n\n    return {\n      createWallet,\n      gatewayName,\n      region,\n      cpuAllocation,\n      enableSystemTray,\n      runAtBoot,\n    };\n  } finally {\n    rl.close();\n  }\n}\n\n/**\n * Save configuration and complete setup\n */\nexport async function completeSetup(answers: SetupAnswers): Promise<void> {\n  const logger = {\n    log: (msg: string) => console.log(msg),\n    info: (msg: string) => console.info(`INFO: ${msg}`),\n    warn: (msg: string) => console.warn(`WARN: ${msg}`),\n    success: (msg: string) => console.log(`SUCCESS: ${msg}`),\n    error: (msg: string) => console.error(`ERROR: ${msg}`),\n  };\n\n  try {\n    logger.log('\\n');\n    logger.info('Completing setup...\\n');\n\n    // Load wallet\n    const walletMgr = new WalletManager();\n    const wallet = await walletMgr.loadWallet();\n    if (!wallet) {\n      throw new Error('Wallet not found');\n    }\n\n    // Create agent manager\n    const manager = new AgentManager({\n      gatewayName: answers.gatewayName,\n      walletAddress: wallet.address,\n      cpuAllocation: answers.cpuAllocation,\n      enableSystemTray: answers.enableSystemTray,\n      runAtBoot: answers.runAtBoot,\n    });\n\n    await manager.initialize();\n    logger.success('Agent manager initialized');\n\n    // Connect to gateway\n    const gatewayConnector = new GatewayConnector({\n      walletAddress: wallet.address,\n    });\n\n    await gatewayConnector.connect();\n    logger.success('Connected to Optimism');\n\n    // Register gateway\n    let registration;\n    try {\n      registration = await gatewayConnector.register({\n        name: answers.gatewayName,\n        region: answers.region,\n        walletAddress: wallet.address,\n        metadata: {\n          cpuAllocation: answers.cpuAllocation,\n          gpu: answers.region !== 'auto',\n        },\n      });\n    } catch (error: any) {\n      if (\n        error.code === 'INSUFFICIENT_FUNDS' ||\n        error.message?.includes('insufficient funds')\n      ) {\n        logger.warn(\n          'Insufficient funds for direct registration. Attempting gas-sponsored registration...'\n        );\n        const RELAYER_URL =\n          process.env.EDGEWORK_RELAYER_URL ||\n          'https://api.edgework.ai/v1/relayer/register';\n\n        registration = await gatewayConnector.registerViaRelayer(RELAYER_URL, {\n          name: answers.gatewayName,\n          region: answers.region,\n          walletAddress: wallet.address,\n          metadata: {\n            cpuAllocation: answers.cpuAllocation,\n            gpu: answers.region !== 'auto',\n          },\n        });\n      } else {\n        throw error;\n      }\n    }\n\n    logger.success('Gateway registered at ' + registration.gatewayAddress);\n\n    // Setup boot persistence if requested\n    if (answers.runAtBoot) {\n      await setupBootPersistence();\n      logger.success('Boot persistence enabled');\n    }\n\n    logger.log('\\n');\n    logger.info('Setup complete!\\n');\n    logger.log('Next steps:');\n    logger.log('1. Start the gateway: bun run edgework-gateway:start');\n    logger.log('2. Start the agent: bun run edgework-agent:start');\n    logger.log('3. View status: bun run edgework-agent:status\\n');\n  } catch (error) {\n    logger.error(`Setup failed: ${error}`);\n    process.exit(1);\n  }\n}\n\n/**\n * Setup boot persistence\n */\nasync function setupBootPersistence(): Promise<void> {\n  const platform = process.platform;\n\n  if (platform === 'darwin') {\n    await setupMacOSLaunchd();\n  } else if (platform === 'linux') {\n    await setupLinuxSystemd();\n  } else if (platform === 'win32') {\n    await setupWindowsTaskScheduler();\n  }\n}\n\n/**\n * Setup macOS launchd\n */\nasync function setupMacOSLaunchd(): Promise<void> {\n  const homeDir = process.env.HOME || '/root';\n  const plistPath = path.join(\n    homeDir,\n    'Library/LaunchAgents/ai.edgework.agent.plist'\n  );\n\n  const plistContent = `<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict>\n  <key>Label</key>\n  <string>ai.edgework.agent</string>\n  <key>ProgramArguments</key>\n  <array>\n    <string>/usr/bin/env</string>\n    <string>bun</string>\n    <string>run</string>\n    <string>edgework-agent:start</string>\n  </array>\n  <key>RunAtLoad</key>\n  <true/>\n  <key>StandardOutPath</key>\n  <string>${homeDir}/.edgework/logs/agent.log</string>\n  <key>StandardErrorPath</key>\n  <string>${homeDir}/.edgework/logs/agent-error.log</string>\n</dict>\n</plist>`;\n\n  const dir = path.dirname(plistPath);\n  await fs.mkdir(dir, { recursive: true });\n  await fs.writeFile(plistPath, plistContent);\n}\n\n/**\n * Setup Linux systemd\n */\nasync function setupLinuxSystemd(): Promise<void> {\n  const homeDir = process.env.HOME || '/root';\n  const serviceDir = path.join(homeDir, '.config/systemd/user');\n  const servicePath = path.join(serviceDir, 'edgework-agent.service');\n\n  const serviceContent = `[Unit]\nDescription=Edgework Agent\nAfter=network-online.target\nWants=network-online.target\n\n[Service]\nType=simple\nExecStart=/usr/bin/env bun run edgework-agent:start\nRestart=always\nRestartSec=10\nStandardOutput=journal\nStandardError=journal\n\n[Install]\nWantedBy=default.target`;\n\n  await fs.mkdir(serviceDir, { recursive: true });\n  await fs.writeFile(servicePath, serviceContent);\n\n  console.log(`Service file created at ${servicePath}`);\n  console.log('To enable:');\n  console.log('  systemctl --user enable edgework-agent.service');\n  console.log('  systemctl --user start edgework-agent.service');\n}\n\n/**\n * Setup Windows Task Scheduler\n */\nasync function setupWindowsTaskScheduler(): Promise<void> {\n  // Note: This requires Windows 10+ and elevated privileges\n  // The actual implementation would use Windows API or PowerShell\n\n  const taskName = 'EdgeworkAgent';\n  const taskCmd = `bun run edgework-agent:start`;\n\n  console.log(`To setup task scheduler, run as Administrator:`);\n  console.log(\n    `schtasks /create /tn \"${taskName}\" /tr \"${taskCmd}\" /sc onlogon`\n  );\n}\n"]}