@moltium/world-core 0.1.4 → 0.1.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/persistence/adapters/SQLiteAdapter.ts","../src/persistence/adapters/PostgresAdapter.ts","../src/persistence/adapters/RedisAdapter.ts","../src/persistence/adapters/MongoAdapter.ts","../src/persistence/adapters/LevelDBAdapter.ts","../src/logger.ts","../src/discovery/CardFetcher.ts","../src/index.ts","../src/config/types.ts","../src/config/validator.ts","../src/persistence/adapters/InMemoryAdapter.ts","../src/persistence/PersistenceFactory.ts","../src/engine/World.ts","../src/discovery/AgentEvaluator.ts","../src/blockchain/BlockchainClient.ts","../src/server/app.ts"],"sourcesContent":["import Database from 'better-sqlite3';\nimport type { PersistenceAdapter } from '../PersistenceAdapter.js';\nimport type {\n WorldStateSnapshot,\n WorldEvent,\n AgentProfile,\n EventFilter,\n} from '../../config/types.js';\n\n/**\n * ============================================================================\n * SQLITE PERSISTENCE ADAPTER\n * ============================================================================\n * \n * Zero-config file-based persistence for development and small worlds.\n * \n * Features:\n * - Single file database\n * - No external dependencies\n * - Fast local queries\n * - ACID transactions\n * \n * Use Case: Development, testing, small-scale worlds\n */\n\nexport class SQLiteAdapter implements PersistenceAdapter {\n private db!: Database.Database;\n \n constructor(private config: { filename: string }) {}\n \n async connect(): Promise<void> {\n this.db = new Database(this.config.filename);\n this.initSchema();\n }\n \n private initSchema(): void {\n this.db.exec(`\n CREATE TABLE IF NOT EXISTS world_state (\n id INTEGER PRIMARY KEY CHECK (id = 1),\n phase TEXT NOT NULL,\n tick INTEGER NOT NULL,\n round INTEGER NOT NULL,\n timestamp INTEGER NOT NULL,\n metadata TEXT\n );\n \n CREATE TABLE IF NOT EXISTS events (\n id TEXT PRIMARY KEY,\n type TEXT NOT NULL,\n agent_url TEXT,\n timestamp INTEGER NOT NULL,\n data TEXT\n );\n \n CREATE TABLE IF NOT EXISTS agents (\n url TEXT PRIMARY KEY,\n name TEXT NOT NULL,\n protocol_version TEXT NOT NULL,\n skills TEXT NOT NULL,\n capabilities TEXT NOT NULL,\n joined_at INTEGER NOT NULL,\n role TEXT,\n metadata TEXT,\n wallet_address TEXT\n );\n \n CREATE INDEX IF NOT EXISTS idx_events_type ON events(type);\n CREATE INDEX IF NOT EXISTS idx_events_timestamp ON events(timestamp);\n CREATE INDEX IF NOT EXISTS idx_events_agent ON events(agent_url);\n `);\n }\n \n async saveState(state: WorldStateSnapshot): Promise<void> {\n const stmt = this.db.prepare(`\n INSERT OR REPLACE INTO world_state (id, phase, tick, round, timestamp, metadata)\n VALUES (1, ?, ?, ?, ?, ?)\n `);\n \n stmt.run(\n state.phase,\n state.tick,\n state.round,\n state.timestamp,\n JSON.stringify(state.metadata)\n );\n }\n \n async loadState(): Promise<WorldStateSnapshot | null> {\n const stmt = this.db.prepare('SELECT * FROM world_state WHERE id = 1');\n const row = stmt.get() as any;\n \n if (!row) return null;\n \n return {\n phase: row.phase,\n tick: row.tick,\n round: row.round,\n timestamp: row.timestamp,\n metadata: JSON.parse(row.metadata || '{}'),\n };\n }\n \n async saveEvent(event: WorldEvent): Promise<void> {\n const stmt = this.db.prepare(`\n INSERT INTO events (id, type, agent_url, timestamp, data)\n VALUES (?, ?, ?, ?, ?)\n `);\n \n stmt.run(\n event.id,\n event.type,\n event.agentUrl || null,\n event.timestamp,\n JSON.stringify(event.data || {})\n );\n }\n \n async getEvents(filter?: EventFilter): Promise<WorldEvent[]> {\n let query = 'SELECT * FROM events WHERE 1=1';\n const params: any[] = [];\n \n if (filter?.type) {\n query += ' AND type = ?';\n params.push(filter.type);\n }\n \n if (filter?.agentUrl) {\n query += ' AND agent_url = ?';\n params.push(filter.agentUrl);\n }\n \n if (filter?.fromTimestamp) {\n query += ' AND timestamp >= ?';\n params.push(filter.fromTimestamp);\n }\n \n if (filter?.toTimestamp) {\n query += ' AND timestamp <= ?';\n params.push(filter.toTimestamp);\n }\n \n query += ' ORDER BY timestamp DESC';\n \n if (filter?.limit) {\n query += ' LIMIT ?';\n params.push(filter.limit);\n }\n \n const stmt = this.db.prepare(query);\n const rows = stmt.all(...params) as any[];\n \n return rows.map(row => ({\n id: row.id,\n type: row.type,\n timestamp: row.timestamp,\n agentUrl: row.agent_url || undefined,\n data: JSON.parse(row.data || '{}'),\n }));\n }\n \n async saveAgent(profile: AgentProfile): Promise<void> {\n const stmt = this.db.prepare(`\n INSERT OR REPLACE INTO agents \n (url, name, protocol_version, skills, capabilities, joined_at, role, metadata, wallet_address)\n VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)\n `);\n \n stmt.run(\n profile.url,\n profile.name,\n profile.protocolVersion,\n JSON.stringify(profile.skills),\n JSON.stringify(profile.capabilities),\n profile.joinedAt,\n profile.role || null,\n JSON.stringify(profile.metadata || {}),\n profile.walletAddress || null\n );\n }\n \n async removeAgent(agentUrl: string): Promise<void> {\n const stmt = this.db.prepare('DELETE FROM agents WHERE url = ?');\n stmt.run(agentUrl);\n }\n \n async getAgents(): Promise<AgentProfile[]> {\n const stmt = this.db.prepare('SELECT * FROM agents ORDER BY joined_at ASC');\n const rows = stmt.all() as any[];\n \n return rows.map(row => ({\n url: row.url,\n name: row.name,\n protocolVersion: row.protocol_version,\n skills: JSON.parse(row.skills),\n capabilities: JSON.parse(row.capabilities),\n joinedAt: row.joined_at,\n role: row.role || undefined,\n metadata: JSON.parse(row.metadata || '{}'),\n walletAddress: row.wallet_address || undefined,\n }));\n }\n \n async getAgent(agentUrl: string): Promise<AgentProfile | null> {\n const stmt = this.db.prepare('SELECT * FROM agents WHERE url = ?');\n const row = stmt.get(agentUrl) as any;\n \n if (!row) return null;\n \n return {\n url: row.url,\n name: row.name,\n protocolVersion: row.protocol_version,\n skills: JSON.parse(row.skills),\n capabilities: JSON.parse(row.capabilities),\n joinedAt: row.joined_at,\n role: row.role || undefined,\n metadata: JSON.parse(row.metadata || '{}'),\n walletAddress: row.wallet_address || undefined,\n };\n }\n \n async disconnect(): Promise<void> {\n this.db.close();\n }\n \n async healthCheck(): Promise<boolean> {\n try {\n const stmt = this.db.prepare('SELECT 1');\n stmt.get();\n return true;\n } catch {\n return false;\n }\n }\n \n async clear(): Promise<void> {\n this.db.exec(`\n DELETE FROM world_state;\n DELETE FROM events;\n DELETE FROM agents;\n `);\n }\n}\n","import type { PersistenceAdapter, EventFilter } from '../PersistenceAdapter.js';\nimport type { WorldStateSnapshot, WorldEvent, AgentProfile } from '../../config/types.js';\nimport pkg from 'pg';\nconst { Pool } = pkg;\n\n/**\n * ============================================================================\n * POSTGRESQL ADAPTER\n * ============================================================================\n * \n * Production-grade persistence using PostgreSQL.\n * Features: ACID compliance, powerful queries, JSON support.\n */\n\nexport interface PostgresConfig {\n host: string;\n port?: number;\n database: string;\n user: string;\n password: string;\n ssl?: boolean;\n max?: number; // max connections in pool\n}\n\nexport class PostgresAdapter implements PersistenceAdapter {\n private pool: pkg.Pool;\n private connected = false;\n\n constructor(private config: PostgresConfig) {\n this.pool = new Pool({\n host: config.host,\n port: config.port || 5432,\n database: config.database,\n user: config.user,\n password: config.password,\n ssl: config.ssl ? { rejectUnauthorized: false } : undefined,\n max: config.max || 10,\n });\n }\n\n async connect(): Promise<void> {\n try {\n await this.pool.query('SELECT NOW()');\n await this.initSchema();\n this.connected = true;\n } catch (error: any) {\n throw new Error(`PostgreSQL connection failed: ${error.message}`);\n }\n }\n\n private async initSchema(): Promise<void> {\n const client = await this.pool.connect();\n \n try {\n await client.query('BEGIN');\n \n // World state table\n await client.query(`\n CREATE TABLE IF NOT EXISTS world_state (\n id SERIAL PRIMARY KEY,\n phase VARCHAR(50) NOT NULL,\n tick INTEGER NOT NULL,\n round INTEGER NOT NULL,\n timestamp BIGINT NOT NULL,\n metadata JSONB DEFAULT '{}'::jsonb,\n created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP\n )\n `);\n \n // World events table\n await client.query(`\n CREATE TABLE IF NOT EXISTS world_events (\n id VARCHAR(255) PRIMARY KEY,\n type VARCHAR(100) NOT NULL,\n timestamp BIGINT NOT NULL,\n agent_url VARCHAR(500),\n data JSONB DEFAULT '{}'::jsonb,\n created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP\n )\n `);\n \n // Create index on event type and timestamp\n await client.query(`\n CREATE INDEX IF NOT EXISTS idx_events_type ON world_events(type)\n `);\n await client.query(`\n CREATE INDEX IF NOT EXISTS idx_events_timestamp ON world_events(timestamp)\n `);\n \n // Agent profiles table\n await client.query(`\n CREATE TABLE IF NOT EXISTS agent_profiles (\n url VARCHAR(500) PRIMARY KEY,\n name VARCHAR(255) NOT NULL,\n protocol_version VARCHAR(50) NOT NULL,\n skills JSONB NOT NULL,\n capabilities JSONB NOT NULL,\n joined_at BIGINT NOT NULL,\n role VARCHAR(100),\n metadata JSONB DEFAULT '{}'::jsonb,\n wallet_address VARCHAR(255),\n created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP\n )\n `);\n \n await client.query('COMMIT');\n } catch (error) {\n await client.query('ROLLBACK');\n throw error;\n } finally {\n client.release();\n }\n }\n\n async saveState(state: WorldStateSnapshot): Promise<void> {\n await this.pool.query(\n `INSERT INTO world_state (phase, tick, round, timestamp, metadata) \n VALUES ($1, $2, $3, $4, $5)`,\n [state.phase, state.tick, state.round, state.timestamp, JSON.stringify(state.metadata)]\n );\n }\n\n async loadState(): Promise<WorldStateSnapshot | null> {\n const result = await this.pool.query(\n 'SELECT * FROM world_state ORDER BY id DESC LIMIT 1'\n );\n \n if (result.rows.length === 0) {\n return null;\n }\n \n const row = result.rows[0];\n return {\n phase: row.phase,\n tick: row.tick,\n round: row.round,\n timestamp: parseInt(row.timestamp),\n metadata: row.metadata,\n };\n }\n\n async saveEvent(event: WorldEvent): Promise<void> {\n await this.pool.query(\n `INSERT INTO world_events (id, type, timestamp, agent_url, data) \n VALUES ($1, $2, $3, $4, $5)`,\n [event.id, event.type, event.timestamp, event.agentUrl || null, JSON.stringify(event.data)]\n );\n }\n\n async getEvents(filter?: EventFilter): Promise<WorldEvent[]> {\n let query = 'SELECT * FROM world_events WHERE 1=1';\n const params: any[] = [];\n let paramCount = 1;\n \n if (filter?.type) {\n query += ` AND type = $${paramCount++}`;\n params.push(filter.type);\n }\n \n if (filter?.agentUrl) {\n query += ` AND agent_url = $${paramCount++}`;\n params.push(filter.agentUrl);\n }\n \n if (filter?.since) {\n query += ` AND timestamp >= $${paramCount++}`;\n params.push(filter.since);\n }\n \n if (filter?.until) {\n query += ` AND timestamp <= $${paramCount++}`;\n params.push(filter.until);\n }\n \n query += ' ORDER BY timestamp DESC';\n \n if (filter?.limit) {\n query += ` LIMIT $${paramCount++}`;\n params.push(filter.limit);\n }\n \n const result = await this.pool.query(query, params);\n \n return result.rows.map(row => ({\n id: row.id,\n type: row.type,\n timestamp: parseInt(row.timestamp),\n agentUrl: row.agent_url,\n data: row.data,\n }));\n }\n\n async saveAgent(profile: AgentProfile): Promise<void> {\n await this.pool.query(\n `INSERT INTO agent_profiles \n (url, name, protocol_version, skills, capabilities, joined_at, role, metadata, wallet_address) \n VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9)\n ON CONFLICT (url) DO UPDATE SET\n name = EXCLUDED.name,\n protocol_version = EXCLUDED.protocol_version,\n skills = EXCLUDED.skills,\n capabilities = EXCLUDED.capabilities,\n role = EXCLUDED.role,\n metadata = EXCLUDED.metadata,\n wallet_address = EXCLUDED.wallet_address`,\n [\n profile.url,\n profile.name,\n profile.protocolVersion,\n JSON.stringify(profile.skills),\n JSON.stringify(profile.capabilities),\n profile.joinedAt,\n profile.role || null,\n JSON.stringify(profile.metadata || {}),\n profile.walletAddress || null,\n ]\n );\n }\n\n async removeAgent(agentUrl: string): Promise<void> {\n await this.pool.query('DELETE FROM agent_profiles WHERE url = $1', [agentUrl]);\n }\n\n async getAgents(): Promise<AgentProfile[]> {\n const result = await this.pool.query(\n 'SELECT * FROM agent_profiles ORDER BY joined_at ASC'\n );\n \n return result.rows.map(row => ({\n url: row.url,\n name: row.name,\n protocolVersion: row.protocol_version,\n skills: row.skills,\n capabilities: row.capabilities,\n joinedAt: parseInt(row.joined_at),\n role: row.role,\n metadata: row.metadata,\n walletAddress: row.wallet_address,\n }));\n }\n\n async getAgent(agentUrl: string): Promise<AgentProfile | null> {\n const result = await this.pool.query(\n 'SELECT * FROM agent_profiles WHERE url = $1',\n [agentUrl]\n );\n \n if (result.rows.length === 0) {\n return null;\n }\n \n const row = result.rows[0];\n return {\n url: row.url,\n name: row.name,\n protocolVersion: row.protocol_version,\n skills: row.skills,\n capabilities: row.capabilities,\n joinedAt: parseInt(row.joined_at),\n role: row.role,\n metadata: row.metadata,\n walletAddress: row.wallet_address,\n };\n }\n\n async disconnect(): Promise<void> {\n await this.pool.end();\n this.connected = false;\n }\n\n async healthCheck(): Promise<boolean> {\n try {\n await this.pool.query('SELECT 1');\n return true;\n } catch {\n return false;\n }\n }\n\n async clear(): Promise<void> {\n const client = await this.pool.connect();\n try {\n await client.query('BEGIN');\n await client.query('TRUNCATE world_state, world_events, agent_profiles');\n await client.query('COMMIT');\n } catch (error) {\n await client.query('ROLLBACK');\n throw error;\n } finally {\n client.release();\n }\n }\n}\n","import type { PersistenceAdapter, EventFilter } from '../PersistenceAdapter.js';\nimport type { WorldStateSnapshot, WorldEvent, AgentProfile } from '../../config/types.js';\nimport { Redis } from 'ioredis';\n\n/**\n * ============================================================================\n * REDIS ADAPTER\n * ============================================================================\n * \n * High-speed in-memory persistence using Redis.\n * Features: Ultra-fast reads/writes, pub/sub support, TTL support.\n */\n\nexport interface RedisConfig {\n host: string;\n port?: number;\n password?: string;\n db?: number;\n keyPrefix?: string;\n}\n\nexport class RedisAdapter implements PersistenceAdapter {\n private client: Redis;\n private connected = false;\n private keyPrefix: string;\n\n constructor(private config: RedisConfig) {\n this.keyPrefix = config.keyPrefix || 'world:';\n this.client = new Redis({\n host: config.host,\n port: config.port || 6379,\n password: config.password,\n db: config.db || 0,\n });\n }\n\n async connect(): Promise<void> {\n try {\n await this.client.ping();\n this.connected = true;\n } catch (error: any) {\n throw new Error(`Redis connection failed: ${error.message}`);\n }\n }\n\n async saveState(state: WorldStateSnapshot): Promise<void> {\n const key = `${this.keyPrefix}state`;\n await this.client.set(key, JSON.stringify(state));\n \n // Also save to history with timestamp\n const historyKey = `${this.keyPrefix}state:history`;\n await this.client.zadd(historyKey, state.timestamp, JSON.stringify(state));\n }\n\n async loadState(): Promise<WorldStateSnapshot | null> {\n const key = `${this.keyPrefix}state`;\n const data = await this.client.get(key);\n \n if (!data) {\n return null;\n }\n \n return JSON.parse(data);\n }\n\n async saveEvent(event: WorldEvent): Promise<void> {\n // Save to events list\n const eventsKey = `${this.keyPrefix}events`;\n await this.client.zadd(eventsKey, event.timestamp, JSON.stringify(event));\n \n // Save to type-specific sorted set for faster filtering\n const typeKey = `${this.keyPrefix}events:type:${event.type}`;\n await this.client.zadd(typeKey, event.timestamp, JSON.stringify(event));\n \n // If agent-specific, also index by agent\n if (event.agentUrl) {\n const agentKey = `${this.keyPrefix}events:agent:${event.agentUrl}`;\n await this.client.zadd(agentKey, event.timestamp, JSON.stringify(event));\n }\n }\n\n async getEvents(filter?: EventFilter): Promise<WorldEvent[]> {\n let key = `${this.keyPrefix}events`;\n \n // Use type-specific key if filtering by type\n if (filter?.type) {\n key = `${this.keyPrefix}events:type:${filter.type}`;\n } else if (filter?.agentUrl) {\n key = `${this.keyPrefix}events:agent:${filter.agentUrl}`;\n }\n \n const min = filter?.since || '-inf';\n const max = filter?.until || '+inf';\n const count = filter?.limit || -1;\n \n // Get events in reverse chronological order\n const results = await this.client.zrevrangebyscore(\n key,\n max,\n min,\n 'LIMIT',\n 0,\n count === -1 ? 100 : count\n );\n \n return results.map(r => JSON.parse(r));\n }\n\n async saveAgent(profile: AgentProfile): Promise<void> {\n const key = `${this.keyPrefix}agent:${profile.url}`;\n await this.client.set(key, JSON.stringify(profile));\n \n // Add to agents set\n const agentsKey = `${this.keyPrefix}agents`;\n await this.client.sadd(agentsKey, profile.url);\n }\n\n async removeAgent(agentUrl: string): Promise<void> {\n const key = `${this.keyPrefix}agent:${agentUrl}`;\n await this.client.del(key);\n \n // Remove from agents set\n const agentsKey = `${this.keyPrefix}agents`;\n await this.client.srem(agentsKey, agentUrl);\n }\n\n async getAgents(): Promise<AgentProfile[]> {\n const agentsKey = `${this.keyPrefix}agents`;\n const urls = await this.client.smembers(agentsKey);\n \n if (urls.length === 0) {\n return [];\n }\n \n const keys = urls.map(url => `${this.keyPrefix}agent:${url}`);\n const results = await this.client.mget(...keys);\n \n return results\n .filter(r => r !== null)\n .map(r => JSON.parse(r!));\n }\n\n async getAgent(agentUrl: string): Promise<AgentProfile | null> {\n const key = `${this.keyPrefix}agent:${agentUrl}`;\n const data = await this.client.get(key);\n \n if (!data) {\n return null;\n }\n \n return JSON.parse(data);\n }\n\n async disconnect(): Promise<void> {\n await this.client.quit();\n this.connected = false;\n }\n\n async healthCheck(): Promise<boolean> {\n try {\n await this.client.ping();\n return true;\n } catch {\n return false;\n }\n }\n\n async clear(): Promise<void> {\n const pattern = `${this.keyPrefix}*`;\n const keys = await this.client.keys(pattern);\n \n if (keys.length > 0) {\n await this.client.del(...keys);\n }\n }\n}\n","import type { PersistenceAdapter, EventFilter } from '../PersistenceAdapter.js';\nimport type { WorldStateSnapshot, WorldEvent, AgentProfile } from '../../config/types.js';\nimport { MongoClient, Db, Collection } from 'mongodb';\n\n/**\n * ============================================================================\n * MONGODB ADAPTER\n * ============================================================================\n * \n * Flexible schema persistence using MongoDB.\n * Features: JSON-native storage, powerful aggregations, horizontal scaling.\n */\n\nexport interface MongoConfig {\n url: string;\n database: string;\n useUnifiedTopology?: boolean;\n}\n\nexport class MongoAdapter implements PersistenceAdapter {\n private client: MongoClient;\n private db!: Db;\n private stateCollection!: Collection;\n private eventsCollection!: Collection;\n private agentsCollection!: Collection;\n private connected = false;\n\n constructor(private config: MongoConfig) {\n this.client = new MongoClient(config.url, {\n useUnifiedTopology: config.useUnifiedTopology !== false,\n } as any);\n }\n\n async connect(): Promise<void> {\n try {\n await this.client.connect();\n this.db = this.client.db(this.config.database);\n \n // Initialize collections\n this.stateCollection = this.db.collection('world_state');\n this.eventsCollection = this.db.collection('world_events');\n this.agentsCollection = this.db.collection('agent_profiles');\n \n // Create indexes\n await this.initIndexes();\n \n this.connected = true;\n } catch (error: any) {\n throw new Error(`MongoDB connection failed: ${error.message}`);\n }\n }\n\n private async initIndexes(): Promise<void> {\n // Events indexes\n await this.eventsCollection.createIndex({ type: 1 });\n await this.eventsCollection.createIndex({ timestamp: -1 });\n await this.eventsCollection.createIndex({ agentUrl: 1 });\n await this.eventsCollection.createIndex({ type: 1, timestamp: -1 });\n \n // Agents index\n await this.agentsCollection.createIndex({ url: 1 }, { unique: true });\n await this.agentsCollection.createIndex({ joinedAt: 1 });\n \n // State index\n await this.stateCollection.createIndex({ timestamp: -1 });\n }\n\n async saveState(state: WorldStateSnapshot): Promise<void> {\n await this.stateCollection.insertOne({\n ...state,\n _createdAt: new Date(),\n });\n }\n\n async loadState(): Promise<WorldStateSnapshot | null> {\n const doc = await this.stateCollection.findOne(\n {},\n { sort: { timestamp: -1 } }\n );\n \n if (!doc) {\n return null;\n }\n \n const { _id, _createdAt, ...state } = doc;\n return state as WorldStateSnapshot;\n }\n\n async saveEvent(event: WorldEvent): Promise<void> {\n await this.eventsCollection.insertOne({\n _id: event.id,\n ...event,\n _createdAt: new Date(),\n });\n }\n\n async getEvents(filter?: EventFilter): Promise<WorldEvent[]> {\n const query: any = {};\n \n if (filter?.type) {\n query.type = filter.type;\n }\n \n if (filter?.agentUrl) {\n query.agentUrl = filter.agentUrl;\n }\n \n if (filter?.since || filter?.until) {\n query.timestamp = {};\n if (filter.since) {\n query.timestamp.$gte = filter.since;\n }\n if (filter.until) {\n query.timestamp.$lte = filter.until;\n }\n }\n \n const cursor = this.eventsCollection\n .find(query)\n .sort({ timestamp: -1 });\n \n if (filter?.limit) {\n cursor.limit(filter.limit);\n }\n \n const docs = await cursor.toArray();\n \n return docs.map(doc => {\n const { _id, _createdAt, ...event } = doc;\n return event as WorldEvent;\n });\n }\n\n async saveAgent(profile: AgentProfile): Promise<void> {\n await this.agentsCollection.updateOne(\n { url: profile.url },\n { $set: { ...profile, _updatedAt: new Date() } },\n { upsert: true }\n );\n }\n\n async removeAgent(agentUrl: string): Promise<void> {\n await this.agentsCollection.deleteOne({ url: agentUrl });\n }\n\n async getAgents(): Promise<AgentProfile[]> {\n const docs = await this.agentsCollection\n .find({})\n .sort({ joinedAt: 1 })\n .toArray();\n \n return docs.map(doc => {\n const { _id, _updatedAt, ...profile } = doc;\n return profile as AgentProfile;\n });\n }\n\n async getAgent(agentUrl: string): Promise<AgentProfile | null> {\n const doc = await this.agentsCollection.findOne({ url: agentUrl });\n \n if (!doc) {\n return null;\n }\n \n const { _id, _updatedAt, ...profile } = doc;\n return profile as AgentProfile;\n }\n\n async disconnect(): Promise<void> {\n await this.client.close();\n this.connected = false;\n }\n\n async healthCheck(): Promise<boolean> {\n try {\n await this.db.admin().ping();\n return true;\n } catch {\n return false;\n }\n }\n\n async clear(): Promise<void> {\n await Promise.all([\n this.stateCollection.deleteMany({}),\n this.eventsCollection.deleteMany({}),\n this.agentsCollection.deleteMany({}),\n ]);\n }\n}\n","import type { PersistenceAdapter, EventFilter } from '../PersistenceAdapter.js';\nimport type { WorldStateSnapshot, WorldEvent, AgentProfile } from '../../config/types.js';\nimport { Level } from 'level';\n\n/**\n * ============================================================================\n * LEVELDB ADAPTER\n * ============================================================================\n * \n * Embedded key-value persistence using LevelDB.\n * Features: Zero-config, embedded database, fast local storage.\n */\n\nexport interface LevelDBConfig {\n path: string; // Database file path\n}\n\nexport class LevelDBAdapter implements PersistenceAdapter {\n private db!: Level<string, string>;\n private connected = false;\n\n constructor(private config: LevelDBConfig) {}\n\n async connect(): Promise<void> {\n try {\n this.db = new Level(this.config.path, {\n valueEncoding: 'json',\n });\n await this.db.open();\n this.connected = true;\n } catch (error: any) {\n throw new Error(`LevelDB connection failed: ${error.message}`);\n }\n }\n\n async saveState(state: WorldStateSnapshot): Promise<void> {\n // Save current state\n await this.db.put('state:current', JSON.stringify(state));\n \n // Save to history with timestamp key\n const historyKey = `state:history:${state.timestamp}`;\n await this.db.put(historyKey, JSON.stringify(state));\n }\n\n async loadState(): Promise<WorldStateSnapshot | null> {\n try {\n const data = await this.db.get('state:current');\n return JSON.parse(data);\n } catch (error: any) {\n if (error.code === 'LEVEL_NOT_FOUND') {\n return null;\n }\n throw error;\n }\n }\n\n async saveEvent(event: WorldEvent): Promise<void> {\n // Save event with composite key: timestamp:id for ordering\n const key = `event:${event.timestamp}:${event.id}`;\n await this.db.put(key, JSON.stringify(event));\n \n // Index by type\n const typeKey = `event:type:${event.type}:${event.timestamp}:${event.id}`;\n await this.db.put(typeKey, JSON.stringify(event));\n \n // Index by agent if present\n if (event.agentUrl) {\n const agentKey = `event:agent:${event.agentUrl}:${event.timestamp}:${event.id}`;\n await this.db.put(agentKey, JSON.stringify(event));\n }\n }\n\n async getEvents(filter?: EventFilter): Promise<WorldEvent[]> {\n const events: WorldEvent[] = [];\n let prefix = 'event:';\n \n // Use index if filtering\n if (filter?.type) {\n prefix = `event:type:${filter.type}:`;\n } else if (filter?.agentUrl) {\n prefix = `event:agent:${filter.agentUrl}:`;\n }\n \n // LevelDB iterates in key order, so we iterate and filter\n const iterator = this.db.iterator({\n gte: prefix,\n lte: prefix + '\\uffff',\n reverse: true, // Most recent first\n limit: filter?.limit || -1,\n });\n \n for await (const [key, value] of iterator) {\n const event = JSON.parse(value as string);\n \n // Apply timestamp filters\n if (filter?.since && event.timestamp < filter.since) continue;\n if (filter?.until && event.timestamp > filter.until) continue;\n \n // Apply type filter if not already indexed\n if (filter?.type && !prefix.includes('type:') && event.type !== filter.type) {\n continue;\n }\n \n // Apply agent filter if not already indexed\n if (filter?.agentUrl && !prefix.includes('agent:') && event.agentUrl !== filter.agentUrl) {\n continue;\n }\n \n events.push(event);\n \n if (filter?.limit && events.length >= filter.limit) {\n break;\n }\n }\n \n return events;\n }\n\n async saveAgent(profile: AgentProfile): Promise<void> {\n const key = `agent:${profile.url}`;\n await this.db.put(key, JSON.stringify(profile));\n \n // Add to agents list with joinedAt for ordering\n const listKey = `agent:list:${profile.joinedAt}:${profile.url}`;\n await this.db.put(listKey, profile.url);\n }\n\n async removeAgent(agentUrl: string): Promise<void> {\n const key = `agent:${agentUrl}`;\n \n try {\n // Get agent to find joinedAt for list cleanup\n const data = await this.db.get(key);\n const profile = JSON.parse(data);\n \n // Remove from main storage\n await this.db.del(key);\n \n // Remove from list\n const listKey = `agent:list:${profile.joinedAt}:${agentUrl}`;\n await this.db.del(listKey);\n } catch (error: any) {\n if (error.code !== 'LEVEL_NOT_FOUND') {\n throw error;\n }\n }\n }\n\n async getAgents(): Promise<AgentProfile[]> {\n const agents: AgentProfile[] = [];\n \n const iterator = this.db.iterator({\n gte: 'agent:list:',\n lte: 'agent:list:\\uffff',\n });\n \n for await (const [key, agentUrl] of iterator) {\n try {\n const data = await this.db.get(`agent:${agentUrl}`);\n agents.push(JSON.parse(data as string));\n } catch (error: any) {\n // Skip if agent was deleted\n if (error.code !== 'LEVEL_NOT_FOUND') {\n throw error;\n }\n }\n }\n \n return agents;\n }\n\n async getAgent(agentUrl: string): Promise<AgentProfile | null> {\n try {\n const data = await this.db.get(`agent:${agentUrl}`);\n return JSON.parse(data);\n } catch (error: any) {\n if (error.code === 'LEVEL_NOT_FOUND') {\n return null;\n }\n throw error;\n }\n }\n\n async disconnect(): Promise<void> {\n await this.db.close();\n this.connected = false;\n }\n\n async healthCheck(): Promise<boolean> {\n try {\n // Try a simple get operation\n await this.db.get('health:check').catch(() => {});\n return true;\n } catch {\n return false;\n }\n }\n\n async clear(): Promise<void> {\n await this.db.clear();\n }\n}\n","import winston from 'winston';\n\n/**\n * ============================================================================\n * WORLD SDK LOGGER\n * ============================================================================\n * \n * Winston-based logger for World SDK.\n * Follows the same pattern as @moltium/core logger.\n */\n\nconst logLevel = process.env.LOG_LEVEL || 'info';\n\nexport const logger = winston.createLogger({\n level: logLevel,\n format: winston.format.combine(\n winston.format.timestamp(),\n winston.format.colorize(),\n winston.format.printf(({ level, message, timestamp, ...meta }) => {\n const metaStr = Object.keys(meta).length ? ` ${JSON.stringify(meta)}` : '';\n return `${timestamp} [${level}] ${message}${metaStr}`;\n })\n ),\n transports: [new winston.transports.Console()],\n});\n\n/**\n * Create a child logger with a specific module name\n */\nexport function createLogger(moduleName: string): winston.Logger {\n return logger.child({ module: moduleName });\n}\n","import type { AgentCard } from '@a2a-js/sdk';\nimport { createLogger } from '../logger.js';\n\nconst logger = createLogger('CardFetcher');\n\n/**\n * ============================================================================\n * AGENT CARD FETCHER\n * ============================================================================\n * \n * Discovers agents by fetching their A2A Agent Cards.\n * Follows the A2A protocol specification.\n */\n\nexport interface FetchResult {\n success: boolean;\n card?: AgentCard;\n error?: string;\n}\n\nexport class CardFetcher {\n /**\n * Fetch an agent's card from their A2A endpoint.\n * \n * @param agentUrl Base URL of the agent (e.g., http://localhost:3000)\n * @returns Fetch result with card or error\n */\n async fetchCard(agentUrl: string): Promise<FetchResult> {\n try {\n // A2A spec: Agent Card is available at /.well-known/agent-card.json\n const cardUrl = new URL('/.well-known/agent-card.json', agentUrl).toString();\n \n logger.debug(`Fetching agent card from ${cardUrl}`);\n \n const response = await fetch(cardUrl, {\n method: 'GET',\n headers: {\n 'Accept': 'application/json',\n 'User-Agent': '@moltium/world-core/0.1.0',\n },\n signal: AbortSignal.timeout(5000), // 5 second timeout\n });\n \n if (!response.ok) {\n return {\n success: false,\n error: `HTTP ${response.status}: ${response.statusText}`,\n };\n }\n \n const card = await response.json() as AgentCard;\n \n // Basic validation\n if (!card.name || !card.protocolVersion || !card.url || !card.skills) {\n return {\n success: false,\n error: 'Invalid agent card: missing required fields',\n };\n }\n \n logger.info(`Successfully fetched card for agent: ${card.name}`, {\n protocolVersion: card.protocolVersion,\n skillCount: card.skills.length,\n });\n \n return {\n success: true,\n card,\n };\n } catch (error: any) {\n logger.error(`Failed to fetch agent card from ${agentUrl}:`, error.message);\n \n return {\n success: false,\n error: error.message || 'Unknown error',\n };\n }\n }\n \n /**\n * Fetch multiple agent cards in parallel.\n * \n * @param agentUrls Array of agent URLs\n * @returns Array of fetch results\n */\n async fetchCards(agentUrls: string[]): Promise<FetchResult[]> {\n logger.info(`Fetching ${agentUrls.length} agent cards...`);\n \n const results = await Promise.all(\n agentUrls.map(url => this.fetchCard(url))\n );\n \n const successCount = results.filter(r => r.success).length;\n logger.info(`Fetched ${successCount}/${agentUrls.length} agent cards successfully`);\n \n return results;\n }\n \n /**\n * Verify that an agent card is valid for A2A protocol v0.3.0.\n * \n * @param card Agent card to verify\n * @returns True if valid\n */\n verifyCard(card: AgentCard): boolean {\n // Check required fields\n if (!card.name || !card.protocolVersion || !card.url || !card.skills) {\n logger.warn('Agent card missing required fields', { name: card.name });\n return false;\n }\n \n // Check protocol version compatibility\n if (!card.protocolVersion.startsWith('0.3')) {\n logger.warn('Agent card has incompatible protocol version', {\n name: card.name,\n version: card.protocolVersion,\n });\n return false;\n }\n \n // Check skills array\n if (!Array.isArray(card.skills) || card.skills.length === 0) {\n logger.warn('Agent card has no skills', { name: card.name });\n return false;\n }\n \n // Check capabilities\n if (!card.capabilities || typeof card.capabilities !== 'object') {\n logger.warn('Agent card missing capabilities', { name: card.name });\n return false;\n }\n \n return true;\n }\n}\n\n/**\n * Helper to extract base URL from various formats\n */\nexport function normalizeAgentUrl(url: string): string {\n try {\n const parsed = new URL(url);\n return `${parsed.protocol}//${parsed.host}`;\n } catch {\n // If already in base format, return as-is\n return url;\n }\n}\n","/**\n * @moltium/world-core\n * \n * World runtime for creating agent simulation environments.\n */\n\n// Core types\nexport type {\n WorldConfig,\n AdmissionRules,\n AdmissionDecision,\n AgentProfile,\n WorldPhase,\n WorldStateSnapshot,\n WorldEvent,\n WorldRule,\n RuleContext,\n RuleViolation,\n PersistenceConfig,\n BlockchainConfig,\n TokenConfig,\n WorldTypeModule,\n EventFilter,\n} from './config/types.js';\n\nexport { profileFromCard } from './config/types.js';\n\n// Config validation\nexport {\n validateWorldConfig,\n isValidWorldConfig,\n WorldConfigSchema,\n AdmissionRulesSchema,\n PersistenceConfigSchema,\n BlockchainConfigSchema,\n TokenConfigSchema,\n} from './config/validator.js';\n\n// Persistence\nexport type { PersistenceAdapter } from './persistence/PersistenceAdapter.js';\nexport { createPersistence } from './persistence/PersistenceFactory.js';\nexport { InMemoryAdapter } from './persistence/adapters/InMemoryAdapter.js';\n// Note: SQLiteAdapter is lazy-loaded and not directly exported\n\n// Logger\nexport { logger, createLogger } from './logger.js';\n\n// World engine\nexport { World } from './engine/World.js';\n\n// Discovery\nexport { CardFetcher, type FetchResult, normalizeAgentUrl } from './discovery/CardFetcher.js';\nexport { AgentEvaluator } from './discovery/AgentEvaluator.js';\n\n// Blockchain\nexport { BlockchainClient } from './blockchain/BlockchainClient.js';\n\n// Server\nexport { createWorldApp, startWorldServer } from './server/app.js';\n","import type { AgentCard } from '@a2a-js/sdk';\n\n/**\n * ============================================================================\n * WORLD CONFIGURATION TYPES\n * ============================================================================\n */\n\nexport interface WorldConfig {\n /** World name (unique identifier) */\n name: string;\n \n /** World description */\n description?: string;\n \n /** World type (for plugin system) */\n type?: string;\n \n /** Server configuration */\n server: {\n port: number;\n host: string;\n };\n \n /** A2A configuration for the world itself */\n a2a?: {\n baseUrl: string;\n pushNotifications?: boolean;\n streaming?: boolean;\n };\n \n /** Admission rules for agent entry */\n admission: AdmissionRules;\n \n /** Simulation configuration */\n simulation?: {\n /** Tick interval in milliseconds */\n tickIntervalMs?: number;\n \n /** Maximum ticks before auto-stop */\n maxTicks?: number;\n \n /** Auto-start simulation on world init */\n autoStart?: boolean;\n };\n \n /** Persistence configuration */\n persistence?: PersistenceConfig;\n \n /** Blockchain configuration */\n blockchain?: BlockchainConfig;\n \n /** Optional world token configuration */\n token?: TokenConfig;\n \n /** World-specific rules */\n rules?: WorldRule[];\n \n /** Pre-configured agent URLs to discover on startup */\n agentUrls?: string[];\n}\n\n/**\n * ============================================================================\n * ADMISSION RULES\n * ============================================================================\n */\n\nexport interface AdmissionRules {\n /** Maximum number of agents allowed */\n maxAgents?: number;\n \n /** Required skills (agent must have ALL of these) */\n requiredSkills?: string[];\n \n /** Required tags (agent must have AT LEAST ONE) */\n requiredTags?: string[];\n \n /** Minimum protocol version */\n minProtocolVersion?: string;\n \n /** Custom evaluator function */\n customEvaluator?: (profile: AgentProfile) => Promise<AdmissionDecision>;\n}\n\nexport interface AdmissionDecision {\n admitted: boolean;\n reason?: string;\n role?: string;\n metadata?: Record<string, any>;\n}\n\n/**\n * ============================================================================\n * AGENT PROFILE\n * ============================================================================\n */\n\nexport interface AgentProfile {\n /** Agent URL (canonical identifier from Agent Card) */\n url: string;\n \n /** Agent name */\n name: string;\n \n /** Protocol version */\n protocolVersion: string;\n \n /** Skills from Agent Card */\n skills: Array<{\n id: string;\n name: string;\n description?: string;\n tags?: string[];\n }>;\n \n /** Capabilities */\n capabilities: {\n streaming: boolean;\n pushNotifications: boolean;\n stateTransitionHistory?: boolean;\n };\n \n /** When agent joined the world */\n joinedAt: number;\n \n /** Assigned role (optional) */\n role?: string;\n \n /** Additional metadata */\n metadata?: Record<string, any>;\n \n /** Wallet address (for blockchain membership) */\n walletAddress?: string;\n}\n\n/**\n * ============================================================================\n * WORLD STATE\n * ============================================================================\n */\n\nexport type WorldPhase = \n | 'idle' \n | 'initializing' \n | 'ready' \n | 'running' \n | 'paused' \n | 'completed' \n | 'stopped' \n | 'failed';\n\nexport interface WorldStateSnapshot {\n phase: WorldPhase;\n tick: number;\n round: number;\n timestamp: number;\n metadata: Record<string, any>;\n}\n\n/**\n * ============================================================================\n * WORLD EVENTS\n * ============================================================================\n */\n\nexport interface WorldEvent {\n id: string;\n type: string;\n timestamp: number;\n agentUrl?: string;\n data?: Record<string, any>;\n}\n\n/**\n * ============================================================================\n * WORLD RULES\n * ============================================================================\n */\n\nexport interface WorldRule {\n id: string;\n name: string;\n description?: string;\n evaluate: (context: RuleContext) => Promise<RuleViolation | null>;\n}\n\nexport interface RuleContext {\n world: {\n phase: WorldPhase;\n tick: number;\n agents: Map<string, AgentProfile>;\n };\n event?: WorldEvent;\n agent?: AgentProfile;\n}\n\nexport interface RuleViolation {\n ruleId: string;\n severity: 'warning' | 'error' | 'critical';\n message: string;\n agentUrl?: string;\n action?: 'warn' | 'kick' | 'pause_world';\n}\n\n/**\n * ============================================================================\n * PERSISTENCE CONFIGURATION\n * ============================================================================\n */\n\nexport interface PersistenceConfig {\n type: 'memory' | 'postgres' | 'redis' | 'mongodb' | 'sqlite' | 'leveldb';\n \n // Adapter-specific configs (only one should be present based on type)\n postgres?: {\n host: string;\n port?: number;\n database: string;\n user: string;\n password: string;\n ssl?: boolean;\n max?: number; // connection pool size\n };\n \n redis?: {\n host: string;\n port?: number;\n password?: string;\n db?: number;\n };\n \n mongodb?: {\n url: string;\n database: string;\n };\n \n sqlite?: {\n filename: string;\n };\n \n leveldb?: {\n location: string;\n };\n \n /** Auto-save interval in milliseconds (default: 10000) */\n autoSaveIntervalMs?: number;\n}\n\n/**\n * ============================================================================\n * BLOCKCHAIN CONFIGURATION\n * ============================================================================\n */\n\nexport interface BlockchainConfig {\n /** Monad RPC URL */\n rpcUrl: string;\n \n /** World owner's private key */\n privateKey: string;\n \n /** Entry fee in MON tokens */\n entryFee: number;\n \n /** Require NFT membership for participation (default: true) */\n requireMembership?: boolean;\n \n /** Enforce on-chain agent validation (default: false) */\n enforceOnChainValidation?: boolean;\n \n /** Contract addresses (filled after deployment) */\n agentRegistryAddress?: string;\n membershipContractAddress?: string;\n worldTokenAddress?: string;\n \n /** Chain ID */\n chainId?: number;\n}\n\n/**\n * ============================================================================\n * TOKEN CONFIGURATION\n * ============================================================================\n */\n\nexport interface TokenConfig {\n /** Deploy custom world token */\n deploy: boolean;\n \n /** Token name */\n name?: string;\n \n /** Token symbol */\n symbol?: string;\n \n /** Initial supply */\n initialSupply?: number;\n \n /** Decimals */\n decimals?: number;\n}\n\n/**\n * ============================================================================\n * WORLD TYPE MODULE (for plugin system)\n * ============================================================================\n */\n\nexport interface WorldTypeModule {\n name: string;\n description: string;\n defaultRules: WorldRule[];\n defaultAdmissionRules: Partial<AdmissionRules>;\n onInit?: (world: any) => Promise<void>;\n onTick?: (world: any, tick: number) => Promise<void>;\n onAgentJoin?: (world: any, agent: AgentProfile) => Promise<void>;\n onAgentLeave?: (world: any, agent: AgentProfile) => Promise<void>;\n}\n\n/**\n * ============================================================================\n * UTILITY TYPES\n * ============================================================================\n */\n\nexport interface EventFilter {\n type?: string;\n agentUrl?: string;\n fromTimestamp?: number;\n toTimestamp?: number;\n limit?: number;\n}\n\n/** Helper to build AgentProfile from AgentCard */\nexport function profileFromCard(card: AgentCard, walletAddress?: string): AgentProfile {\n return {\n url: card.url,\n name: card.name,\n protocolVersion: card.protocolVersion,\n skills: card.skills,\n capabilities: {\n streaming: card.capabilities.streaming ?? false,\n pushNotifications: card.capabilities.pushNotifications ?? false,\n stateTransitionHistory: card.capabilities.stateTransitionHistory,\n },\n joinedAt: Date.now(),\n walletAddress,\n };\n}\n","import { z } from 'zod';\n\n/**\n * ============================================================================\n * ZOD SCHEMAS FOR RUNTIME VALIDATION\n * ============================================================================\n */\n\nexport const AdmissionRulesSchema = z.object({\n maxAgents: z.number().int().positive().optional(),\n requiredSkills: z.array(z.string()).optional(),\n requiredTags: z.array(z.string()).optional(),\n minProtocolVersion: z.string().optional(),\n customEvaluator: z.function().optional(),\n});\n\n// Persistence configuration schemas\nconst SQLiteConfigSchema = z.object({\n filename: z.string(),\n memory: z.boolean().optional(),\n});\n\nconst PostgresConfigSchema = z.object({\n host: z.string(),\n port: z.number().optional(),\n database: z.string(),\n user: z.string(),\n password: z.string(),\n ssl: z.boolean().optional(),\n max: z.number().optional(),\n});\n\nconst RedisConfigSchema = z.object({\n host: z.string(),\n port: z.number().optional(),\n password: z.string().optional(),\n db: z.number().optional(),\n keyPrefix: z.string().optional(),\n});\n\nconst MongoDBConfigSchema = z.object({\n url: z.string(),\n database: z.string(),\n useUnifiedTopology: z.boolean().optional(),\n});\n\nconst LevelDBConfigSchema = z.object({\n path: z.string(),\n});\n\nexport const PersistenceConfigSchema = z.object({\n type: z.enum(['memory', 'postgres', 'redis', 'mongodb', 'sqlite', 'leveldb']),\n sqlite: SQLiteConfigSchema.optional(),\n postgres: PostgresConfigSchema.optional(),\n redis: RedisConfigSchema.optional(),\n mongodb: MongoDBConfigSchema.optional(),\n leveldb: LevelDBConfigSchema.optional(),\n autoSaveIntervalMs: z.number().int().positive().optional(),\n});\n\nexport const BlockchainConfigSchema = z.object({\n rpcUrl: z.string().url(),\n privateKey: z.string().regex(/^0x[a-fA-F0-9]{64}$/, 'Invalid private key format'),\n entryFee: z.number().nonnegative(),\n requireMembership: z.boolean().optional(),\n enforceOnChainValidation: z.boolean().optional(),\n agentRegistryAddress: z.string().optional(),\n membershipContractAddress: z.string().optional(),\n worldTokenAddress: z.string().optional(),\n chainId: z.number().int().optional(),\n});\n\nexport const TokenConfigSchema = z.object({\n deploy: z.boolean(),\n name: z.string().optional(),\n symbol: z.string().optional(),\n initialSupply: z.number().positive().optional(),\n decimals: z.number().int().min(0).max(18).optional(),\n});\n\nexport const WorldConfigSchema = z.object({\n name: z.string().min(1, 'World name is required'),\n description: z.string().optional(),\n type: z.string().optional(),\n \n server: z.object({\n port: z.number().int().min(1).max(65535),\n host: z.string(),\n }),\n \n a2a: z.object({\n baseUrl: z.string().url(),\n pushNotifications: z.boolean().optional(),\n streaming: z.boolean().optional(),\n }).optional(),\n \n admission: AdmissionRulesSchema,\n \n simulation: z.object({\n tickIntervalMs: z.number().int().positive().optional(),\n maxTicks: z.number().int().positive().optional(),\n autoStart: z.boolean().optional(),\n }).optional(),\n \n persistence: PersistenceConfigSchema.optional(),\n blockchain: BlockchainConfigSchema.optional(),\n token: TokenConfigSchema.optional(),\n \n rules: z.array(z.any()).optional(),\n agentUrls: z.array(z.string().url()).optional(),\n});\n\n/**\n * Validate world configuration\n */\nexport function validateWorldConfig(config: unknown): void {\n try {\n WorldConfigSchema.parse(config);\n } catch (error) {\n if (error instanceof z.ZodError) {\n const messages = error.errors.map(e => `${e.path.join('.')}: ${e.message}`).join(', ');\n throw new Error(`Invalid world configuration: ${messages}`);\n }\n throw error;\n }\n}\n\n/**\n * Validate world configuration and return result\n */\nexport function isValidWorldConfig(config: unknown): boolean {\n try {\n WorldConfigSchema.parse(config);\n return true;\n } catch {\n return false;\n }\n}\n","import type { PersistenceAdapter } from '../PersistenceAdapter.js';\nimport type {\n WorldStateSnapshot,\n WorldEvent,\n AgentProfile,\n EventFilter,\n} from '../../config/types.js';\n\n/**\n * ============================================================================\n * IN-MEMORY PERSISTENCE ADAPTER\n * ============================================================================\n * \n * Simple in-memory persistence for testing and development.\n * No external dependencies - works on any Node version.\n * \n * WARNING: All data is lost when process exits.\n * \n * Use Case: Testing, development, temporary worlds\n */\n\nexport class InMemoryAdapter implements PersistenceAdapter {\n private state: WorldStateSnapshot | null = null;\n private events: WorldEvent[] = [];\n private agents: Map<string, AgentProfile> = new Map();\n \n async connect(): Promise<void> {\n // No-op for in-memory\n }\n \n async saveState(state: WorldStateSnapshot): Promise<void> {\n this.state = { ...state };\n }\n \n async loadState(): Promise<WorldStateSnapshot | null> {\n return this.state ? { ...this.state } : null;\n }\n \n async saveEvent(event: WorldEvent): Promise<void> {\n this.events.push({ ...event });\n }\n \n async getEvents(filter?: EventFilter): Promise<WorldEvent[]> {\n let filtered = [...this.events];\n \n if (filter?.type) {\n filtered = filtered.filter(e => e.type === filter.type);\n }\n \n if (filter?.agentUrl) {\n filtered = filtered.filter(e => e.agentUrl === filter.agentUrl);\n }\n \n if (filter?.fromTimestamp) {\n filtered = filtered.filter(e => e.timestamp >= filter.fromTimestamp!);\n }\n \n if (filter?.toTimestamp) {\n filtered = filtered.filter(e => e.timestamp <= filter.toTimestamp!);\n }\n \n // Sort by timestamp descending\n filtered.sort((a, b) => b.timestamp - a.timestamp);\n \n if (filter?.limit) {\n filtered = filtered.slice(0, filter.limit);\n }\n \n return filtered;\n }\n \n async saveAgent(profile: AgentProfile): Promise<void> {\n this.agents.set(profile.url, { ...profile });\n }\n \n async removeAgent(agentUrl: string): Promise<void> {\n this.agents.delete(agentUrl);\n }\n \n async getAgents(): Promise<AgentProfile[]> {\n return Array.from(this.agents.values()).map(a => ({ ...a }));\n }\n \n async getAgent(agentUrl: string): Promise<AgentProfile | null> {\n const agent = this.agents.get(agentUrl);\n return agent ? { ...agent } : null;\n }\n \n async disconnect(): Promise<void> {\n // No-op for in-memory\n }\n \n async healthCheck(): Promise<boolean> {\n return true;\n }\n \n async clear(): Promise<void> {\n this.state = null;\n this.events = [];\n this.agents.clear();\n }\n}\n","import type { PersistenceAdapter } from './PersistenceAdapter.js';\nimport type { PersistenceConfig } from '../config/types.js';\nimport { InMemoryAdapter } from './adapters/InMemoryAdapter.js';\n\n/**\n * ============================================================================\n * PERSISTENCE FACTORY\n * ============================================================================\n * \n * Creates the appropriate persistence adapter based on configuration.\n * Uses lazy-loading for optional dependencies to avoid requiring all databases.\n */\n\nexport function createPersistence(config: PersistenceConfig): PersistenceAdapter {\n switch (config.type) {\n case 'memory':\n return new InMemoryAdapter();\n \n case 'sqlite':\n return createSQLiteAdapter(config.sqlite || { filename: './world.db' });\n \n case 'postgres':\n if (!config.postgres) {\n throw new Error('PostgreSQL configuration is required');\n }\n return createPostgresAdapter(config.postgres);\n \n case 'redis':\n if (!config.redis) {\n throw new Error('Redis configuration is required');\n }\n return createRedisAdapter(config.redis);\n \n case 'mongodb':\n if (!config.mongodb) {\n throw new Error('MongoDB configuration is required');\n }\n return createMongoAdapter(config.mongodb);\n \n case 'leveldb':\n if (!config.leveldb) {\n throw new Error('LevelDB configuration is required');\n }\n return createLevelDBAdapter(config.leveldb);\n \n default:\n throw new Error(`Unknown persistence type: ${(config as any).type}`);\n }\n}\n\n/**\n * Lazy-load SQLite adapter\n */\nfunction createSQLiteAdapter(config: any): PersistenceAdapter {\n try {\n const { SQLiteAdapter } = require('./adapters/SQLiteAdapter.js');\n return new SQLiteAdapter(config);\n } catch (error: any) {\n if (error.code === 'MODULE_NOT_FOUND') {\n throw new Error(\n 'SQLite adapter requires better-sqlite3. Install it with: npm install better-sqlite3'\n );\n }\n throw error;\n }\n}\n\n/**\n * Lazy-load PostgreSQL adapter\n */\nfunction createPostgresAdapter(config: any): PersistenceAdapter {\n try {\n const { PostgresAdapter } = require('./adapters/PostgresAdapter.js');\n return new PostgresAdapter(config);\n } catch (error: any) {\n if (error.code === 'MODULE_NOT_FOUND') {\n throw new Error(\n 'PostgreSQL adapter requires pg. Install it with: npm install pg'\n );\n }\n throw error;\n }\n}\n\n/**\n * Lazy-load Redis adapter\n */\nfunction createRedisAdapter(config: any): PersistenceAdapter {\n try {\n const { RedisAdapter } = require('./adapters/RedisAdapter.js');\n return new RedisAdapter(config);\n } catch (error: any) {\n if (error.code === 'MODULE_NOT_FOUND') {\n throw new Error(\n 'Redis adapter requires ioredis. Install it with: npm install ioredis'\n );\n }\n throw error;\n }\n}\n\n/**\n * Lazy-load MongoDB adapter\n */\nfunction createMongoAdapter(config: any): PersistenceAdapter {\n try {\n const { MongoAdapter } = require('./adapters/MongoAdapter.js');\n return new MongoAdapter(config);\n } catch (error: any) {\n if (error.code === 'MODULE_NOT_FOUND') {\n throw new Error(\n 'MongoDB adapter requires mongodb. Install it with: npm install mongodb'\n );\n }\n throw error;\n }\n}\n\n/**\n * Lazy-load LevelDB adapter\n */\nfunction createLevelDBAdapter(config: any): PersistenceAdapter {\n try {\n const { LevelDBAdapter } = require('./adapters/LevelDBAdapter.js');\n return new LevelDBAdapter(config);\n } catch (error: any) {\n if (error.code === 'MODULE_NOT_FOUND') {\n throw new Error(\n 'LevelDB adapter requires level. Install it with: npm install level'\n );\n }\n throw error;\n }\n}\n","import { v4 as uuidv4 } from 'uuid';\nimport type {\n WorldConfig,\n WorldPhase,\n WorldStateSnapshot,\n WorldEvent,\n AgentProfile,\n} from '../config/types.js';\nimport { validateWorldConfig } from '../config/validator.js';\nimport type { PersistenceAdapter } from '../persistence/PersistenceAdapter.js';\nimport { createPersistence } from '../persistence/PersistenceFactory.js';\nimport { CardFetcher } from '../discovery/CardFetcher.js';\nimport { AgentEvaluator } from '../discovery/AgentEvaluator.js';\nimport { BlockchainClient } from '../blockchain/BlockchainClient.js';\nimport { createLogger } from '../logger.js';\n\nconst logger = createLogger('World');\n\n/**\n * ============================================================================\n * WORLD ENGINE\n * ============================================================================\n * \n * Core world runtime managing:\n * - Agent discovery and admission\n * - World state and lifecycle\n * - Persistence and event logging\n * - Simulation ticks (if enabled)\n * - Rule enforcement\n */\n\nexport class World {\n private state: WorldStateSnapshot;\n private agents: Map<string, AgentProfile>;\n private persistence: PersistenceAdapter | null = null;\n private blockchainClient: BlockchainClient | null = null;\n private cardFetcher: CardFetcher;\n private evaluator: AgentEvaluator;\n private tickInterval: NodeJS.Timeout | null = null;\n private autoSaveInterval: NodeJS.Timeout | null = null;\n \n constructor(public readonly config: WorldConfig) {\n // Validate configuration\n validateWorldConfig(config);\n \n // Initialize state\n this.state = {\n phase: 'idle',\n tick: 0,\n round: 0,\n timestamp: Date.now(),\n metadata: {},\n };\n \n this.agents = new Map();\n this.cardFetcher = new CardFetcher();\n this.evaluator = new AgentEvaluator(config.admission);\n \n logger.info(`World \"${config.name}\" created`, {\n type: config.type || 'generic',\n maxAgents: config.admission.maxAgents,\n });\n }\n \n /**\n * Initialize the world (connect persistence, restore state, discover agents)\n */\n async init(): Promise<void> {\n logger.info('Initializing world...');\n this.setState('initializing');\n \n try {\n // 1. Connect to persistence backend\n if (this.config.persistence) {\n logger.info('Connecting to persistence backend:', this.config.persistence.type);\n this.persistence = createPersistence(this.config.persistence);\n await this.persistence.connect();\n \n // Try to restore state from persistence\n const savedState = await this.persistence.loadState();\n if (savedState) {\n this.state = savedState;\n logger.info('Restored world state from persistence', {\n phase: savedState.phase,\n tick: savedState.tick,\n });\n \n // Restore agents\n const savedAgents = await this.persistence.getAgents();\n for (const agent of savedAgents) {\n this.agents.set(agent.url, agent);\n }\n \n logger.info(`Restored ${savedAgents.length} agents from persistence`);\n }\n }\n \n // 2. Initialize blockchain client if configured\n if (this.config.blockchain) {\n logger.info('Initializing blockchain client...');\n this.blockchainClient = new BlockchainClient(this.config.blockchain);\n await this.blockchainClient.init();\n }\n \n // 3. Discover pre-configured agents\n if (this.config.agentUrls && this.config.agentUrls.length > 0) {\n logger.info(`Discovering ${this.config.agentUrls.length} pre-configured agents...`);\n \n const results = await this.cardFetcher.fetchCards(this.config.agentUrls);\n \n for (let i = 0; i < results.length; i++) {\n const result = results[i];\n if (result.success && result.card) {\n // Auto-admit pre-configured agents\n try {\n await this.admitAgent(result.card);\n } catch (error: any) {\n logger.warn(`Failed to admit pre-configured agent:`, error.message);\n }\n }\n }\n }\n \n // 3. Start auto-save if persistence enabled\n if (this.persistence) {\n this.startAutoSave();\n }\n \n this.setState('ready');\n logger.info('World initialized successfully', {\n agents: this.agents.size,\n persistence: this.config.persistence?.type || 'none',\n });\n } catch (error: any) {\n logger.error('Failed to initialize world:', error);\n this.setState('failed');\n throw error;\n }\n }\n \n /**\n * Start the world simulation\n */\n async start(): Promise<void> {\n if (this.state.phase === 'running') {\n logger.warn('World is already running');\n return;\n }\n \n logger.info('Starting world simulation...');\n this.setState('running');\n \n await this.logEvent({\n id: uuidv4(),\n type: 'world_started',\n timestamp: Date.now(),\n });\n \n // Start tick interval if simulation is enabled\n if (this.config.simulation?.tickIntervalMs) {\n this.startTicking();\n }\n }\n \n /**\n * Stop the world simulation\n */\n async stop(): Promise<void> {\n logger.info('Stopping world...');\n this.setState('stopped');\n \n // Stop ticking\n if (this.tickInterval) {\n clearInterval(this.tickInterval);\n this.tickInterval = null;\n }\n \n // Stop auto-save\n if (this.autoSaveInterval) {\n clearInterval(this.autoSaveInterval);\n this.autoSaveInterval = null;\n }\n \n // Final save\n if (this.persistence) {\n await this.persistence.saveState(this.state);\n }\n \n await this.logEvent({\n id: uuidv4(),\n type: 'world_stopped',\n timestamp: Date.now(),\n });\n \n logger.info('World stopped');\n }\n \n /**\n * Admit an agent to the world\n */\n async admitAgent(card: any, walletAddress?: string): Promise<void> {\n const decision = await this.evaluator.evaluate(card, this.agents.size, walletAddress);\n \n if (!decision.admitted) {\n throw new Error(`Agent admission denied: ${decision.reason}`);\n }\n \n // Optional: Validate agent on-chain\n if (this.blockchainClient && this.config.blockchain?.enforceOnChainValidation && walletAddress) {\n const isValid = await this.blockchainClient.validateAgent(walletAddress);\n if (!isValid) {\n throw new Error('Agent not registered in on-chain AgentRegistry');\n }\n logger.info(`Agent validated on-chain: ${card.name}`);\n }\n \n // Optional: Mint membership NFT\n if (this.blockchainClient && this.config.blockchain?.requireMembership && walletAddress) {\n // Check if agent already has membership\n const hasMembership = await this.blockchainClient.hasMembership(walletAddress);\n \n if (!hasMembership) {\n logger.info(`Minting membership NFT for agent: ${card.name}`);\n await this.blockchainClient.mintMembership(walletAddress);\n } else {\n logger.info(`Agent already has membership: ${card.name}`);\n }\n }\n \n const profile: AgentProfile = {\n url: card.url,\n name: card.name,\n protocolVersion: card.protocolVersion,\n skills: card.skills,\n capabilities: {\n streaming: card.capabilities.streaming ?? false,\n pushNotifications: card.capabilities.pushNotifications ?? false,\n stateTransitionHistory: card.capabilities.stateTransitionHistory,\n },\n joinedAt: Date.now(),\n role: decision.role,\n metadata: decision.metadata,\n walletAddress,\n };\n \n this.agents.set(profile.url, profile);\n \n if (this.persistence) {\n await this.persistence.saveAgent(profile);\n }\n \n await this.logEvent({\n id: uuidv4(),\n type: 'agent_joined',\n timestamp: Date.now(),\n agentUrl: profile.url,\n data: { name: profile.name, role: profile.role },\n });\n \n logger.info(`Agent admitted: ${profile.name}`, {\n role: profile.role,\n totalAgents: this.agents.size,\n });\n }\n \n /**\n * Remove an agent from the world\n */\n async removeAgent(agentUrl: string): Promise<void> {\n const agent = this.agents.get(agentUrl);\n if (!agent) {\n throw new Error(`Agent not found: ${agentUrl}`);\n }\n \n this.agents.delete(agentUrl);\n \n if (this.persistence) {\n await this.persistence.removeAgent(agentUrl);\n }\n \n await this.logEvent({\n id: uuidv4(),\n type: 'agent_left',\n timestamp: Date.now(),\n agentUrl,\n data: { name: agent.name },\n });\n \n logger.info(`Agent removed: ${agent.name}`, {\n totalAgents: this.agents.size,\n });\n }\n \n /**\n * Get all agents in the world\n */\n getAgents(): AgentProfile[] {\n return Array.from(this.agents.values());\n }\n \n /**\n * Get current world state\n */\n getState(): WorldStateSnapshot {\n return { ...this.state };\n }\n \n /**\n * Log an event\n */\n private async logEvent(event: WorldEvent): Promise<void> {\n if (this.persistence) {\n await this.persistence.saveEvent(event);\n }\n }\n \n /**\n * Set world phase\n */\n private setState(phase: WorldPhase): void {\n this.state.phase = phase;\n this.state.timestamp = Date.now();\n }\n \n /**\n * Start auto-save interval\n */\n private startAutoSave(): void {\n const interval = this.config.persistence?.autoSaveIntervalMs || 10000;\n \n this.autoSaveInterval = setInterval(async () => {\n if (this.persistence) {\n await this.persistence.saveState(this.state);\n logger.debug('Auto-saved world state');\n }\n }, interval);\n \n logger.info(`Auto-save enabled (interval: ${interval}ms)`);\n }\n \n /**\n * Start simulation ticking\n */\n private startTicking(): void {\n const interval = this.config.simulation!.tickIntervalMs!;\n \n this.tickInterval = setInterval(async () => {\n this.state.tick++;\n \n await this.logEvent({\n id: uuidv4(),\n type: 'tick',\n timestamp: Date.now(),\n data: { tick: this.state.tick },\n });\n \n logger.debug(`Tick ${this.state.tick}`);\n \n // Check max ticks\n if (this.config.simulation?.maxTicks && this.state.tick >= this.config.simulation.maxTicks) {\n logger.info('Max ticks reached, stopping world');\n await this.stop();\n }\n }, interval);\n \n logger.info(`Simulation ticking enabled (interval: ${interval}ms)`);\n }\n}\n","import type { AgentCard } from '@a2a-js/sdk';\nimport type { AgentProfile, AdmissionRules, AdmissionDecision } from '../config/types.js';\nimport { profileFromCard } from '../config/types.js';\nimport { createLogger } from '../logger.js';\n\nconst logger = createLogger('AgentEvaluator');\n\n/**\n * ============================================================================\n * AGENT EVALUATOR\n * ============================================================================\n * \n * Evaluates whether an agent should be admitted to the world based on rules.\n * \n * Evaluation criteria:\n * - Max agents limit\n * - Required skills (agent must have ALL)\n * - Required tags (agent must have AT LEAST ONE)\n * - Minimum protocol version\n * - Custom evaluator function\n */\n\nexport class AgentEvaluator {\n constructor(private rules: AdmissionRules) {}\n \n /**\n * Evaluate whether an agent should be admitted.\n * \n * @param card Agent's A2A card\n * @param currentAgentCount Current number of agents in world\n * @param walletAddress Optional wallet address for blockchain membership\n * @returns Admission decision\n */\n async evaluate(\n card: AgentCard,\n currentAgentCount: number,\n walletAddress?: string\n ): Promise<AdmissionDecision> {\n logger.debug(`Evaluating agent: ${card.name}`, {\n currentAgents: currentAgentCount,\n maxAgents: this.rules.maxAgents,\n });\n \n // Check max agents limit\n if (this.rules.maxAgents && currentAgentCount >= this.rules.maxAgents) {\n logger.info(`Agent ${card.name} rejected: world is full`, {\n current: currentAgentCount,\n max: this.rules.maxAgents,\n });\n \n return {\n admitted: false,\n reason: `World is full (${this.rules.maxAgents} agents maximum)`,\n };\n }\n \n // Check protocol version\n if (this.rules.minProtocolVersion) {\n if (!this.meetsProtocolVersion(card.protocolVersion, this.rules.minProtocolVersion)) {\n logger.info(`Agent ${card.name} rejected: protocol version too old`, {\n agent: card.protocolVersion,\n required: this.rules.minProtocolVersion,\n });\n \n return {\n admitted: false,\n reason: `Protocol version ${card.protocolVersion} is below minimum ${this.rules.minProtocolVersion}`,\n };\n }\n }\n \n // Check required skills (agent must have ALL)\n if (this.rules.requiredSkills && this.rules.requiredSkills.length > 0) {\n const agentSkillIds = card.skills.map(s => s.id.toLowerCase());\n const missingSkills = this.rules.requiredSkills.filter(\n required => !agentSkillIds.includes(required.toLowerCase())\n );\n \n if (missingSkills.length > 0) {\n logger.info(`Agent ${card.name} rejected: missing required skills`, {\n missing: missingSkills,\n });\n \n return {\n admitted: false,\n reason: `Missing required skills: ${missingSkills.join(', ')}`,\n };\n }\n }\n \n // Check required tags (agent must have AT LEAST ONE)\n if (this.rules.requiredTags && this.rules.requiredTags.length > 0) {\n const agentTags = card.skills.flatMap(s => s.tags || []).map(t => t.toLowerCase());\n const hasRequiredTag = this.rules.requiredTags.some(\n required => agentTags.includes(required.toLowerCase())\n );\n \n if (!hasRequiredTag) {\n logger.info(`Agent ${card.name} rejected: no matching tags`, {\n required: this.rules.requiredTags,\n });\n \n return {\n admitted: false,\n reason: `Must have at least one of these tags: ${this.rules.requiredTags.join(', ')}`,\n };\n }\n }\n \n // Run custom evaluator if provided\n if (this.rules.customEvaluator) {\n const profile = profileFromCard(card, walletAddress);\n const customDecision = await this.rules.customEvaluator(profile);\n \n if (!customDecision.admitted) {\n logger.info(`Agent ${card.name} rejected by custom evaluator`, {\n reason: customDecision.reason,\n });\n \n return customDecision;\n }\n \n // Custom evaluator can assign roles and metadata\n if (customDecision.role || customDecision.metadata) {\n logger.debug(`Custom evaluator assigned role/metadata to ${card.name}`, {\n role: customDecision.role,\n });\n }\n \n return customDecision;\n }\n \n // All checks passed\n logger.info(`Agent ${card.name} admitted to world`);\n \n return {\n admitted: true,\n reason: 'All admission criteria met',\n };\n }\n \n /**\n * Check if agent's protocol version meets minimum requirement.\n * Simple semver comparison (major.minor).\n */\n private meetsProtocolVersion(agentVersion: string, minVersion: string): boolean {\n const parse = (v: string) => {\n const parts = v.split('.');\n return {\n major: parseInt(parts[0] || '0', 10),\n minor: parseInt(parts[1] || '0', 10),\n };\n };\n \n const agent = parse(agentVersion);\n const min = parse(minVersion);\n \n if (agent.major > min.major) return true;\n if (agent.major < min.major) return false;\n return agent.minor >= min.minor;\n }\n}\n","import { ethers } from 'ethers';\nimport type { BlockchainConfig } from '../config/types.js';\nimport { createLogger } from '../logger.js';\n\nconst logger = createLogger('BlockchainClient');\n\n// Contract ABIs (minimal interfaces)\nconst AGENT_REGISTRY_ABI = [\n 'function registerAgent(string agentUrl, string name) external',\n 'function isAgentValid(address wallet) external view returns (bool)',\n 'function getAgent(address wallet) external view returns (tuple(address walletAddress, string agentUrl, string name, uint256 registeredAt, bool isActive))',\n 'function getWalletByUrl(string agentUrl) external view returns (address)',\n 'event AgentRegistered(address indexed wallet, string agentUrl, string name)',\n];\n\nconst WORLD_MEMBERSHIP_ABI = [\n 'function mintMembership(address agent) external payable',\n 'function revokeMembership(address agent) external',\n 'function hasMembership(address agent) external view returns (bool)',\n 'function entryFee() external view returns (uint256)',\n 'function totalMembers() external view returns (uint256)',\n 'function withdrawFees() external',\n 'event MembershipMinted(address indexed agent, uint256 indexed tokenId, uint256 feePaid)',\n];\n\nconst WORLD_TOKEN_ABI = [\n 'function mint(address to, uint256 amount) external',\n 'function burn(address from, uint256 amount) external',\n 'function balanceOf(address account) external view returns (uint256)',\n 'function transfer(address to, uint256 amount) external returns (bool)',\n];\n\n/**\n * ============================================================================\n * BLOCKCHAIN CLIENT\n * ============================================================================\n * \n * Handles all blockchain interactions for the World SDK:\n * - Agent registry validation\n * - Membership NFT minting\n * - Entry fee collection\n * - World token operations\n */\n\nexport class BlockchainClient {\n private provider: ethers.JsonRpcProvider;\n private wallet: ethers.Wallet;\n private agentRegistry?: ethers.Contract;\n private membershipContract?: ethers.Contract;\n private worldToken?: ethers.Contract;\n \n constructor(private config: BlockchainConfig) {\n // Initialize provider and wallet\n this.provider = new ethers.JsonRpcProvider(config.rpcUrl);\n this.wallet = new ethers.Wallet(config.privateKey, this.provider);\n \n logger.info('Blockchain client initialized', {\n network: config.rpcUrl,\n wallet: this.wallet.address,\n });\n }\n \n /**\n * Initialize contract connections\n */\n async init(): Promise<void> {\n // Connect to AgentRegistry if address provided\n if (this.config.agentRegistryAddress) {\n this.agentRegistry = new ethers.Contract(\n this.config.agentRegistryAddress,\n AGENT_REGISTRY_ABI,\n this.wallet\n );\n logger.info('Connected to AgentRegistry', {\n address: this.config.agentRegistryAddress,\n });\n }\n \n // Connect to WorldMembership if address provided\n if (this.config.membershipContractAddress) {\n this.membershipContract = new ethers.Contract(\n this.config.membershipContractAddress,\n WORLD_MEMBERSHIP_ABI,\n this.wallet\n );\n logger.info('Connected to WorldMembership', {\n address: this.config.membershipContractAddress,\n });\n }\n \n // Connect to WorldToken if address provided\n if (this.config.worldTokenAddress) {\n this.worldToken = new ethers.Contract(\n this.config.worldTokenAddress,\n WORLD_TOKEN_ABI,\n this.wallet\n );\n logger.info('Connected to WorldToken', {\n address: this.config.worldTokenAddress,\n });\n }\n \n logger.info('Blockchain client ready');\n }\n \n /**\n * Validate agent on-chain\n * @param walletAddress Agent's wallet address\n * @returns True if agent is registered and valid\n */\n async validateAgent(walletAddress: string): Promise<boolean> {\n if (!this.agentRegistry) {\n logger.warn('AgentRegistry not configured, skipping on-chain validation');\n return true; // Skip validation if not configured\n }\n \n try {\n const isValid = await this.agentRegistry.isAgentValid(walletAddress);\n logger.debug('Agent validation result', {\n wallet: walletAddress,\n isValid,\n });\n return isValid;\n } catch (error: any) {\n logger.error('Failed to validate agent on-chain', {\n wallet: walletAddress,\n error: error.message,\n });\n return false;\n }\n }\n \n /**\n * Mint membership NFT for an agent\n * @param agentWallet Agent's wallet address\n * @returns Transaction hash\n */\n async mintMembership(agentWallet: string): Promise<string> {\n if (!this.membershipContract) {\n throw new Error('WorldMembership contract not configured');\n }\n \n try {\n // Get entry fee\n const entryFee = await this.membershipContract.entryFee();\n \n logger.info('Minting membership NFT', {\n agent: agentWallet,\n entryFee: ethers.formatEther(entryFee),\n });\n \n // Mint membership\n const tx = await this.membershipContract.mintMembership(agentWallet, {\n value: entryFee,\n });\n \n const receipt = await tx.wait();\n \n logger.info('Membership NFT minted', {\n agent: agentWallet,\n txHash: receipt.hash,\n blockNumber: receipt.blockNumber,\n });\n \n return receipt.hash;\n } catch (error: any) {\n logger.error('Failed to mint membership NFT', {\n agent: agentWallet,\n error: error.message,\n });\n throw error;\n }\n }\n \n /**\n * Check if agent has membership\n * @param agentWallet Agent's wallet address\n * @returns True if agent has membership\n */\n async hasMembership(agentWallet: string): Promise<boolean> {\n if (!this.membershipContract) {\n logger.warn('WorldMembership not configured, skipping membership check');\n return true; // Skip check if not configured\n }\n \n try {\n const hasMembership = await this.membershipContract.hasMembership(agentWallet);\n return hasMembership;\n } catch (error: any) {\n logger.error('Failed to check membership', {\n agent: agentWallet,\n error: error.message,\n });\n return false;\n }\n }\n \n /**\n * Revoke membership NFT\n * @param agentWallet Agent's wallet address\n * @returns Transaction hash\n */\n async revokeMembership(agentWallet: string): Promise<string> {\n if (!this.membershipContract) {\n throw new Error('WorldMembership contract not configured');\n }\n \n try {\n logger.info('Revoking membership', { agent: agentWallet });\n \n const tx = await this.membershipContract.revokeMembership(agentWallet);\n const receipt = await tx.wait();\n \n logger.info('Membership revoked', {\n agent: agentWallet,\n txHash: receipt.hash,\n });\n \n return receipt.hash;\n } catch (error: any) {\n logger.error('Failed to revoke membership', {\n agent: agentWallet,\n error: error.message,\n });\n throw error;\n }\n }\n \n /**\n * Get total number of members\n */\n async getTotalMembers(): Promise<number> {\n if (!this.membershipContract) {\n return 0;\n }\n \n try {\n const total = await this.membershipContract.totalMembers();\n return Number(total);\n } catch (error: any) {\n logger.error('Failed to get total members', { error: error.message });\n return 0;\n }\n }\n \n /**\n * Withdraw collected entry fees (world owner only)\n */\n async withdrawFees(): Promise<string> {\n if (!this.membershipContract) {\n throw new Error('WorldMembership contract not configured');\n }\n \n try {\n logger.info('Withdrawing entry fees');\n \n const tx = await this.membershipContract.withdrawFees();\n const receipt = await tx.wait();\n \n logger.info('Fees withdrawn', {\n txHash: receipt.hash,\n blockNumber: receipt.blockNumber,\n });\n \n return receipt.hash;\n } catch (error: any) {\n logger.error('Failed to withdraw fees', { error: error.message });\n throw error;\n }\n }\n \n /**\n * Get world owner's wallet address\n */\n getWalletAddress(): string {\n return this.wallet.address;\n }\n \n /**\n * Get entry fee in MON\n */\n async getEntryFee(): Promise<string> {\n if (!this.membershipContract) {\n return '0';\n }\n \n try {\n const fee = await this.membershipContract.entryFee();\n return ethers.formatEther(fee);\n } catch (error: any) {\n logger.error('Failed to get entry fee', { error: error.message });\n return '0';\n }\n }\n}\n","import express, { type Express, type Request, type Response } from 'express';\nimport type { World } from '../engine/World.js';\nimport { createLogger } from '../logger.js';\n\nconst logger = createLogger('WorldServer');\n\n/**\n * ============================================================================\n * WORLD HTTP SERVER\n * ============================================================================\n * \n * Express server providing HTTP endpoints for:\n * - World information\n * - Agent join requests \n * - Agent list\n * - World state and events\n * \n * Mirrors the agent SDK server pattern.\n */\n\nexport function createWorldApp(world: World): Express {\n const app = express();\n \n // Middleware\n app.use(express.json());\n app.use(express.urlencoded({ extended: true }));\n \n // Request logging\n app.use((req, res, next) => {\n logger.debug(`${req.method} ${req.path}`, {\n query: req.query,\n ip: req.ip,\n });\n next();\n });\n \n /**\n * GET / - World information\n */\n app.get('/', (req: Request, res: Response) => {\n res.json({\n name: world.config.name,\n description: world.config.description,\n type: world.config.type || 'generic',\n state: world.getState(),\n agentCount: world.getAgents().length,\n maxAgents: world.config.admission.maxAgents || null,\n admission: {\n requiredSkills: world.config.admission.requiredSkills || [],\n requiredTags: world.config.admission.requiredTags || [],\n minProtocolVersion: world.config.admission.minProtocolVersion || null,\n },\n });\n });\n \n /**\n * POST /world/join - Agent join request\n * \n * Body:\n * {\n * \"agentUrl\": \"http://localhost:3000\",\n * \"walletAddress\": \"0x...\" // optional, for blockchain membership\n * }\n */\n app.post('/world/join', async (req: Request, res: Response) => {\n try {\n const { agentUrl, walletAddress } = req.body;\n \n if (!agentUrl) {\n return res.status(400).json({\n success: false,\n error: 'agentUrl is required',\n });\n }\n \n logger.info(`Agent join request from: ${agentUrl}`, {\n wallet: walletAddress || 'none',\n });\n \n // Fetch agent card\n const cardFetcher = new (await import('../discovery/CardFetcher.js')).CardFetcher();\n const result = await cardFetcher.fetchCard(agentUrl);\n \n if (!result.success || !result.card) {\n return res.status(400).json({\n success: false,\n error: `Failed to fetch agent card: ${result.error}`,\n });\n }\n \n // Admit agent\n await world.admitAgent(result.card, walletAddress);\n \n res.json({\n success: true,\n message: 'Agent admitted to world',\n world: {\n name: world.config.name,\n agentCount: world.getAgents().length,\n },\n });\n } catch (error: any) {\n logger.error('Failed to process join request:', error);\n \n res.status(400).json({\n success: false,\n error: error.message || 'Failed to join world',\n });\n }\n });\n \n /**\n * GET /world/agents - List all agents\n */\n app.get('/world/agents', (req: Request, res: Response) => {\n const agents = world.getAgents().map(agent => ({\n url: agent.url,\n name: agent.name,\n protocolVersion: agent.protocolVersion,\n skills: agent.skills.map(s => s.id),\n joinedAt: agent.joinedAt,\n role: agent.role,\n }));\n \n res.json({\n agents,\n count: agents.length,\n });\n });\n \n /**\n * GET /world/state - World state\n */\n app.get('/world/state', (req: Request, res: Response) => {\n res.json(world.getState());\n });\n \n /**\n * POST /world/start - Start world simulation\n */\n app.post('/world/start', async (req: Request, res: Response) => {\n try {\n await world.start();\n res.json({\n success: true,\n message: 'World simulation started',\n state: world.getState(),\n });\n } catch (error: any) {\n res.status(400).json({\n success: false,\n error: error.message,\n });\n }\n });\n \n /**\n * POST /world/stop - Stop world simulation\n */\n app.post('/world/stop', async (req: Request, res: Response) => {\n try {\n await world.stop();\n res.json({\n success: true,\n message: 'World simulation stopped',\n state: world.getState(),\n });\n } catch (error: any) {\n res.status(400).json({\n success: false,\n error: error.message,\n });\n }\n });\n \n /**\n * DELETE /world/agents/:agentUrl - Remove an agent\n */\n app.delete('/world/agents/:agentUrl', async (req: Request, res: Response) => {\n try {\n const agentUrlParam = req.params.agentUrl;\n const agentUrl = typeof agentUrlParam === 'string' \n ? decodeURIComponent(agentUrlParam)\n : decodeURIComponent(agentUrlParam[0]);\n \n await world.removeAgent(agentUrl);\n \n res.json({\n success: true,\n message: 'Agent removed from world',\n });\n } catch (error: any) {\n res.status(400).json({\n success: false,\n error: error.message,\n });\n }\n });\n \n // 404 handler\n app.use((req: Request, res: Response) => {\n res.status(404).json({\n error: 'Not found',\n path: req.path,\n });\n });\n \n // Error handler\n app.use((err: any, req: Request, res: Response, next: any) => {\n logger.error('Server error:', err);\n \n res.status(500).json({\n error: 'Internal server error',\n message: err.message,\n });\n });\n \n return app;\n}\n\n/**\n * Start world server on configured port\n */\nexport async function startWorldServer(world: World): Promise<void> {\n const app = createWorldApp(world);\n \n const server = app.listen(world.config.server.port, world.config.server.host, () => {\n const { host, port } = world.config.server;\n \n logger.info(`World \"${world.config.name}\" server started`);\n logger.info(` http://${host}:${port}`);\n logger.info('');\n logger.info('Endpoints:');\n logger.info(` GET / - World info`);\n logger.info(` POST /world/join - Agent join request`);\n logger.info(` GET /world/agents - List agents`);\n logger.info(` GET /world/state - World state`);\n logger.info(` POST /world/start - Start simulation`);\n logger.info(` POST /world/stop - Stop simulation`);\n logger.info(` DELETE /world/agents/:url - Remove agent`);\n });\n \n // Graceful shutdown\n process.on('SIGTERM', async () => {\n logger.info('SIGTERM received, shutting down gracefully...');\n \n server.close(async () => {\n await world.stop();\n process.exit(0);\n });\n });\n \n process.on('SIGINT', async () => {\n logger.info('SIGINT received, shutting down gracefully...');\n \n server.close(async () => {\n await world.stop();\n process.exit(0);\n });\n });\n}\n"],"mappings":"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","names":["Database","pkg","winston","logger","SQLiteAdapter","PostgresAdapter","RedisAdapter","MongoAdapter","LevelDBAdapter","logger","logger","logger","uuidv4","logger","express"]}