@@ -240,6 +240,48 @@ async function jsonToCharacter(
240
240
return character ;
241
241
}
242
242
243
+ async function loadCharacter ( filePath : string ) : Promise < Character > {
244
+ const content = tryLoadFile ( filePath ) ;
245
+ if ( ! content ) {
246
+ throw new Error ( `Character file not found: ${ filePath } ` ) ;
247
+ }
248
+ let character = JSON . parse ( content ) ;
249
+ validateCharacterConfig ( character ) ;
250
+ // .id isn't really valid
251
+ const characterId = character . id || character . name ;
252
+ const characterPrefix = `CHARACTER.${ characterId . toUpperCase ( ) . replace ( / / g, "_" ) } .` ;
253
+ const characterSettings = Object . entries ( process . env )
254
+ . filter ( ( [ key ] ) => key . startsWith ( characterPrefix ) )
255
+ . reduce ( ( settings , [ key , value ] ) => {
256
+ const settingKey = key . slice ( characterPrefix . length ) ;
257
+ return { ...settings , [ settingKey ] : value } ;
258
+ } , { } ) ;
259
+ if ( Object . keys ( characterSettings ) . length > 0 ) {
260
+ character . settings = character . settings || { } ;
261
+ character . settings . secrets = {
262
+ ...characterSettings ,
263
+ ...character . settings . secrets ,
264
+ } ;
265
+ }
266
+ // Handle plugins
267
+ character . plugins = await handlePluginImporting ( character . plugins ) ;
268
+ if ( character . extends ) {
269
+ elizaLogger . info (
270
+ `Merging ${ character . name } character with parent characters`
271
+ ) ;
272
+ for ( const extendPath of character . extends ) {
273
+ const baseCharacter = await loadCharacter (
274
+ path . resolve ( path . dirname ( filePath ) , extendPath )
275
+ ) ;
276
+ character = mergeCharacters ( baseCharacter , character ) ;
277
+ elizaLogger . info (
278
+ `Merged ${ character . name } with ${ baseCharacter . name } `
279
+ ) ;
280
+ }
281
+ }
282
+ return character ;
283
+ }
284
+
243
285
export async function loadCharacterFromOnchain ( ) : Promise < Character [ ] > {
244
286
const jsonText = onchainJson ;
245
287
0 commit comments