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