Skip to content

Commit fa2b79a

Browse files
authored
Merge branch 'develop' into plugin-chainbase
2 parents 3eaeae7 + 5973e52 commit fa2b79a

File tree

39 files changed

+6434
-2321
lines changed

39 files changed

+6434
-2321
lines changed

.vscode/settings.json

+11
Original file line numberDiff line numberDiff line change
@@ -43,5 +43,16 @@
4343
},
4444
"[shellscript]": {
4545
"editor.defaultFormatter": "foxundermoon.shell-format"
46+
},
47+
"explorer.fileNesting.enabled": true,
48+
"explorer.fileNesting.patterns": {
49+
"*.ts": "${capture}.js",
50+
"*.js": "${capture}.js.map, ${capture}.min.js, ${capture}.d.ts",
51+
"*.jsx": "${capture}.js",
52+
"*.tsx": "${capture}.ts",
53+
"tsconfig.json": "tsconfig.*.json",
54+
"package.json": "package-lock.json, yarn.lock, pnpm-lock.yaml, bun.lockb,pnpm-workspace.yaml",
55+
"README.md": "*.md",
56+
"Dockerfile": "docker-compose-docs.yaml,docker-compose.yaml,Dockerfile.docs"
4657
}
4758
}

README.md

+2
Original file line numberDiff line numberDiff line change
@@ -80,6 +80,8 @@ git clone https://github.com/elizaos/eliza.git
8080
# Checkout the latest release
8181
# This project iterates fast, so we recommend checking out the latest release
8282
git checkout $(git describe --tags --abbrev=0)
83+
# If the above doesn't checkout the latest release, this should work:
84+
# git checkout $(git describe --tags `git rev-list --tags --max-count=1`)
8385
```
8486

8587
### Start Eliza with Gitpod

agent/package.json

+1
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
"exec": "node --enable-source-maps --loader ts-node/esm src/index.ts"
1919
},
2020
"dependencies": {
21+
"@elizaos/adapter-supabase": "workspace:*",
2122
"@elizaos/adapter-postgres": "workspace:*",
2223
"@elizaos/adapter-redis": "workspace:*",
2324
"@elizaos/adapter-sqlite": "workspace:*",

agent/src/index.ts

+93-33
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ import { PGLiteDatabaseAdapter } from "@elizaos/adapter-pglite";
22
import { PostgresDatabaseAdapter } from "@elizaos/adapter-postgres";
33
import { RedisClient } from "@elizaos/adapter-redis";
44
import { SqliteDatabaseAdapter } from "@elizaos/adapter-sqlite";
5+
import { SupabaseDatabaseAdapter } from "@elizaos/adapter-supabase";
56
import { AutoClientInterface } from "@elizaos/client-auto";
67
import { DiscordClientInterface } from "@elizaos/client-discord";
78
import { FarcasterAgentClient } from "@elizaos/client-farcaster";
@@ -149,6 +150,61 @@ function tryLoadFile(filePath: string): string | null {
149150
return null;
150151
}
151152
}
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+
}
152208

153209
export async function loadCharacters(
154210
charactersArg: string
@@ -212,32 +268,7 @@ export async function loadCharacters(
212268
}
213269

214270
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);
241272

242273
loadedCharacters.push(character);
243274
elizaLogger.info(
@@ -419,6 +450,11 @@ export function getTokenForProvider(
419450
character.settings?.secrets?.INFERA_API_KEY ||
420451
settings.INFERA_API_KEY
421452
);
453+
case ModelProviderName.DEEPSEEK:
454+
return (
455+
character.settings?.secrets?.DEEPSEEK_API_KEY ||
456+
settings.DEEPSEEK_API_KEY
457+
);
422458
default:
423459
const errorMessage = `Failed to get token - unsupported model provider: ${provider}`;
424460
elizaLogger.error(errorMessage);
@@ -427,7 +463,24 @@ export function getTokenForProvider(
427463
}
428464

429465
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) {
431484
elizaLogger.info("Initializing PostgreSQL connection...");
432485
const db = new PostgresDatabaseAdapter({
433486
connectionString: process.env.POSTGRES_URL,
@@ -437,9 +490,7 @@ function initializeDatabase(dataDir: string) {
437490
// Test the connection
438491
db.init()
439492
.then(() => {
440-
elizaLogger.success(
441-
"Successfully connected to PostgreSQL database"
442-
);
493+
elizaLogger.success("Successfully connected to PostgreSQL database");
443494
})
444495
.catch((error) => {
445496
elizaLogger.error("Failed to connect to PostgreSQL:", error);
@@ -454,10 +505,19 @@ function initializeDatabase(dataDir: string) {
454505
});
455506
return db;
456507
} 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}...`);
460510
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+
461521
return db;
462522
}
463523
}

0 commit comments

Comments
 (0)