@@ -2,6 +2,7 @@ import { PGLiteDatabaseAdapter } from "@elizaos/adapter-pglite";
2
2
import { PostgresDatabaseAdapter } from "@elizaos/adapter-postgres" ;
3
3
import { RedisClient } from "@elizaos/adapter-redis" ;
4
4
import { SqliteDatabaseAdapter } from "@elizaos/adapter-sqlite" ;
5
+ import { SupabaseDatabaseAdapter } from "@elizaos/adapter-supabase" ;
5
6
import { AutoClientInterface } from "@elizaos/client-auto" ;
6
7
import { DiscordClientInterface } from "@elizaos/client-discord" ;
7
8
import { FarcasterAgentClient } from "@elizaos/client-farcaster" ;
@@ -148,6 +149,61 @@ function tryLoadFile(filePath: string): string | null {
148
149
return null ;
149
150
}
150
151
}
152
+ function mergeCharacters ( base : Character , child : Character ) : Character {
153
+ const mergeObjects = ( baseObj : any , childObj : any ) => {
154
+ const result : any = { } ;
155
+ const keys = new Set ( [ ...Object . keys ( baseObj || { } ) , ...Object . keys ( childObj || { } ) ] ) ;
156
+ keys . forEach ( key => {
157
+ if ( typeof baseObj [ key ] === 'object' && typeof childObj [ key ] === 'object' && ! Array . isArray ( baseObj [ key ] ) && ! Array . isArray ( childObj [ key ] ) ) {
158
+ result [ key ] = mergeObjects ( baseObj [ key ] , childObj [ key ] ) ;
159
+ } else if ( Array . isArray ( baseObj [ key ] ) || Array . isArray ( childObj [ key ] ) ) {
160
+ result [ key ] = [ ...( baseObj [ key ] || [ ] ) , ...( childObj [ key ] || [ ] ) ] ;
161
+ } else {
162
+ result [ key ] = childObj [ key ] !== undefined ? childObj [ key ] : baseObj [ key ] ;
163
+ }
164
+ } ) ;
165
+ return result ;
166
+ } ;
167
+ return mergeObjects ( base , child ) ;
168
+ }
169
+ async function loadCharacter ( filePath : string ) : Promise < Character > {
170
+ const content = tryLoadFile ( filePath ) ;
171
+ if ( ! content ) {
172
+ throw new Error ( `Character file not found: ${ filePath } ` ) ;
173
+ }
174
+ let character = JSON . parse ( content ) ;
175
+ validateCharacterConfig ( character ) ;
176
+
177
+ // .id isn't really valid
178
+ const characterId = character . id || character . name ;
179
+ const characterPrefix = `CHARACTER.${ characterId . toUpperCase ( ) . replace ( / / g, "_" ) } .` ;
180
+ const characterSettings = Object . entries ( process . env )
181
+ . filter ( ( [ key ] ) => key . startsWith ( characterPrefix ) )
182
+ . reduce ( ( settings , [ key , value ] ) => {
183
+ const settingKey = key . slice ( characterPrefix . length ) ;
184
+ return { ...settings , [ settingKey ] : value } ;
185
+ } , { } ) ;
186
+ if ( Object . keys ( characterSettings ) . length > 0 ) {
187
+ character . settings = character . settings || { } ;
188
+ character . settings . secrets = {
189
+ ...characterSettings ,
190
+ ...character . settings . secrets ,
191
+ } ;
192
+ }
193
+ // Handle plugins
194
+ character . plugins = await handlePluginImporting (
195
+ character . plugins
196
+ ) ;
197
+ if ( character . extends ) {
198
+ elizaLogger . info ( `Merging ${ character . name } character with parent characters` ) ;
199
+ for ( const extendPath of character . extends ) {
200
+ const baseCharacter = await loadCharacter ( path . resolve ( path . dirname ( filePath ) , extendPath ) ) ;
201
+ character = mergeCharacters ( baseCharacter , character ) ;
202
+ elizaLogger . info ( `Merged ${ character . name } with ${ baseCharacter . name } ` ) ;
203
+ }
204
+ }
205
+ return character ;
206
+ }
151
207
152
208
export async function loadCharacters (
153
209
charactersArg : string
@@ -211,32 +267,7 @@ export async function loadCharacters(
211
267
}
212
268
213
269
try {
214
- const character = JSON . parse ( content ) ;
215
- validateCharacterConfig ( character ) ;
216
-
217
- // .id isn't really valid
218
- const characterId = character . id || character . name ;
219
- const characterPrefix = `CHARACTER.${ characterId . toUpperCase ( ) . replace ( / / g, "_" ) } .` ;
220
-
221
- const characterSettings = Object . entries ( process . env )
222
- . filter ( ( [ key ] ) => key . startsWith ( characterPrefix ) )
223
- . reduce ( ( settings , [ key , value ] ) => {
224
- const settingKey = key . slice ( characterPrefix . length ) ;
225
- return { ...settings , [ settingKey ] : value } ;
226
- } , { } ) ;
227
-
228
- if ( Object . keys ( characterSettings ) . length > 0 ) {
229
- character . settings = character . settings || { } ;
230
- character . settings . secrets = {
231
- ...characterSettings ,
232
- ...character . settings . secrets ,
233
- } ;
234
- }
235
-
236
- // Handle plugins
237
- character . plugins = await handlePluginImporting (
238
- character . plugins
239
- ) ;
270
+ const character : Character = await loadCharacter ( resolvedPath ) ;
240
271
241
272
loadedCharacters . push ( character ) ;
242
273
elizaLogger . info (
@@ -418,6 +449,11 @@ export function getTokenForProvider(
418
449
character . settings ?. secrets ?. INFERA_API_KEY ||
419
450
settings . INFERA_API_KEY
420
451
) ;
452
+ case ModelProviderName . DEEPSEEK :
453
+ return (
454
+ character . settings ?. secrets ?. DEEPSEEK_API_KEY ||
455
+ settings . DEEPSEEK_API_KEY
456
+ ) ;
421
457
default :
422
458
const errorMessage = `Failed to get token - unsupported model provider: ${ provider } ` ;
423
459
elizaLogger . error ( errorMessage ) ;
@@ -426,7 +462,24 @@ export function getTokenForProvider(
426
462
}
427
463
428
464
function initializeDatabase ( dataDir : string ) {
429
- if ( process . env . POSTGRES_URL ) {
465
+ if ( process . env . SUPABASE_URL && process . env . SUPABASE_ANON_KEY ) {
466
+ elizaLogger . info ( "Initializing Supabase connection..." ) ;
467
+ const db = new SupabaseDatabaseAdapter (
468
+ process . env . SUPABASE_URL ,
469
+ process . env . SUPABASE_ANON_KEY
470
+ ) ;
471
+
472
+ // Test the connection
473
+ db . init ( )
474
+ . then ( ( ) => {
475
+ elizaLogger . success ( "Successfully connected to Supabase database" ) ;
476
+ } )
477
+ . catch ( ( error ) => {
478
+ elizaLogger . error ( "Failed to connect to Supabase:" , error ) ;
479
+ } ) ;
480
+
481
+ return db ;
482
+ } else if ( process . env . POSTGRES_URL ) {
430
483
elizaLogger . info ( "Initializing PostgreSQL connection..." ) ;
431
484
const db = new PostgresDatabaseAdapter ( {
432
485
connectionString : process . env . POSTGRES_URL ,
@@ -436,9 +489,7 @@ function initializeDatabase(dataDir: string) {
436
489
// Test the connection
437
490
db . init ( )
438
491
. then ( ( ) => {
439
- elizaLogger . success (
440
- "Successfully connected to PostgreSQL database"
441
- ) ;
492
+ elizaLogger . success ( "Successfully connected to PostgreSQL database" ) ;
442
493
} )
443
494
. catch ( ( error ) => {
444
495
elizaLogger . error ( "Failed to connect to PostgreSQL:" , error ) ;
@@ -453,10 +504,19 @@ function initializeDatabase(dataDir: string) {
453
504
} ) ;
454
505
return db ;
455
506
} else {
456
- const filePath =
457
- process . env . SQLITE_FILE ?? path . resolve ( dataDir , "db.sqlite" ) ;
458
- // ":memory:";
507
+ const filePath = process . env . SQLITE_FILE ?? path . resolve ( dataDir , "db.sqlite" ) ;
508
+ elizaLogger . info ( `Initializing SQLite database at ${ filePath } ...` ) ;
459
509
const db = new SqliteDatabaseAdapter ( new Database ( filePath ) ) ;
510
+
511
+ // Test the connection
512
+ db . init ( )
513
+ . then ( ( ) => {
514
+ elizaLogger . success ( "Successfully connected to SQLite database" ) ;
515
+ } )
516
+ . catch ( ( error ) => {
517
+ elizaLogger . error ( "Failed to connect to SQLite:" , error ) ;
518
+ } ) ;
519
+
460
520
return db ;
461
521
}
462
522
}
0 commit comments