@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.
- package/dist/{LevelDBAdapter-ZV2ZTDOV.js → LevelDBAdapter-734P4R3M.js} +3 -2
- package/dist/LevelDBAdapter-734P4R3M.js.map +1 -0
- package/dist/{LevelDBAdapter-TGQYZHZH.cjs → LevelDBAdapter-UKNYERPS.cjs} +11 -10
- package/dist/LevelDBAdapter-UKNYERPS.cjs.map +1 -0
- package/dist/{MongoAdapter-TCY6JOZH.js → MongoAdapter-Q62CO5ON.js} +3 -2
- package/dist/MongoAdapter-Q62CO5ON.js.map +1 -0
- package/dist/{MongoAdapter-XEHWKU2F.cjs → MongoAdapter-UNQ4IT6J.cjs} +7 -6
- package/dist/MongoAdapter-UNQ4IT6J.cjs.map +1 -0
- package/dist/{PostgresAdapter-WL5SLUDL.cjs → PostgresAdapter-MI4UUSXK.cjs} +8 -7
- package/dist/{PostgresAdapter-PLXDLHVF.js.map → PostgresAdapter-MI4UUSXK.cjs.map} +1 -1
- package/dist/{PostgresAdapter-PLXDLHVF.js → PostgresAdapter-PKCTUAUZ.js} +3 -2
- package/dist/PostgresAdapter-PKCTUAUZ.js.map +1 -0
- package/dist/{RedisAdapter-CT3SNBIS.cjs → RedisAdapter-5X5HAV6I.cjs} +8 -7
- package/dist/RedisAdapter-5X5HAV6I.cjs.map +1 -0
- package/dist/{RedisAdapter-OL4FVEGL.js → RedisAdapter-C7HBXDBA.js} +3 -2
- package/dist/RedisAdapter-C7HBXDBA.js.map +1 -0
- package/dist/index.cjs +4 -4
- package/dist/index.js +4 -4
- package/package.json +3 -1
- package/dist/LevelDBAdapter-TGQYZHZH.cjs.map +0 -1
- package/dist/LevelDBAdapter-ZV2ZTDOV.js.map +0 -1
- package/dist/MongoAdapter-TCY6JOZH.js.map +0 -1
- package/dist/MongoAdapter-XEHWKU2F.cjs.map +0 -1
- package/dist/PostgresAdapter-WL5SLUDL.cjs.map +0 -1
- package/dist/RedisAdapter-CT3SNBIS.cjs.map +0 -1
- 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
|
-
|
|
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-
|
|
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
|
-
|
|
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',
|
|
50
|
+
if (_optionalChain([filter, 'optionalAccess', _3 => _3.type])) {
|
|
50
51
|
prefix = `event:type:${filter.type}:`;
|
|
51
|
-
} else if (_optionalChain([filter, 'optionalAccess',
|
|
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',
|
|
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',
|
|
64
|
-
if (_optionalChain([filter, 'optionalAccess',
|
|
65
|
-
if (_optionalChain([filter, 'optionalAccess',
|
|
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',
|
|
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',
|
|
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-
|
|
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
|
-
|
|
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-
|
|
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
|
-
|
|
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',
|
|
65
|
+
if (_optionalChain([filter, 'optionalAccess', _3 => _3.type])) {
|
|
65
66
|
query.type = filter.type;
|
|
66
67
|
}
|
|
67
|
-
if (_optionalChain([filter, 'optionalAccess',
|
|
68
|
+
if (_optionalChain([filter, 'optionalAccess', _4 => _4.agentUrl])) {
|
|
68
69
|
query.agentUrl = filter.agentUrl;
|
|
69
70
|
}
|
|
70
|
-
if (_optionalChain([filter, 'optionalAccess',
|
|
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',
|
|
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-
|
|
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
|
-
|
|
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',
|
|
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',
|
|
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',
|
|
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',
|
|
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',
|
|
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-
|
|
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":"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","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
|
-
|
|
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-
|
|
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":";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,MAAM,OAAO,WAAW,OAAO,QAAQ,OAAO,KAAK;AACzD,YAAM,IAAI,MAAM,iCAAiC,GAAG,EAAE;AAAA,IACxD;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":[]}
|
|
@@ -19,7 +19,8 @@ var RedisAdapter = (_class = class {
|
|
|
19
19
|
await this.client.ping();
|
|
20
20
|
this.connected = true;
|
|
21
21
|
} catch (error) {
|
|
22
|
-
|
|
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',
|
|
52
|
+
if (_optionalChain([filter, 'optionalAccess', _3 => _3.type])) {
|
|
52
53
|
key = `${this.keyPrefix}events:type:${filter.type}`;
|
|
53
|
-
} else if (_optionalChain([filter, 'optionalAccess',
|
|
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',
|
|
57
|
-
const max = _optionalChain([filter, 'optionalAccess',
|
|
58
|
-
const count = _optionalChain([filter, 'optionalAccess',
|
|
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-
|
|
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
|
-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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.
|
|
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":";AAEA,SAAS,aAAa;AAef,IAAM,iBAAN,MAAmD;AAAA,EAIxD,YAAoB,QAAuB;AAAvB;AAAA,EAAwB;AAAA,EAHpC;AAAA,EACA,YAAY;AAAA,EAIpB,MAAM,UAAyB;AAC7B,QAAI;AACF,WAAK,KAAK,IAAI,MAAM,KAAK,OAAO,MAAM;AAAA,QACpC,eAAe;AAAA,MACjB,CAAC;AACD,YAAM,KAAK,GAAG,KAAK;AACnB,WAAK,YAAY;AAAA,IACnB,SAAS,OAAY;AACnB,YAAM,IAAI,MAAM,8BAA8B,MAAM,OAAO,EAAE;AAAA,IAC/D;AAAA,EACF;AAAA,EAEA,MAAM,UAAU,OAA0C;AAExD,UAAM,KAAK,GAAG,IAAI,iBAAiB,KAAK,UAAU,KAAK,CAAC;AAGxD,UAAM,aAAa,iBAAiB,MAAM,SAAS;AACnD,UAAM,KAAK,GAAG,IAAI,YAAY,KAAK,UAAU,KAAK,CAAC;AAAA,EACrD;AAAA,EAEA,MAAM,YAAgD;AACpD,QAAI;AACF,YAAM,OAAO,MAAM,KAAK,GAAG,IAAI,eAAe;AAC9C,aAAO,KAAK,MAAM,IAAI;AAAA,IACxB,SAAS,OAAY;AACnB,UAAI,MAAM,SAAS,mBAAmB;AACpC,eAAO;AAAA,MACT;AACA,YAAM;AAAA,IACR;AAAA,EACF;AAAA,EAEA,MAAM,UAAU,OAAkC;AAEhD,UAAM,MAAM,SAAS,MAAM,SAAS,IAAI,MAAM,EAAE;AAChD,UAAM,KAAK,GAAG,IAAI,KAAK,KAAK,UAAU,KAAK,CAAC;AAG5C,UAAM,UAAU,cAAc,MAAM,IAAI,IAAI,MAAM,SAAS,IAAI,MAAM,EAAE;AACvE,UAAM,KAAK,GAAG,IAAI,SAAS,KAAK,UAAU,KAAK,CAAC;AAGhD,QAAI,MAAM,UAAU;AAClB,YAAM,WAAW,eAAe,MAAM,QAAQ,IAAI,MAAM,SAAS,IAAI,MAAM,EAAE;AAC7E,YAAM,KAAK,GAAG,IAAI,UAAU,KAAK,UAAU,KAAK,CAAC;AAAA,IACnD;AAAA,EACF;AAAA,EAEA,MAAM,UAAU,QAA6C;AAC3D,UAAM,SAAuB,CAAC;AAC9B,QAAI,SAAS;AAGb,QAAI,QAAQ,MAAM;AAChB,eAAS,cAAc,OAAO,IAAI;AAAA,IACpC,WAAW,QAAQ,UAAU;AAC3B,eAAS,eAAe,OAAO,QAAQ;AAAA,IACzC;AAGA,UAAM,WAAW,KAAK,GAAG,SAAS;AAAA,MAChC,KAAK;AAAA,MACL,KAAK,SAAS;AAAA,MACd,SAAS;AAAA;AAAA,MACT,OAAO,QAAQ,SAAS;AAAA,IAC1B,CAAC;AAED,qBAAiB,CAAC,KAAK,KAAK,KAAK,UAAU;AACzC,YAAM,QAAQ,KAAK,MAAM,KAAe;AAGxC,UAAI,QAAQ,SAAS,MAAM,YAAY,OAAO,MAAO;AACrD,UAAI,QAAQ,SAAS,MAAM,YAAY,OAAO,MAAO;AAGrD,UAAI,QAAQ,QAAQ,CAAC,OAAO,SAAS,OAAO,KAAK,MAAM,SAAS,OAAO,MAAM;AAC3E;AAAA,MACF;AAGA,UAAI,QAAQ,YAAY,CAAC,OAAO,SAAS,QAAQ,KAAK,MAAM,aAAa,OAAO,UAAU;AACxF;AAAA,MACF;AAEA,aAAO,KAAK,KAAK;AAEjB,UAAI,QAAQ,SAAS,OAAO,UAAU,OAAO,OAAO;AAClD;AAAA,MACF;AAAA,IACF;AAEA,WAAO;AAAA,EACT;AAAA,EAEA,MAAM,UAAU,SAAsC;AACpD,UAAM,MAAM,SAAS,QAAQ,GAAG;AAChC,UAAM,KAAK,GAAG,IAAI,KAAK,KAAK,UAAU,OAAO,CAAC;AAG9C,UAAM,UAAU,cAAc,QAAQ,QAAQ,IAAI,QAAQ,GAAG;AAC7D,UAAM,KAAK,GAAG,IAAI,SAAS,QAAQ,GAAG;AAAA,EACxC;AAAA,EAEA,MAAM,YAAY,UAAiC;AACjD,UAAM,MAAM,SAAS,QAAQ;AAE7B,QAAI;AAEF,YAAM,OAAO,MAAM,KAAK,GAAG,IAAI,GAAG;AAClC,YAAM,UAAU,KAAK,MAAM,IAAI;AAG/B,YAAM,KAAK,GAAG,IAAI,GAAG;AAGrB,YAAM,UAAU,cAAc,QAAQ,QAAQ,IAAI,QAAQ;AAC1D,YAAM,KAAK,GAAG,IAAI,OAAO;AAAA,IAC3B,SAAS,OAAY;AACnB,UAAI,MAAM,SAAS,mBAAmB;AACpC,cAAM;AAAA,MACR;AAAA,IACF;AAAA,EACF;AAAA,EAEA,MAAM,YAAqC;AACzC,UAAM,SAAyB,CAAC;AAEhC,UAAM,WAAW,KAAK,GAAG,SAAS;AAAA,MAChC,KAAK;AAAA,MACL,KAAK;AAAA,IACP,CAAC;AAED,qBAAiB,CAAC,KAAK,QAAQ,KAAK,UAAU;AAC5C,UAAI;AACF,cAAM,OAAO,MAAM,KAAK,GAAG,IAAI,SAAS,QAAQ,EAAE;AAClD,eAAO,KAAK,KAAK,MAAM,IAAc,CAAC;AAAA,MACxC,SAAS,OAAY;AAEnB,YAAI,MAAM,SAAS,mBAAmB;AACpC,gBAAM;AAAA,QACR;AAAA,MACF;AAAA,IACF;AAEA,WAAO;AAAA,EACT;AAAA,EAEA,MAAM,SAAS,UAAgD;AAC7D,QAAI;AACF,YAAM,OAAO,MAAM,KAAK,GAAG,IAAI,SAAS,QAAQ,EAAE;AAClD,aAAO,KAAK,MAAM,IAAI;AAAA,IACxB,SAAS,OAAY;AACnB,UAAI,MAAM,SAAS,mBAAmB;AACpC,eAAO;AAAA,MACT;AACA,YAAM;AAAA,IACR;AAAA,EACF;AAAA,EAEA,MAAM,aAA4B;AAChC,UAAM,KAAK,GAAG,MAAM;AACpB,SAAK,YAAY;AAAA,EACnB;AAAA,EAEA,MAAM,cAAgC;AACpC,QAAI;AAEF,YAAM,KAAK,GAAG,IAAI,cAAc,EAAE,MAAM,MAAM;AAAA,MAAC,CAAC;AAChD,aAAO;AAAA,IACT,QAAQ;AACN,aAAO;AAAA,IACT;AAAA,EACF;AAAA,EAEA,MAAM,QAAuB;AAC3B,UAAM,KAAK,GAAG,MAAM;AAAA,EACtB;AACF;","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":";AAEA,SAAS,mBAAmC;AAiBrC,IAAM,eAAN,MAAiD;AAAA,EAQtD,YAAoB,QAAqB;AAArB;AAClB,SAAK,SAAS,IAAI,YAAY,OAAO,KAAK;AAAA,MACxC,oBAAoB,OAAO,uBAAuB;AAAA,IACpD,CAAQ;AAAA,EACV;AAAA,EAXQ;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,YAAY;AAAA,EAQpB,MAAM,UAAyB;AAC7B,QAAI;AACF,YAAM,KAAK,OAAO,QAAQ;AAC1B,WAAK,KAAK,KAAK,OAAO,GAAG,KAAK,OAAO,QAAQ;AAG7C,WAAK,kBAAkB,KAAK,GAAG,WAAW,aAAa;AACvD,WAAK,mBAAmB,KAAK,GAAG,WAAW,cAAc;AACzD,WAAK,mBAAmB,KAAK,GAAG,WAAW,gBAAgB;AAG3D,YAAM,KAAK,YAAY;AAEvB,WAAK,YAAY;AAAA,IACnB,SAAS,OAAY;AACnB,YAAM,IAAI,MAAM,8BAA8B,MAAM,OAAO,EAAE;AAAA,IAC/D;AAAA,EACF;AAAA,EAEA,MAAc,cAA6B;AAEzC,UAAM,KAAK,iBAAiB,YAAY,EAAE,MAAM,EAAE,CAAC;AACnD,UAAM,KAAK,iBAAiB,YAAY,EAAE,WAAW,GAAG,CAAC;AACzD,UAAM,KAAK,iBAAiB,YAAY,EAAE,UAAU,EAAE,CAAC;AACvD,UAAM,KAAK,iBAAiB,YAAY,EAAE,MAAM,GAAG,WAAW,GAAG,CAAC;AAGlE,UAAM,KAAK,iBAAiB,YAAY,EAAE,KAAK,EAAE,GAAG,EAAE,QAAQ,KAAK,CAAC;AACpE,UAAM,KAAK,iBAAiB,YAAY,EAAE,UAAU,EAAE,CAAC;AAGvD,UAAM,KAAK,gBAAgB,YAAY,EAAE,WAAW,GAAG,CAAC;AAAA,EAC1D;AAAA,EAEA,MAAM,UAAU,OAA0C;AACxD,UAAM,KAAK,gBAAgB,UAAU;AAAA,MACnC,GAAG;AAAA,MACH,YAAY,oBAAI,KAAK;AAAA,IACvB,CAAC;AAAA,EACH;AAAA,EAEA,MAAM,YAAgD;AACpD,UAAM,MAAM,MAAM,KAAK,gBAAgB;AAAA,MACrC,CAAC;AAAA,MACD,EAAE,MAAM,EAAE,WAAW,GAAG,EAAE;AAAA,IAC5B;AAEA,QAAI,CAAC,KAAK;AACR,aAAO;AAAA,IACT;AAEA,UAAM,EAAE,KAAK,YAAY,GAAG,MAAM,IAAI;AACtC,WAAO;AAAA,EACT;AAAA,EAEA,MAAM,UAAU,OAAkC;AAChD,UAAM,KAAK,iBAAiB,UAAU;AAAA,MACpC,KAAK,MAAM;AAAA,MACX,GAAG;AAAA,MACH,YAAY,oBAAI,KAAK;AAAA,IACvB,CAAC;AAAA,EACH;AAAA,EAEA,MAAM,UAAU,QAA6C;AAC3D,UAAM,QAAa,CAAC;AAEpB,QAAI,QAAQ,MAAM;AAChB,YAAM,OAAO,OAAO;AAAA,IACtB;AAEA,QAAI,QAAQ,UAAU;AACpB,YAAM,WAAW,OAAO;AAAA,IAC1B;AAEA,QAAI,QAAQ,SAAS,QAAQ,OAAO;AAClC,YAAM,YAAY,CAAC;AACnB,UAAI,OAAO,OAAO;AAChB,cAAM,UAAU,OAAO,OAAO;AAAA,MAChC;AACA,UAAI,OAAO,OAAO;AAChB,cAAM,UAAU,OAAO,OAAO;AAAA,MAChC;AAAA,IACF;AAEA,UAAM,SAAS,KAAK,iBACjB,KAAK,KAAK,EACV,KAAK,EAAE,WAAW,GAAG,CAAC;AAEzB,QAAI,QAAQ,OAAO;AACjB,aAAO,MAAM,OAAO,KAAK;AAAA,IAC3B;AAEA,UAAM,OAAO,MAAM,OAAO,QAAQ;AAElC,WAAO,KAAK,IAAI,SAAO;AACrB,YAAM,EAAE,KAAK,YAAY,GAAG,MAAM,IAAI;AACtC,aAAO;AAAA,IACT,CAAC;AAAA,EACH;AAAA,EAEA,MAAM,UAAU,SAAsC;AACpD,UAAM,KAAK,iBAAiB;AAAA,MAC1B,EAAE,KAAK,QAAQ,IAAI;AAAA,MACnB,EAAE,MAAM,EAAE,GAAG,SAAS,YAAY,oBAAI,KAAK,EAAE,EAAE;AAAA,MAC/C,EAAE,QAAQ,KAAK;AAAA,IACjB;AAAA,EACF;AAAA,EAEA,MAAM,YAAY,UAAiC;AACjD,UAAM,KAAK,iBAAiB,UAAU,EAAE,KAAK,SAAS,CAAC;AAAA,EACzD;AAAA,EAEA,MAAM,YAAqC;AACzC,UAAM,OAAO,MAAM,KAAK,iBACrB,KAAK,CAAC,CAAC,EACP,KAAK,EAAE,UAAU,EAAE,CAAC,EACpB,QAAQ;AAEX,WAAO,KAAK,IAAI,SAAO;AACrB,YAAM,EAAE,KAAK,YAAY,GAAG,QAAQ,IAAI;AACxC,aAAO;AAAA,IACT,CAAC;AAAA,EACH;AAAA,EAEA,MAAM,SAAS,UAAgD;AAC7D,UAAM,MAAM,MAAM,KAAK,iBAAiB,QAAQ,EAAE,KAAK,SAAS,CAAC;AAEjE,QAAI,CAAC,KAAK;AACR,aAAO;AAAA,IACT;AAEA,UAAM,EAAE,KAAK,YAAY,GAAG,QAAQ,IAAI;AACxC,WAAO;AAAA,EACT;AAAA,EAEA,MAAM,aAA4B;AAChC,UAAM,KAAK,OAAO,MAAM;AACxB,SAAK,YAAY;AAAA,EACnB;AAAA,EAEA,MAAM,cAAgC;AACpC,QAAI;AACF,YAAM,KAAK,GAAG,MAAM,EAAE,KAAK;AAC3B,aAAO;AAAA,IACT,QAAQ;AACN,aAAO;AAAA,IACT;AAAA,EACF;AAAA,EAEA,MAAM,QAAuB;AAC3B,UAAM,QAAQ,IAAI;AAAA,MAChB,KAAK,gBAAgB,WAAW,CAAC,CAAC;AAAA,MAClC,KAAK,iBAAiB,WAAW,CAAC,CAAC;AAAA,MACnC,KAAK,iBAAiB,WAAW,CAAC,CAAC;AAAA,IACrC,CAAC;AAAA,EACH;AACF;","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":[]}
|