@moltium/world-core 0.1.14 → 0.1.15

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (26) hide show
  1. package/dist/{LevelDBAdapter-ZV2ZTDOV.js → LevelDBAdapter-734P4R3M.js} +3 -2
  2. package/dist/LevelDBAdapter-734P4R3M.js.map +1 -0
  3. package/dist/{LevelDBAdapter-TGQYZHZH.cjs → LevelDBAdapter-UKNYERPS.cjs} +11 -10
  4. package/dist/LevelDBAdapter-UKNYERPS.cjs.map +1 -0
  5. package/dist/{MongoAdapter-TCY6JOZH.js → MongoAdapter-Q62CO5ON.js} +3 -2
  6. package/dist/MongoAdapter-Q62CO5ON.js.map +1 -0
  7. package/dist/{MongoAdapter-XEHWKU2F.cjs → MongoAdapter-UNQ4IT6J.cjs} +7 -6
  8. package/dist/MongoAdapter-UNQ4IT6J.cjs.map +1 -0
  9. package/dist/{PostgresAdapter-WL5SLUDL.cjs → PostgresAdapter-MI4UUSXK.cjs} +8 -7
  10. package/dist/{PostgresAdapter-PLXDLHVF.js.map → PostgresAdapter-MI4UUSXK.cjs.map} +1 -1
  11. package/dist/{PostgresAdapter-PLXDLHVF.js → PostgresAdapter-PKCTUAUZ.js} +3 -2
  12. package/dist/PostgresAdapter-PKCTUAUZ.js.map +1 -0
  13. package/dist/{RedisAdapter-CT3SNBIS.cjs → RedisAdapter-5X5HAV6I.cjs} +8 -7
  14. package/dist/RedisAdapter-5X5HAV6I.cjs.map +1 -0
  15. package/dist/{RedisAdapter-OL4FVEGL.js → RedisAdapter-C7HBXDBA.js} +3 -2
  16. package/dist/RedisAdapter-C7HBXDBA.js.map +1 -0
  17. package/dist/index.cjs +4 -4
  18. package/dist/index.js +4 -4
  19. package/package.json +3 -1
  20. package/dist/LevelDBAdapter-TGQYZHZH.cjs.map +0 -1
  21. package/dist/LevelDBAdapter-ZV2ZTDOV.js.map +0 -1
  22. package/dist/MongoAdapter-TCY6JOZH.js.map +0 -1
  23. package/dist/MongoAdapter-XEHWKU2F.cjs.map +0 -1
  24. package/dist/PostgresAdapter-WL5SLUDL.cjs.map +0 -1
  25. package/dist/RedisAdapter-CT3SNBIS.cjs.map +0 -1
  26. package/dist/RedisAdapter-OL4FVEGL.js.map +0 -1
@@ -14,7 +14,8 @@ var LevelDBAdapter = class {
14
14
  await this.db.open();
15
15
  this.connected = true;
16
16
  } catch (error) {
17
- throw new Error(`LevelDB connection failed: ${error.message}`);
17
+ const msg = error?.message || error?.code || String(error);
18
+ throw new Error(`LevelDB connection failed: ${msg}`);
18
19
  }
19
20
  }
20
21
  async saveState(state) {
@@ -144,4 +145,4 @@ var LevelDBAdapter = class {
144
145
  export {
145
146
  LevelDBAdapter
146
147
  };
147
- //# sourceMappingURL=LevelDBAdapter-ZV2ZTDOV.js.map
148
+ //# sourceMappingURL=LevelDBAdapter-734P4R3M.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/persistence/adapters/LevelDBAdapter.ts"],"sourcesContent":["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 const msg = error?.message || error?.code || String(error);\n throw new Error(`LevelDB connection failed: ${msg}`);\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"],"mappings":"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","names":[]}
@@ -14,7 +14,8 @@ var LevelDBAdapter = (_class = class {
14
14
  await this.db.open();
15
15
  this.connected = true;
16
16
  } catch (error) {
17
- throw new Error(`LevelDB connection failed: ${error.message}`);
17
+ const msg = _optionalChain([error, 'optionalAccess', _ => _.message]) || _optionalChain([error, 'optionalAccess', _2 => _2.code]) || String(error);
18
+ throw new Error(`LevelDB connection failed: ${msg}`);
18
19
  }
19
20
  }
20
21
  async saveState(state) {
@@ -46,9 +47,9 @@ var LevelDBAdapter = (_class = class {
46
47
  async getEvents(filter) {
47
48
  const events = [];
48
49
  let prefix = "event:";
49
- if (_optionalChain([filter, 'optionalAccess', _ => _.type])) {
50
+ if (_optionalChain([filter, 'optionalAccess', _3 => _3.type])) {
50
51
  prefix = `event:type:${filter.type}:`;
51
- } else if (_optionalChain([filter, 'optionalAccess', _2 => _2.agentUrl])) {
52
+ } else if (_optionalChain([filter, 'optionalAccess', _4 => _4.agentUrl])) {
52
53
  prefix = `event:agent:${filter.agentUrl}:`;
53
54
  }
54
55
  const iterator = this.db.iterator({
@@ -56,20 +57,20 @@ var LevelDBAdapter = (_class = class {
56
57
  lte: prefix + "\uFFFF",
57
58
  reverse: true,
58
59
  // Most recent first
59
- limit: _optionalChain([filter, 'optionalAccess', _3 => _3.limit]) || -1
60
+ limit: _optionalChain([filter, 'optionalAccess', _5 => _5.limit]) || -1
60
61
  });
61
62
  for await (const [key, value] of iterator) {
62
63
  const event = JSON.parse(value);
63
- if (_optionalChain([filter, 'optionalAccess', _4 => _4.since]) && event.timestamp < filter.since) continue;
64
- if (_optionalChain([filter, 'optionalAccess', _5 => _5.until]) && event.timestamp > filter.until) continue;
65
- if (_optionalChain([filter, 'optionalAccess', _6 => _6.type]) && !prefix.includes("type:") && event.type !== filter.type) {
64
+ if (_optionalChain([filter, 'optionalAccess', _6 => _6.since]) && event.timestamp < filter.since) continue;
65
+ if (_optionalChain([filter, 'optionalAccess', _7 => _7.until]) && event.timestamp > filter.until) continue;
66
+ if (_optionalChain([filter, 'optionalAccess', _8 => _8.type]) && !prefix.includes("type:") && event.type !== filter.type) {
66
67
  continue;
67
68
  }
68
- if (_optionalChain([filter, 'optionalAccess', _7 => _7.agentUrl]) && !prefix.includes("agent:") && event.agentUrl !== filter.agentUrl) {
69
+ if (_optionalChain([filter, 'optionalAccess', _9 => _9.agentUrl]) && !prefix.includes("agent:") && event.agentUrl !== filter.agentUrl) {
69
70
  continue;
70
71
  }
71
72
  events.push(event);
72
- if (_optionalChain([filter, 'optionalAccess', _8 => _8.limit]) && events.length >= filter.limit) {
73
+ if (_optionalChain([filter, 'optionalAccess', _10 => _10.limit]) && events.length >= filter.limit) {
73
74
  break;
74
75
  }
75
76
  }
@@ -144,4 +145,4 @@ var LevelDBAdapter = (_class = class {
144
145
 
145
146
 
146
147
  exports.LevelDBAdapter = LevelDBAdapter;
147
- //# sourceMappingURL=LevelDBAdapter-TGQYZHZH.cjs.map
148
+ //# sourceMappingURL=LevelDBAdapter-UKNYERPS.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["/Users/brooklyn/Desktop/SchrodingerLabs/Byzantium/packages/world-core/dist/LevelDBAdapter-UKNYERPS.cjs","../src/persistence/adapters/LevelDBAdapter.ts"],"names":[],"mappings":"AAAA;ACEA,8BAAsB;AAef,IAAM,eAAA,YAAN,MAAmD;AAAA,EAIxD,WAAA,CAAoB,MAAA,EAAuB;AAAvB,IAAA,IAAA,CAAA,OAAA,EAAA,MAAA;AAAA,EAAwB;AAAA,EAHpC;AAAA,iBACA,UAAA,EAAY,MAAA;AAAA,EAIpB,MAAM,OAAA,CAAA,EAAyB;AAC7B,IAAA,IAAI;AACF,MAAA,IAAA,CAAK,GAAA,EAAK,IAAI,iBAAA,CAAM,IAAA,CAAK,MAAA,CAAO,IAAA,EAAM;AAAA,QACpC,aAAA,EAAe;AAAA,MACjB,CAAC,CAAA;AACD,MAAA,MAAM,IAAA,CAAK,EAAA,CAAG,IAAA,CAAK,CAAA;AACnB,MAAA,IAAA,CAAK,UAAA,EAAY,IAAA;AAAA,IACnB,EAAA,MAAA,CAAS,KAAA,EAAY;AACnB,MAAA,MAAM,IAAA,kBAAM,KAAA,2BAAO,UAAA,mBAAW,KAAA,6BAAO,OAAA,GAAQ,MAAA,CAAO,KAAK,CAAA;AACzD,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA,2BAAA,EAA8B,GAAG,CAAA,CAAA;AACnD,IAAA;AACF,EAAA;AAE0D,EAAA;AAEN,IAAA;AAGC,IAAA;AACA,IAAA;AACrD,EAAA;AAEsD,EAAA;AAChD,IAAA;AAC4C,MAAA;AACxB,MAAA;AACH,IAAA;AACmB,MAAA;AAC7B,QAAA;AACT,MAAA;AACM,MAAA;AACR,IAAA;AACF,EAAA;AAEkD,EAAA;AAEA,IAAA;AACJ,IAAA;AAGM,IAAA;AACF,IAAA;AAG5B,IAAA;AACgC,MAAA;AACD,MAAA;AACnD,IAAA;AACF,EAAA;AAE6D,EAAA;AAC7B,IAAA;AACjB,IAAA;AAGK,IAAA;AACkB,MAAA;AACP,IAAA;AACY,MAAA;AACzC,IAAA;AAGkC,IAAA;AAC3B,MAAA;AACS,MAAA;AACL,MAAA;AAAA;AACe,MAAA;AACzB,IAAA;AAE0C,IAAA;AACD,MAAA;AAGM,MAAA;AACA,MAAA;AAGG,MAAA;AAC/C,QAAA;AACF,MAAA;AAGiD,MAAA;AAC/C,QAAA;AACF,MAAA;AAEiB,MAAA;AAE4B,MAAA;AAC3C,QAAA;AACF,MAAA;AACF,IAAA;AAEO,IAAA;AACT,EAAA;AAEsD,EAAA;AACpB,IAAA;AACc,IAAA;AAGI,IAAA;AACZ,IAAA;AACxC,EAAA;AAEmD,EAAA;AACpB,IAAA;AAEzB,IAAA;AAEgC,MAAA;AACH,MAAA;AAGV,MAAA;AAG6B,MAAA;AACzB,MAAA;AACN,IAAA;AACmB,MAAA;AAC9B,QAAA;AACR,MAAA;AACF,IAAA;AACF,EAAA;AAE2C,EAAA;AACT,IAAA;AAEE,IAAA;AAC3B,MAAA;AACA,MAAA;AACN,IAAA;AAE6C,IAAA;AACxC,MAAA;AAC8C,QAAA;AACV,QAAA;AACnB,MAAA;AAEmB,QAAA;AAC9B,UAAA;AACR,QAAA;AACF,MAAA;AACF,IAAA;AAEO,IAAA;AACT,EAAA;AAE+D,EAAA;AACzD,IAAA;AACgD,MAAA;AAC5B,MAAA;AACH,IAAA;AACmB,MAAA;AAC7B,QAAA;AACT,MAAA;AACM,MAAA;AACR,IAAA;AACF,EAAA;AAEkC,EAAA;AACZ,IAAA;AACH,IAAA;AACnB,EAAA;AAEsC,EAAA;AAChC,IAAA;AAE4C,MAAA;AAAE,MAAA;AACzC,MAAA;AACD,IAAA;AACC,MAAA;AACT,IAAA;AACF,EAAA;AAE6B,EAAA;AACP,IAAA;AACtB,EAAA;AACF;AD1DwD;AACA;AACA","file":"/Users/brooklyn/Desktop/SchrodingerLabs/Byzantium/packages/world-core/dist/LevelDBAdapter-UKNYERPS.cjs","sourcesContent":[null,"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 const msg = error?.message || error?.code || String(error);\n throw new Error(`LevelDB connection failed: ${msg}`);\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"]}
@@ -23,7 +23,8 @@ var MongoAdapter = class {
23
23
  await this.initIndexes();
24
24
  this.connected = true;
25
25
  } catch (error) {
26
- throw new Error(`MongoDB connection failed: ${error.message}`);
26
+ const msg = error?.message || error?.code || String(error);
27
+ throw new Error(`MongoDB connection failed: ${msg}`);
27
28
  }
28
29
  }
29
30
  async initIndexes() {
@@ -134,4 +135,4 @@ var MongoAdapter = class {
134
135
  export {
135
136
  MongoAdapter
136
137
  };
137
- //# sourceMappingURL=MongoAdapter-TCY6JOZH.js.map
138
+ //# sourceMappingURL=MongoAdapter-Q62CO5ON.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/persistence/adapters/MongoAdapter.ts"],"sourcesContent":["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 const msg = error?.message || error?.code || String(error);\n throw new Error(`MongoDB connection failed: ${msg}`);\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: any) => {\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: any) => {\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"],"mappings":"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","names":[]}
@@ -23,7 +23,8 @@ var MongoAdapter = (_class = class {
23
23
  await this.initIndexes();
24
24
  this.connected = true;
25
25
  } catch (error) {
26
- throw new Error(`MongoDB connection failed: ${error.message}`);
26
+ const msg = _optionalChain([error, 'optionalAccess', _ => _.message]) || _optionalChain([error, 'optionalAccess', _2 => _2.code]) || String(error);
27
+ throw new Error(`MongoDB connection failed: ${msg}`);
27
28
  }
28
29
  }
29
30
  async initIndexes() {
@@ -61,13 +62,13 @@ var MongoAdapter = (_class = class {
61
62
  }
62
63
  async getEvents(filter) {
63
64
  const query = {};
64
- if (_optionalChain([filter, 'optionalAccess', _ => _.type])) {
65
+ if (_optionalChain([filter, 'optionalAccess', _3 => _3.type])) {
65
66
  query.type = filter.type;
66
67
  }
67
- if (_optionalChain([filter, 'optionalAccess', _2 => _2.agentUrl])) {
68
+ if (_optionalChain([filter, 'optionalAccess', _4 => _4.agentUrl])) {
68
69
  query.agentUrl = filter.agentUrl;
69
70
  }
70
- if (_optionalChain([filter, 'optionalAccess', _3 => _3.since]) || _optionalChain([filter, 'optionalAccess', _4 => _4.until])) {
71
+ if (_optionalChain([filter, 'optionalAccess', _5 => _5.since]) || _optionalChain([filter, 'optionalAccess', _6 => _6.until])) {
71
72
  query.timestamp = {};
72
73
  if (filter.since) {
73
74
  query.timestamp.$gte = filter.since;
@@ -77,7 +78,7 @@ var MongoAdapter = (_class = class {
77
78
  }
78
79
  }
79
80
  const cursor = this.eventsCollection.find(query).sort({ timestamp: -1 });
80
- if (_optionalChain([filter, 'optionalAccess', _5 => _5.limit])) {
81
+ if (_optionalChain([filter, 'optionalAccess', _7 => _7.limit])) {
81
82
  cursor.limit(filter.limit);
82
83
  }
83
84
  const docs = await cursor.toArray();
@@ -134,4 +135,4 @@ var MongoAdapter = (_class = class {
134
135
 
135
136
 
136
137
  exports.MongoAdapter = MongoAdapter;
137
- //# sourceMappingURL=MongoAdapter-XEHWKU2F.cjs.map
138
+ //# sourceMappingURL=MongoAdapter-UNQ4IT6J.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["/Users/brooklyn/Desktop/SchrodingerLabs/Byzantium/packages/world-core/dist/MongoAdapter-UNQ4IT6J.cjs","../src/persistence/adapters/MongoAdapter.ts"],"names":[],"mappings":"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","file":"/Users/brooklyn/Desktop/SchrodingerLabs/Byzantium/packages/world-core/dist/MongoAdapter-UNQ4IT6J.cjs","sourcesContent":[null,"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 const msg = error?.message || error?.code || String(error);\n throw new Error(`MongoDB connection failed: ${msg}`);\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: any) => {\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: any) => {\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"]}
@@ -22,7 +22,8 @@ var PostgresAdapter = (_class = class {
22
22
  await this.initSchema();
23
23
  this.connected = true;
24
24
  } catch (error) {
25
- throw new Error(`PostgreSQL connection failed: ${error.message}`);
25
+ const msg = _optionalChain([error, 'optionalAccess', _ => _.message]) || _optionalChain([error, 'optionalAccess', _2 => _2.code]) || String(error);
26
+ throw new Error(`PostgreSQL connection failed: ${msg}`);
26
27
  }
27
28
  }
28
29
  async initSchema() {
@@ -112,24 +113,24 @@ var PostgresAdapter = (_class = class {
112
113
  let query = "SELECT * FROM world_events WHERE 1=1";
113
114
  const params = [];
114
115
  let paramCount = 1;
115
- if (_optionalChain([filter, 'optionalAccess', _ => _.type])) {
116
+ if (_optionalChain([filter, 'optionalAccess', _3 => _3.type])) {
116
117
  query += ` AND type = $${paramCount++}`;
117
118
  params.push(filter.type);
118
119
  }
119
- if (_optionalChain([filter, 'optionalAccess', _2 => _2.agentUrl])) {
120
+ if (_optionalChain([filter, 'optionalAccess', _4 => _4.agentUrl])) {
120
121
  query += ` AND agent_url = $${paramCount++}`;
121
122
  params.push(filter.agentUrl);
122
123
  }
123
- if (_optionalChain([filter, 'optionalAccess', _3 => _3.since])) {
124
+ if (_optionalChain([filter, 'optionalAccess', _5 => _5.since])) {
124
125
  query += ` AND timestamp >= $${paramCount++}`;
125
126
  params.push(filter.since);
126
127
  }
127
- if (_optionalChain([filter, 'optionalAccess', _4 => _4.until])) {
128
+ if (_optionalChain([filter, 'optionalAccess', _6 => _6.until])) {
128
129
  query += ` AND timestamp <= $${paramCount++}`;
129
130
  params.push(filter.until);
130
131
  }
131
132
  query += " ORDER BY timestamp DESC";
132
- if (_optionalChain([filter, 'optionalAccess', _5 => _5.limit])) {
133
+ if (_optionalChain([filter, 'optionalAccess', _7 => _7.limit])) {
133
134
  query += ` LIMIT $${paramCount++}`;
134
135
  params.push(filter.limit);
135
136
  }
@@ -237,4 +238,4 @@ var PostgresAdapter = (_class = class {
237
238
 
238
239
 
239
240
  exports.PostgresAdapter = PostgresAdapter;
240
- //# sourceMappingURL=PostgresAdapter-WL5SLUDL.cjs.map
241
+ //# sourceMappingURL=PostgresAdapter-MI4UUSXK.cjs.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/persistence/adapters/PostgresAdapter.ts"],"sourcesContent":["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"],"mappings":";AAEA,OAAO,SAAS;AAChB,IAAM,EAAE,KAAK,IAAI;AAqBV,IAAM,kBAAN,MAAoD;AAAA,EAIzD,YAAoB,QAAwB;AAAxB;AAClB,SAAK,OAAO,IAAI,KAAK;AAAA,MACnB,MAAM,OAAO;AAAA,MACb,MAAM,OAAO,QAAQ;AAAA,MACrB,UAAU,OAAO;AAAA,MACjB,MAAM,OAAO;AAAA,MACb,UAAU,OAAO;AAAA,MACjB,KAAK,OAAO,MAAM,EAAE,oBAAoB,MAAM,IAAI;AAAA,MAClD,KAAK,OAAO,OAAO;AAAA,IACrB,CAAC;AAAA,EACH;AAAA,EAbQ;AAAA,EACA,YAAY;AAAA,EAcpB,MAAM,UAAyB;AAC7B,QAAI;AACF,YAAM,KAAK,KAAK,MAAM,cAAc;AACpC,YAAM,KAAK,WAAW;AACtB,WAAK,YAAY;AAAA,IACnB,SAAS,OAAY;AACnB,YAAM,IAAI,MAAM,iCAAiC,MAAM,OAAO,EAAE;AAAA,IAClE;AAAA,EACF;AAAA,EAEA,MAAc,aAA4B;AACxC,UAAM,SAAS,MAAM,KAAK,KAAK,QAAQ;AAEvC,QAAI;AACF,YAAM,OAAO,MAAM,OAAO;AAG1B,YAAM,OAAO,MAAM;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,OAUlB;AAGD,YAAM,OAAO,MAAM;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,OASlB;AAGD,YAAM,OAAO,MAAM;AAAA;AAAA,OAElB;AACD,YAAM,OAAO,MAAM;AAAA;AAAA,OAElB;AAGD,YAAM,OAAO,MAAM;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,OAalB;AAED,YAAM,OAAO,MAAM,QAAQ;AAAA,IAC7B,SAAS,OAAO;AACd,YAAM,OAAO,MAAM,UAAU;AAC7B,YAAM;AAAA,IACR,UAAE;AACA,aAAO,QAAQ;AAAA,IACjB;AAAA,EACF;AAAA,EAEA,MAAM,UAAU,OAA0C;AACxD,UAAM,KAAK,KAAK;AAAA,MACd;AAAA;AAAA,MAEA,CAAC,MAAM,OAAO,MAAM,MAAM,MAAM,OAAO,MAAM,WAAW,KAAK,UAAU,MAAM,QAAQ,CAAC;AAAA,IACxF;AAAA,EACF;AAAA,EAEA,MAAM,YAAgD;AACpD,UAAM,SAAS,MAAM,KAAK,KAAK;AAAA,MAC7B;AAAA,IACF;AAEA,QAAI,OAAO,KAAK,WAAW,GAAG;AAC5B,aAAO;AAAA,IACT;AAEA,UAAM,MAAM,OAAO,KAAK,CAAC;AACzB,WAAO;AAAA,MACL,OAAO,IAAI;AAAA,MACX,MAAM,IAAI;AAAA,MACV,OAAO,IAAI;AAAA,MACX,WAAW,SAAS,IAAI,SAAS;AAAA,MACjC,UAAU,IAAI;AAAA,IAChB;AAAA,EACF;AAAA,EAEA,MAAM,UAAU,OAAkC;AAChD,UAAM,KAAK,KAAK;AAAA,MACd;AAAA;AAAA,MAEA,CAAC,MAAM,IAAI,MAAM,MAAM,MAAM,WAAW,MAAM,YAAY,MAAM,KAAK,UAAU,MAAM,IAAI,CAAC;AAAA,IAC5F;AAAA,EACF;AAAA,EAEA,MAAM,UAAU,QAA6C;AAC3D,QAAI,QAAQ;AACZ,UAAM,SAAgB,CAAC;AACvB,QAAI,aAAa;AAEjB,QAAI,QAAQ,MAAM;AAChB,eAAS,gBAAgB,YAAY;AACrC,aAAO,KAAK,OAAO,IAAI;AAAA,IACzB;AAEA,QAAI,QAAQ,UAAU;AACpB,eAAS,qBAAqB,YAAY;AAC1C,aAAO,KAAK,OAAO,QAAQ;AAAA,IAC7B;AAEA,QAAI,QAAQ,OAAO;AACjB,eAAS,sBAAsB,YAAY;AAC3C,aAAO,KAAK,OAAO,KAAK;AAAA,IAC1B;AAEA,QAAI,QAAQ,OAAO;AACjB,eAAS,sBAAsB,YAAY;AAC3C,aAAO,KAAK,OAAO,KAAK;AAAA,IAC1B;AAEA,aAAS;AAET,QAAI,QAAQ,OAAO;AACjB,eAAS,WAAW,YAAY;AAChC,aAAO,KAAK,OAAO,KAAK;AAAA,IAC1B;AAEA,UAAM,SAAS,MAAM,KAAK,KAAK,MAAM,OAAO,MAAM;AAElD,WAAO,OAAO,KAAK,IAAI,UAAQ;AAAA,MAC7B,IAAI,IAAI;AAAA,MACR,MAAM,IAAI;AAAA,MACV,WAAW,SAAS,IAAI,SAAS;AAAA,MACjC,UAAU,IAAI;AAAA,MACd,MAAM,IAAI;AAAA,IACZ,EAAE;AAAA,EACJ;AAAA,EAEA,MAAM,UAAU,SAAsC;AACpD,UAAM,KAAK,KAAK;AAAA,MACd;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAWA;AAAA,QACE,QAAQ;AAAA,QACR,QAAQ;AAAA,QACR,QAAQ;AAAA,QACR,KAAK,UAAU,QAAQ,MAAM;AAAA,QAC7B,KAAK,UAAU,QAAQ,YAAY;AAAA,QACnC,QAAQ;AAAA,QACR,QAAQ,QAAQ;AAAA,QAChB,KAAK,UAAU,QAAQ,YAAY,CAAC,CAAC;AAAA,QACrC,QAAQ,iBAAiB;AAAA,MAC3B;AAAA,IACF;AAAA,EACF;AAAA,EAEA,MAAM,YAAY,UAAiC;AACjD,UAAM,KAAK,KAAK,MAAM,6CAA6C,CAAC,QAAQ,CAAC;AAAA,EAC/E;AAAA,EAEA,MAAM,YAAqC;AACzC,UAAM,SAAS,MAAM,KAAK,KAAK;AAAA,MAC7B;AAAA,IACF;AAEA,WAAO,OAAO,KAAK,IAAI,UAAQ;AAAA,MAC7B,KAAK,IAAI;AAAA,MACT,MAAM,IAAI;AAAA,MACV,iBAAiB,IAAI;AAAA,MACrB,QAAQ,IAAI;AAAA,MACZ,cAAc,IAAI;AAAA,MAClB,UAAU,SAAS,IAAI,SAAS;AAAA,MAChC,MAAM,IAAI;AAAA,MACV,UAAU,IAAI;AAAA,MACd,eAAe,IAAI;AAAA,IACrB,EAAE;AAAA,EACJ;AAAA,EAEA,MAAM,SAAS,UAAgD;AAC7D,UAAM,SAAS,MAAM,KAAK,KAAK;AAAA,MAC7B;AAAA,MACA,CAAC,QAAQ;AAAA,IACX;AAEA,QAAI,OAAO,KAAK,WAAW,GAAG;AAC5B,aAAO;AAAA,IACT;AAEA,UAAM,MAAM,OAAO,KAAK,CAAC;AACzB,WAAO;AAAA,MACL,KAAK,IAAI;AAAA,MACT,MAAM,IAAI;AAAA,MACV,iBAAiB,IAAI;AAAA,MACrB,QAAQ,IAAI;AAAA,MACZ,cAAc,IAAI;AAAA,MAClB,UAAU,SAAS,IAAI,SAAS;AAAA,MAChC,MAAM,IAAI;AAAA,MACV,UAAU,IAAI;AAAA,MACd,eAAe,IAAI;AAAA,IACrB;AAAA,EACF;AAAA,EAEA,MAAM,aAA4B;AAChC,UAAM,KAAK,KAAK,IAAI;AACpB,SAAK,YAAY;AAAA,EACnB;AAAA,EAEA,MAAM,cAAgC;AACpC,QAAI;AACF,YAAM,KAAK,KAAK,MAAM,UAAU;AAChC,aAAO;AAAA,IACT,QAAQ;AACN,aAAO;AAAA,IACT;AAAA,EACF;AAAA,EAEA,MAAM,QAAuB;AAC3B,UAAM,SAAS,MAAM,KAAK,KAAK,QAAQ;AACvC,QAAI;AACF,YAAM,OAAO,MAAM,OAAO;AAC1B,YAAM,OAAO,MAAM,oDAAoD;AACvE,YAAM,OAAO,MAAM,QAAQ;AAAA,IAC7B,SAAS,OAAO;AACd,YAAM,OAAO,MAAM,UAAU;AAC7B,YAAM;AAAA,IACR,UAAE;AACA,aAAO,QAAQ;AAAA,IACjB;AAAA,EACF;AACF;","names":[]}
1
+ {"version":3,"sources":["/Users/brooklyn/Desktop/SchrodingerLabs/Byzantium/packages/world-core/dist/PostgresAdapter-MI4UUSXK.cjs","../src/persistence/adapters/PostgresAdapter.ts"],"names":[],"mappings":"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","file":"/Users/brooklyn/Desktop/SchrodingerLabs/Byzantium/packages/world-core/dist/PostgresAdapter-MI4UUSXK.cjs","sourcesContent":[null,"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 const msg = error?.message || error?.code || String(error);\n throw new Error(`PostgreSQL connection failed: ${msg}`);\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"]}
@@ -22,7 +22,8 @@ var PostgresAdapter = class {
22
22
  await this.initSchema();
23
23
  this.connected = true;
24
24
  } catch (error) {
25
- throw new Error(`PostgreSQL connection failed: ${error.message}`);
25
+ const msg = error?.message || error?.code || String(error);
26
+ throw new Error(`PostgreSQL connection failed: ${msg}`);
26
27
  }
27
28
  }
28
29
  async initSchema() {
@@ -237,4 +238,4 @@ var PostgresAdapter = class {
237
238
  export {
238
239
  PostgresAdapter
239
240
  };
240
- //# sourceMappingURL=PostgresAdapter-PLXDLHVF.js.map
241
+ //# sourceMappingURL=PostgresAdapter-PKCTUAUZ.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/persistence/adapters/PostgresAdapter.ts"],"sourcesContent":["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 const msg = error?.message || error?.code || String(error);\n throw new Error(`PostgreSQL connection failed: ${msg}`);\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"],"mappings":"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","names":[]}
@@ -19,7 +19,8 @@ var RedisAdapter = (_class = class {
19
19
  await this.client.ping();
20
20
  this.connected = true;
21
21
  } catch (error) {
22
- throw new Error(`Redis connection failed: ${error.message}`);
22
+ const msg = _optionalChain([error, 'optionalAccess', _ => _.message]) || _optionalChain([error, 'optionalAccess', _2 => _2.code]) || String(error);
23
+ throw new Error(`Redis connection failed: ${msg}`);
23
24
  }
24
25
  }
25
26
  async saveState(state) {
@@ -48,14 +49,14 @@ var RedisAdapter = (_class = class {
48
49
  }
49
50
  async getEvents(filter) {
50
51
  let key = `${this.keyPrefix}events`;
51
- if (_optionalChain([filter, 'optionalAccess', _ => _.type])) {
52
+ if (_optionalChain([filter, 'optionalAccess', _3 => _3.type])) {
52
53
  key = `${this.keyPrefix}events:type:${filter.type}`;
53
- } else if (_optionalChain([filter, 'optionalAccess', _2 => _2.agentUrl])) {
54
+ } else if (_optionalChain([filter, 'optionalAccess', _4 => _4.agentUrl])) {
54
55
  key = `${this.keyPrefix}events:agent:${filter.agentUrl}`;
55
56
  }
56
- const min = _optionalChain([filter, 'optionalAccess', _3 => _3.since]) || "-inf";
57
- const max = _optionalChain([filter, 'optionalAccess', _4 => _4.until]) || "+inf";
58
- const count = _optionalChain([filter, 'optionalAccess', _5 => _5.limit]) || -1;
57
+ const min = _optionalChain([filter, 'optionalAccess', _5 => _5.since]) || "-inf";
58
+ const max = _optionalChain([filter, 'optionalAccess', _6 => _6.until]) || "+inf";
59
+ const count = _optionalChain([filter, 'optionalAccess', _7 => _7.limit]) || -1;
59
60
  const results = await this.client.zrevrangebyscore(
60
61
  key,
61
62
  max,
@@ -119,4 +120,4 @@ var RedisAdapter = (_class = class {
119
120
 
120
121
 
121
122
  exports.RedisAdapter = RedisAdapter;
122
- //# sourceMappingURL=RedisAdapter-CT3SNBIS.cjs.map
123
+ //# sourceMappingURL=RedisAdapter-5X5HAV6I.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["/Users/brooklyn/Desktop/SchrodingerLabs/Byzantium/packages/world-core/dist/RedisAdapter-5X5HAV6I.cjs","../src/persistence/adapters/RedisAdapter.ts"],"names":[],"mappings":"AAAA;ACEA,kCAAsB;AAmBf,IAAM,aAAA,YAAN,MAAiD;AAAA,EAKtD,WAAA,CAAoB,MAAA,EAAqB;AAArB,IAAA,IAAA,CAAA,OAAA,EAAA,MAAA;AAClB,IAAA,IAAA,CAAK,UAAA,EAAY,MAAA,CAAO,UAAA,GAAa,QAAA;AACrC,IAAA,IAAA,CAAK,OAAA,EAAS,IAAI,mBAAA,CAAM;AAAA,MACtB,IAAA,EAAM,MAAA,CAAO,IAAA;AAAA,MACb,IAAA,EAAM,MAAA,CAAO,KAAA,GAAQ,IAAA;AAAA,MACrB,QAAA,EAAU,MAAA,CAAO,QAAA;AAAA,MACjB,EAAA,EAAI,MAAA,CAAO,GAAA,GAAM;AAAA,IACnB,CAAC,CAAA;AAAA,EACH;AAAA,EAZQ;AAAA,iBACA,UAAA,EAAY,MAAA;AAAA,EACZ;AAAA,EAYR,MAAM,OAAA,CAAA,EAAyB;AAC7B,IAAA,IAAI;AACF,MAAA,MAAM,IAAA,CAAK,MAAA,CAAO,IAAA,CAAK,CAAA;AACvB,MAAA,IAAA,CAAK,UAAA,EAAY,IAAA;AAAA,IACnB,EAAA,MAAA,CAAS,KAAA,EAAY;AACnB,MAAA,MAAM,IAAA,kBAAM,KAAA,2BAAO,UAAA,mBAAW,KAAA,6BAAO,OAAA,GAAQ,MAAA,CAAO,KAAK,CAAA;AACzD,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA,yBAAA,EAA4B,GAAG,CAAA,CAAA;AACjD,IAAA;AACF,EAAA;AAE0D,EAAA;AAC3B,IAAA;AACmB,IAAA;AAGZ,IAAA;AACK,IAAA;AAC3C,EAAA;AAEsD,EAAA;AACvB,IAAA;AACS,IAAA;AAE3B,IAAA;AACF,MAAA;AACT,IAAA;AAEsB,IAAA;AACxB,EAAA;AAEkD,EAAA;AAEb,IAAA;AACK,IAAA;AAGQ,IAAA;AACC,IAAA;AAG7B,IAAA;AACgB,MAAA;AACK,MAAA;AACzC,IAAA;AACF,EAAA;AAE6D,EAAA;AAChC,IAAA;AAGT,IAAA;AAC6B,MAAA;AAClB,IAAA;AACmB,MAAA;AAChD,IAAA;AAE6B,IAAA;AACA,IAAA;AACE,IAAA;AAGG,IAAA;AAChC,MAAA;AACA,MAAA;AACA,MAAA;AACA,MAAA;AACA,MAAA;AACqB,MAAA;AACvB,IAAA;AAEqC,IAAA;AACvC,EAAA;AAEsD,EAAA;AACH,IAAA;AACC,IAAA;AAGf,IAAA;AACU,IAAA;AAC/C,EAAA;AAEmD,EAAA;AACH,IAAA;AACrB,IAAA;AAGU,IAAA;AACO,IAAA;AAC5C,EAAA;AAE2C,EAAA;AACN,IAAA;AACc,IAAA;AAE1B,IAAA;AACb,MAAA;AACV,IAAA;AAE8C,IAAA;AACA,IAAA;AAIvC,IAAA;AACT,EAAA;AAE+D,EAAA;AACf,IAAA;AACR,IAAA;AAE3B,IAAA;AACF,MAAA;AACT,IAAA;AAEsB,IAAA;AACxB,EAAA;AAEkC,EAAA;AACT,IAAA;AACN,IAAA;AACnB,EAAA;AAEsC,EAAA;AAChC,IAAA;AACqB,MAAA;AAChB,MAAA;AACD,IAAA;AACC,MAAA;AACT,IAAA;AACF,EAAA;AAE6B,EAAA;AACM,IAAA;AACU,IAAA;AAEtB,IAAA;AACU,MAAA;AAC/B,IAAA;AACF,EAAA;AACF;ADzDsD;AACA;AACA","file":"/Users/brooklyn/Desktop/SchrodingerLabs/Byzantium/packages/world-core/dist/RedisAdapter-5X5HAV6I.cjs","sourcesContent":[null,"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 const msg = error?.message || error?.code || String(error);\n throw new Error(`Redis connection failed: ${msg}`);\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"]}
@@ -19,7 +19,8 @@ var RedisAdapter = class {
19
19
  await this.client.ping();
20
20
  this.connected = true;
21
21
  } catch (error) {
22
- throw new Error(`Redis connection failed: ${error.message}`);
22
+ const msg = error?.message || error?.code || String(error);
23
+ throw new Error(`Redis connection failed: ${msg}`);
23
24
  }
24
25
  }
25
26
  async saveState(state) {
@@ -119,4 +120,4 @@ var RedisAdapter = class {
119
120
  export {
120
121
  RedisAdapter
121
122
  };
122
- //# sourceMappingURL=RedisAdapter-OL4FVEGL.js.map
123
+ //# sourceMappingURL=RedisAdapter-C7HBXDBA.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/persistence/adapters/RedisAdapter.ts"],"sourcesContent":["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 const msg = error?.message || error?.code || String(error);\n throw new Error(`Redis connection failed: ${msg}`);\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"],"mappings":"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","names":[]}
package/dist/index.cjs CHANGED
@@ -354,7 +354,7 @@ async function createPostgresAdapter(config) {
354
354
  try {
355
355
  const pg = await Promise.resolve().then(() => _interopRequireWildcard(require("pg")));
356
356
  const Pool = _optionalChain([pg, 'access', _11 => _11.default, 'optionalAccess', _12 => _12.Pool]) || pg.Pool;
357
- const { PostgresAdapter } = await Promise.resolve().then(() => _interopRequireWildcard(require("./PostgresAdapter-WL5SLUDL.cjs")));
357
+ const { PostgresAdapter } = await Promise.resolve().then(() => _interopRequireWildcard(require("./PostgresAdapter-MI4UUSXK.cjs")));
358
358
  return new PostgresAdapter(config);
359
359
  } catch (error) {
360
360
  if (error.code === "ERR_MODULE_NOT_FOUND" || error.code === "MODULE_NOT_FOUND") {
@@ -368,7 +368,7 @@ async function createPostgresAdapter(config) {
368
368
  async function createRedisAdapter(config) {
369
369
  try {
370
370
  await Promise.resolve().then(() => _interopRequireWildcard(require("ioredis")));
371
- const { RedisAdapter } = await Promise.resolve().then(() => _interopRequireWildcard(require("./RedisAdapter-CT3SNBIS.cjs")));
371
+ const { RedisAdapter } = await Promise.resolve().then(() => _interopRequireWildcard(require("./RedisAdapter-5X5HAV6I.cjs")));
372
372
  return new RedisAdapter(config);
373
373
  } catch (error) {
374
374
  if (error.code === "ERR_MODULE_NOT_FOUND" || error.code === "MODULE_NOT_FOUND") {
@@ -382,7 +382,7 @@ async function createRedisAdapter(config) {
382
382
  async function createMongoAdapter(config) {
383
383
  try {
384
384
  await Promise.resolve().then(() => _interopRequireWildcard(require("mongodb")));
385
- const { MongoAdapter } = await Promise.resolve().then(() => _interopRequireWildcard(require("./MongoAdapter-XEHWKU2F.cjs")));
385
+ const { MongoAdapter } = await Promise.resolve().then(() => _interopRequireWildcard(require("./MongoAdapter-UNQ4IT6J.cjs")));
386
386
  return new MongoAdapter(config);
387
387
  } catch (error) {
388
388
  if (error.code === "ERR_MODULE_NOT_FOUND" || error.code === "MODULE_NOT_FOUND") {
@@ -396,7 +396,7 @@ async function createMongoAdapter(config) {
396
396
  async function createLevelDBAdapter(config) {
397
397
  try {
398
398
  await Promise.resolve().then(() => _interopRequireWildcard(require("level")));
399
- const { LevelDBAdapter } = await Promise.resolve().then(() => _interopRequireWildcard(require("./LevelDBAdapter-TGQYZHZH.cjs")));
399
+ const { LevelDBAdapter } = await Promise.resolve().then(() => _interopRequireWildcard(require("./LevelDBAdapter-UKNYERPS.cjs")));
400
400
  return new LevelDBAdapter(config);
401
401
  } catch (error) {
402
402
  if (error.code === "ERR_MODULE_NOT_FOUND" || error.code === "MODULE_NOT_FOUND") {
package/dist/index.js CHANGED
@@ -354,7 +354,7 @@ async function createPostgresAdapter(config) {
354
354
  try {
355
355
  const pg = await import("pg");
356
356
  const Pool = pg.default?.Pool || pg.Pool;
357
- const { PostgresAdapter } = await import("./PostgresAdapter-PLXDLHVF.js");
357
+ const { PostgresAdapter } = await import("./PostgresAdapter-PKCTUAUZ.js");
358
358
  return new PostgresAdapter(config);
359
359
  } catch (error) {
360
360
  if (error.code === "ERR_MODULE_NOT_FOUND" || error.code === "MODULE_NOT_FOUND") {
@@ -368,7 +368,7 @@ async function createPostgresAdapter(config) {
368
368
  async function createRedisAdapter(config) {
369
369
  try {
370
370
  await import("ioredis");
371
- const { RedisAdapter } = await import("./RedisAdapter-OL4FVEGL.js");
371
+ const { RedisAdapter } = await import("./RedisAdapter-C7HBXDBA.js");
372
372
  return new RedisAdapter(config);
373
373
  } catch (error) {
374
374
  if (error.code === "ERR_MODULE_NOT_FOUND" || error.code === "MODULE_NOT_FOUND") {
@@ -382,7 +382,7 @@ async function createRedisAdapter(config) {
382
382
  async function createMongoAdapter(config) {
383
383
  try {
384
384
  await import("mongodb");
385
- const { MongoAdapter } = await import("./MongoAdapter-TCY6JOZH.js");
385
+ const { MongoAdapter } = await import("./MongoAdapter-Q62CO5ON.js");
386
386
  return new MongoAdapter(config);
387
387
  } catch (error) {
388
388
  if (error.code === "ERR_MODULE_NOT_FOUND" || error.code === "MODULE_NOT_FOUND") {
@@ -396,7 +396,7 @@ async function createMongoAdapter(config) {
396
396
  async function createLevelDBAdapter(config) {
397
397
  try {
398
398
  await import("level");
399
- const { LevelDBAdapter } = await import("./LevelDBAdapter-ZV2ZTDOV.js");
399
+ const { LevelDBAdapter } = await import("./LevelDBAdapter-734P4R3M.js");
400
400
  return new LevelDBAdapter(config);
401
401
  } catch (error) {
402
402
  if (error.code === "ERR_MODULE_NOT_FOUND" || error.code === "MODULE_NOT_FOUND") {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@moltium/world-core",
3
- "version": "0.1.14",
3
+ "version": "0.1.15",
4
4
  "description": "World runtime for creating agent simulation environments with A2A-based admission and blockchain validation",
5
5
  "license": "MIT",
6
6
  "type": "module",
@@ -74,6 +74,8 @@
74
74
  "@types/express": "^5.0.0",
75
75
  "@types/node": "^22.0.0",
76
76
  "@types/better-sqlite3": "^7.6.0",
77
+ "level": "^8.0.0",
78
+ "mongodb": "^6.0.0",
77
79
  "hardhat": "^2.22.0",
78
80
  "@nomicfoundation/hardhat-toolbox": "^5.0.0",
79
81
  "@openzeppelin/contracts": "^5.0.0",
@@ -1 +0,0 @@
1
- {"version":3,"sources":["/Users/brooklyn/Desktop/SchrodingerLabs/Byzantium/packages/world-core/dist/LevelDBAdapter-TGQYZHZH.cjs","../src/persistence/adapters/LevelDBAdapter.ts"],"names":[],"mappings":"AAAA;ACEA,8BAAsB;AAef,IAAM,eAAA,YAAN,MAAmD;AAAA,EAIxD,WAAA,CAAoB,MAAA,EAAuB;AAAvB,IAAA,IAAA,CAAA,OAAA,EAAA,MAAA;AAAA,EAAwB;AAAA,EAHpC;AAAA,iBACA,UAAA,EAAY,MAAA;AAAA,EAIpB,MAAM,OAAA,CAAA,EAAyB;AAC7B,IAAA,IAAI;AACF,MAAA,IAAA,CAAK,GAAA,EAAK,IAAI,iBAAA,CAAM,IAAA,CAAK,MAAA,CAAO,IAAA,EAAM;AAAA,QACpC,aAAA,EAAe;AAAA,MACjB,CAAC,CAAA;AACD,MAAA,MAAM,IAAA,CAAK,EAAA,CAAG,IAAA,CAAK,CAAA;AACnB,MAAA,IAAA,CAAK,UAAA,EAAY,IAAA;AAAA,IACnB,EAAA,MAAA,CAAS,KAAA,EAAY;AACnB,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA,2BAAA,EAA8B,KAAA,CAAM,OAAO,CAAA,CAAA;AAC7D,IAAA;AACF,EAAA;AAE0D,EAAA;AAEA,IAAA;AAGL,IAAA;AACA,IAAA;AACrD,EAAA;AAEsD,EAAA;AAChD,IAAA;AAC4C,MAAA;AACxB,MAAA;AACH,IAAA;AACmB,MAAA;AAC7B,QAAA;AACT,MAAA;AACM,MAAA;AACR,IAAA;AACF,EAAA;AAEkD,EAAA;AAEA,IAAA;AACJ,IAAA;AAGe,IAAA;AACX,IAAA;AAG5B,IAAA;AACsC,MAAA;AACP,MAAA;AACnD,IAAA;AACF,EAAA;AAE6D,EAAA;AAC7B,IAAA;AACjB,IAAA;AAGK,IAAA;AACkB,MAAA;AACP,IAAA;AACY,MAAA;AACzC,IAAA;AAGkC,IAAA;AAC3B,MAAA;AACS,MAAA;AACL,MAAA;AAAA;AACe,MAAA;AACzB,IAAA;AAE0C,IAAA;AACD,MAAA;AAGa,MAAA;AACA,MAAA;AAGE,MAAA;AACrD,QAAA;AACF,MAAA;AAG4D,MAAA;AAC1D,QAAA;AACF,MAAA;AAEiB,MAAA;AAEmC,MAAA;AAClD,QAAA;AACF,MAAA;AACF,IAAA;AAEO,IAAA;AACT,EAAA;AAEsD,EAAA;AACpB,IAAA;AACc,IAAA;AAGe,IAAA;AACvB,IAAA;AACxC,EAAA;AAEmD,EAAA;AACpB,IAAA;AAEzB,IAAA;AAEgC,MAAA;AACH,MAAA;AAGV,MAAA;AAGqC,MAAA;AACjC,MAAA;AACN,IAAA;AACmB,MAAA;AAC9B,QAAA;AACR,MAAA;AACF,IAAA;AACF,EAAA;AAE2C,EAAA;AACT,IAAA;AAEE,IAAA;AAC3B,MAAA;AACA,MAAA;AACN,IAAA;AAE6C,IAAA;AACxC,MAAA;AACgD,QAAA;AACZ,QAAA;AACnB,MAAA;AAEmB,QAAA;AAC9B,UAAA;AACR,QAAA;AACF,MAAA;AACF,IAAA;AAEO,IAAA;AACT,EAAA;AAE+D,EAAA;AACzD,IAAA;AACgD,MAAA;AAC5B,MAAA;AACH,IAAA;AACmB,MAAA;AAC7B,QAAA;AACT,MAAA;AACM,MAAA;AACR,IAAA;AACF,EAAA;AAEkC,EAAA;AACZ,IAAA;AACH,IAAA;AACnB,EAAA;AAEsC,EAAA;AAChC,IAAA;AAE4C,MAAA;AAAE,MAAA;AACzC,MAAA;AACD,IAAA;AACC,MAAA;AACT,IAAA;AACF,EAAA;AAE6B,EAAA;AACP,IAAA;AACtB,EAAA;AACF;AD1DkE;AACA;AACA","file":"/Users/brooklyn/Desktop/SchrodingerLabs/Byzantium/packages/world-core/dist/LevelDBAdapter-TGQYZHZH.cjs","sourcesContent":[null,"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"]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/persistence/adapters/LevelDBAdapter.ts"],"sourcesContent":["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"],"mappings":"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","names":[]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/persistence/adapters/MongoAdapter.ts"],"sourcesContent":["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"],"mappings":"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","names":[]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["/Users/brooklyn/Desktop/SchrodingerLabs/Byzantium/packages/world-core/dist/MongoAdapter-XEHWKU2F.cjs","../src/persistence/adapters/MongoAdapter.ts"],"names":[],"mappings":"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","file":"/Users/brooklyn/Desktop/SchrodingerLabs/Byzantium/packages/world-core/dist/MongoAdapter-XEHWKU2F.cjs","sourcesContent":[null,"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"]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["/Users/brooklyn/Desktop/SchrodingerLabs/Byzantium/packages/world-core/dist/PostgresAdapter-WL5SLUDL.cjs","../src/persistence/adapters/PostgresAdapter.ts"],"names":[],"mappings":"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","file":"/Users/brooklyn/Desktop/SchrodingerLabs/Byzantium/packages/world-core/dist/PostgresAdapter-WL5SLUDL.cjs","sourcesContent":[null,"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"]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["/Users/brooklyn/Desktop/SchrodingerLabs/Byzantium/packages/world-core/dist/RedisAdapter-CT3SNBIS.cjs","../src/persistence/adapters/RedisAdapter.ts"],"names":[],"mappings":"AAAA;ACEA,kCAAsB;AAmBf,IAAM,aAAA,YAAN,MAAiD;AAAA,EAKtD,WAAA,CAAoB,MAAA,EAAqB;AAArB,IAAA,IAAA,CAAA,OAAA,EAAA,MAAA;AAClB,IAAA,IAAA,CAAK,UAAA,EAAY,MAAA,CAAO,UAAA,GAAa,QAAA;AACrC,IAAA,IAAA,CAAK,OAAA,EAAS,IAAI,mBAAA,CAAM;AAAA,MACtB,IAAA,EAAM,MAAA,CAAO,IAAA;AAAA,MACb,IAAA,EAAM,MAAA,CAAO,KAAA,GAAQ,IAAA;AAAA,MACrB,QAAA,EAAU,MAAA,CAAO,QAAA;AAAA,MACjB,EAAA,EAAI,MAAA,CAAO,GAAA,GAAM;AAAA,IACnB,CAAC,CAAA;AAAA,EACH;AAAA,EAZQ;AAAA,iBACA,UAAA,EAAY,MAAA;AAAA,EACZ;AAAA,EAYR,MAAM,OAAA,CAAA,EAAyB;AAC7B,IAAA,IAAI;AACF,MAAA,MAAM,IAAA,CAAK,MAAA,CAAO,IAAA,CAAK,CAAA;AACvB,MAAA,IAAA,CAAK,UAAA,EAAY,IAAA;AAAA,IACnB,EAAA,MAAA,CAAS,KAAA,EAAY;AACnB,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA,yBAAA,EAA4B,KAAA,CAAM,OAAO,CAAA,CAAA;AAC3D,IAAA;AACF,EAAA;AAE0D,EAAA;AAC3B,IAAA;AACmB,IAAA;AAGZ,IAAA;AACqB,IAAA;AAC3D,EAAA;AAEsD,EAAA;AACvB,IAAA;AACS,IAAA;AAE3B,IAAA;AACF,MAAA;AACT,IAAA;AAEsB,IAAA;AACxB,EAAA;AAEkD,EAAA;AAEb,IAAA;AACqB,IAAA;AAGE,IAAA;AACJ,IAAA;AAGlC,IAAA;AACsC,MAAA;AACD,MAAA;AACzD,IAAA;AACF,EAAA;AAE6D,EAAA;AAChC,IAAA;AAGT,IAAA;AACiC,MAAA;AACtB,IAAA;AAC2B,MAAA;AACxD,IAAA;AAE6B,IAAA;AACA,IAAA;AACE,IAAA;AAGG,IAAA;AAChC,MAAA;AACA,MAAA;AACA,MAAA;AACA,MAAA;AACA,MAAA;AACqB,MAAA;AACvB,IAAA;AAEqC,IAAA;AACvC,EAAA;AAEsD,EAAA;AACH,IAAA;AACC,IAAA;AAGf,IAAA;AACU,IAAA;AAC/C,EAAA;AAEmD,EAAA;AACH,IAAA;AACrB,IAAA;AAGU,IAAA;AACO,IAAA;AAC5C,EAAA;AAE2C,EAAA;AACN,IAAA;AACc,IAAA;AAE1B,IAAA;AACb,MAAA;AACV,IAAA;AAE0D,IAAA;AACZ,IAAA;AAI7B,IAAA;AACnB,EAAA;AAE+D,EAAA;AACf,IAAA;AACR,IAAA;AAE3B,IAAA;AACF,MAAA;AACT,IAAA;AAEsB,IAAA;AACxB,EAAA;AAEkC,EAAA;AACT,IAAA;AACN,IAAA;AACnB,EAAA;AAEsC,EAAA;AAChC,IAAA;AACqB,MAAA;AAChB,MAAA;AACD,IAAA;AACC,MAAA;AACT,IAAA;AACF,EAAA;AAE6B,EAAA;AACM,IAAA;AACU,IAAA;AAEtB,IAAA;AACU,MAAA;AAC/B,IAAA;AACF,EAAA;AACF;ADzDgE;AACA;AACA","file":"/Users/brooklyn/Desktop/SchrodingerLabs/Byzantium/packages/world-core/dist/RedisAdapter-CT3SNBIS.cjs","sourcesContent":[null,"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"]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/persistence/adapters/RedisAdapter.ts"],"sourcesContent":["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"],"mappings":"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","names":[]}