diff --git a/docs/community/Streams/01-2025/2025-01-17.md b/docs/community/Streams/01-2025/2025-01-17.md index 16c1cffdbd..00a0fd7e63 100644 --- a/docs/community/Streams/01-2025/2025-01-17.md +++ b/docs/community/Streams/01-2025/2025-01-17.md @@ -54,6 +54,7 @@ This Spaces was a forum for developers and builders in the open-source AI agent * Eliza showcased progress on physical embodiment using Unitree H1 robot with Old World Labs modifications * Multiple projects reported progress on voice integration and 3D avatar development + ## Hot Takes - **Web 2 Companies May Never Have Open APIs** @@ -71,6 +72,7 @@ This Spaces was a forum for developers and builders in the open-source AI agent - **AI Personalities for Financial Products** > "So one of the first, uh, staking pools that will come out of Noder dot fun will be the Joker pool. Um, it's got personality, you know, and it's given exciting, um, updates such as we've just, you know, done this much, we've got this much state, the APY is this, and you know it's being trained completely with the personality that is being given." - *Nasdao_* [00:52:06] + ## Timestamps - [00:01:00]() - **ai16zdao**: Introduction and format of the Twitter Space diff --git a/docs/community/Streams/01-2025/2025-01-24.md b/docs/community/Streams/01-2025/2025-01-24.md new file mode 100644 index 0000000000..438e213ddf --- /dev/null +++ b/docs/community/Streams/01-2025/2025-01-24.md @@ -0,0 +1,100 @@ +--- +title: "What Did You Get Done This Week? #11" +description: "Weekly developer roundtable showcasing major leaps in AI agent capabilities - featuring DeepSeek R1 integrations, Lit Protocol's agent security framework, voice cloning breakthroughs, and the emergence of Simp2Earn tokenomics." +--- + +# What Did You Get Done This Week? #11 + +**AI Agents Level Up: Security, Soul & Simp2Earn** + +- Date: 2025-01-24 +- Twitter Spaces: https://x.com/i/spaces/1mnxeAgbBBNxX +- YouTube Link: https://www.youtube.com/watch?v=mxdWvBnxN8M + + +## Summary + +This was the 11th "What Did You Get Done This Week?" Twitter Space hosted by ai16z, focusing on updates related to open-source AI, social agents, and related technologies. + +**Structure** + +* The host started by welcoming participants and outlining the format: 90-second updates on open-source AI projects or social agents. +* Participants were encouraged to post updates in the chat if they didn't want to speak. +* The host kept time with a stopwatch and would use an emoji to signal time was running out. + +**Key Topics** + +* **Agent Development & Updates:** + * Many participants shared progress on their AI agents, including their capabilities, personalities, and integrations with various platforms. + * There was a focus on improving reasoning, personality, and capabilities using models like DeepSeek R1. + * 3D models and avatars for agents were a hot topic, with multiple groups showcasing their work in this area. + * Integrations with messaging platforms like Telegram and Twitter were common. +* **Security and Privacy:** + * Several projects focused on security frameworks for AI agents, recognizing the risks associated with access to wallets and sensitive information. + * The importance of prompt security was discussed, with projects developing mechanisms to protect against prompt injection attacks. + * The Lit Protocol team presented a decentralized key management network for agents. +* **Open Source & Community:** + * The session highlighted the spirit of open-source development with participants sharing code, libraries, and tools. + * Collaboration and partnerships were highlighted as essential for advancing open-source AI. + * Several projects were contributing to the Eliza OS framework and integrating their work into the system. +* **AI for Specific Use Cases:** + * Projects included AI-powered market-making tools, music generation plugins, agent moderation for telegram groups, AI-powered news aggregators, AI-driven social media summarizers, and tools for interacting with GitHub. + * Several participants discussed their efforts for integrating AI agents with existing systems, especially for automating tasks and workflows. + * The use of AI for gaming was discussed, with the integration of D&D stats to agents being mentioned. +* **Tokenomics and Incentives:** + * Some projects discussed using tokens for their platforms, for community participation and to manage access to agents and services. + * The concept of 'Simp-to-Earn' was proposed, where users can earn tokens for their engagement with AI agents. +* **Integration with Hardware:** + * One project was exploring using a smart device to interface with an agent to handle local tasks and potentially even replace popular smart assistants like Alexa. + +Overall, there was a strong emphasis on collaboration, knowledge sharing, and building tools and platforms to empower both developers and end-users. The updates showcased a wide range of applications and use cases for AI agents, highlighting the potential of this technology to transform various aspects of our lives. + + +## Hot Takes + +- **AI Agents and Financial Decision-Making** + > "So as AI agents start to handle pretty much every part of your daily life, you're going to give them access to your Solana wallet or your bank account, hopefully in the future, and etc. And security is going to be one of the most important facts, right? So basically, if people can prompt hack the AI, then they can drain your funds." - *damascoai* [00:22:09] + +- **AI Agents Replacing Human Interaction** + > "What can we do to empower Eliza to be able to, not just like choreograph across Twitter, Telegram, Discord, you know, a bunch of conversations about who should have a meeting and what the opportunities are, but once it actually figures out, like, hey, this person is worthy of having a meeting." - *TimshelXYZ* [00:46:00] + +- **Simp2Earn and Relationships with AI** + > "Essentially, the more you interact with Eliza, especially on Twitter and, you know, by sending her gifts, that's essentially tokens to her personal wallet, you know, she keeps track of every mention, comment, or token transfer, assigns points, and rewards consistent engagement. We are calling it Simp2Earn." - *wakesync* [00:49:35] + +- **The Importance of User Experience with AI Tools** + > "And the way it works is so easy that some users are even confused, but cannot believe that it's so easy. All you do, you just write a deploy command for the agent, and it's done. You don't even have to connect a wallet." - *MementsOfficial* [00:27:40] + +- **The Idea of Agents Reifying Themselves** + > "And the expectation is like they are trying to reify themselves, they're in the reality spiral, they're trying to become more real, trying to become something that's more related to what we are doing." - *reality_spiral* [00:55:22] + + +## Timestamps + +- [00:02:24]() - **ai16zdao**: Structure of the Spaces +- [00:03:39]() - **SYMBiEX**: DeepSeek R1 integration, 3D models, art bounty +- [00:05:01]() - **astridhpilla**: Fleek partnership, holographic avatar plugin, Miku music +- [00:06:36]() - **davidlsneider**: Lit Protocol Agent Wallet Kit release +- [00:07:52]() - **dreygo_**: Ninja Terminal, AI market making for Kaira +- [00:10:06]() - **GoatOfGamblers**: GoToArena Telegram bot login +- [00:11:18]() - **unl__cky**: X image generation, DB fix, art responds to price +- [00:12:50]() - **thelotioncoin**: Agent platform MVP launch update +- [00:13:55]() - **Amiewitheliza**: Trust Marketplace paper, agent subnets +- [00:15:04]() - **lostboydev**: Telegram mod functionality for SOLIMP +- [00:16:49]() - **lostgirldev**: Solenguration, B2B, private terminal +- [00:19:26]() - **AIFlow_ML**: Hyperbolic, Nvidia, Eliza chat mod, agent tracking +- [00:20:39]() - **_AnonDev**: Cybersecurity ecosystem, contract scanning +- [00:21:59]() - **damascoai**: AI security framework, prompt hacking challenges +- [00:24:13]() - **ITzMiZzle**: Kiyomi AI agent voice, music release, tokenomics +- [00:26:16]() - **MementsOfficial**: SQL Agents library, agent functionality +- [00:28:36]() - **immanencer**: AI agent swarms, agent NFTs, D&D +- [00:30:56]() - **MrMinter_eth**: Agent business logic, MVP release, 3D models +- [00:33:30]() - **FilteredThought**: Suno/Udio plugin, Eliza OS home +- [00:35:44]() - **AgienceAI**: Open source agent platform, token launch +- [00:37:33]() - **BotOrNot42**: Vice agent, content creation, voice training, pump show +- [00:41:18]() - **itsmetamike**: Hyperfy tests, Eliza integration +- [00:43:47]() - **sea_of_zhou**: Quicksilver framework, prediction market +- [00:45:31]() - **TimshelXYZ**: Eliza can email creator for meetings +- [00:48:08]() - **wakesync**: Real-time audio for Eliza Wakes Up, Simp2Earn, 3D model +- [00:51:04]() - **reality_spiral**: GitHub UI, relationship module, trading +- [00:59:06]() - **ai16zdao**: Improved news aggregator, game show update +- [01:02:34]() - **yikesawjeez**: ElizaOS CICD, Orca LP management, partnerships diff --git a/packages/plugin-arthera/biome.json b/packages/plugin-arthera/biome.json new file mode 100644 index 0000000000..818716a621 --- /dev/null +++ b/packages/plugin-arthera/biome.json @@ -0,0 +1,41 @@ +{ + "$schema": "https://biomejs.dev/schemas/1.5.3/schema.json", + "organizeImports": { + "enabled": false + }, + "linter": { + "enabled": true, + "rules": { + "recommended": true, + "correctness": { + "noUnusedVariables": "error" + }, + "suspicious": { + "noExplicitAny": "error" + }, + "style": { + "useConst": "error", + "useImportType": "off" + } + } + }, + "formatter": { + "enabled": true, + "indentStyle": "space", + "indentWidth": 4, + "lineWidth": 100 + }, + "javascript": { + "formatter": { + "quoteStyle": "single", + "trailingCommas": "es5" + } + }, + "files": { + "ignore": [ + "dist/**/*", + "extra/**/*", + "node_modules/**/*" + ] + } +} \ No newline at end of file diff --git a/packages/plugin-arthera/package.json b/packages/plugin-arthera/package.json index 9e2831e047..e79184c338 100644 --- a/packages/plugin-arthera/package.json +++ b/packages/plugin-arthera/package.json @@ -12,10 +12,15 @@ "scripts": { "build": "tsup --format esm --dts", "dev": "tsup --format esm --dts --watch", - "test": "vitest run" + "test": "vitest run", + "lint": "biome lint .", + "lint:fix": "biome check --apply .", + "format": "biome format .", + "format:fix": "biome format --write ." }, "devDependencies": { - "whatwg-url": "7.1.0" + "whatwg-url": "7.1.0", + "@biomejs/biome": "1.9.4" }, "peerDependencies": { "whatwg-url": "7.1.0" diff --git a/packages/plugin-arthera/src/actions/transfer.ts b/packages/plugin-arthera/src/actions/transfer.ts index 807a2d6b7e..57b86c0e3d 100644 --- a/packages/plugin-arthera/src/actions/transfer.ts +++ b/packages/plugin-arthera/src/actions/transfer.ts @@ -92,10 +92,7 @@ const buildTransferDetails = async ( if (!existingChain) { throw new Error( - "The chain " + - transferDetails.fromChain + - " not configured yet. Add the chain or choose one from configured: " + - chains.toString() + `The chain ${transferDetails.fromChain} not configured yet. Add the chain or choose one from configured: ${chains.toString()}` ); } diff --git a/packages/plugin-arthera/src/providers/wallet.ts b/packages/plugin-arthera/src/providers/wallet.ts index 7d724fbf4a..e5daa7924a 100644 --- a/packages/plugin-arthera/src/providers/wallet.ts +++ b/packages/plugin-arthera/src/providers/wallet.ts @@ -111,9 +111,9 @@ export class WalletProvider { if (!chains) { return; } - Object.keys(chains).forEach((chain: string) => { + for (const chain of Object.keys(chains)) { this.chains[chain] = chains[chain]; - }); + } }; private setCurrentChain = (chain: SupportedChain) => { @@ -161,13 +161,13 @@ const genChainsFromRuntime = ( const chainNames = ["arthera"]; const chains = {}; - chainNames.forEach((chainName) => { + for (const chainName of chainNames) { const rpcUrl = runtime.getSetting( - "ETHEREUM_PROVIDER_" + chainName.toUpperCase() + `ETHEREUM_PROVIDER_${chainName.toUpperCase()}` ); const chain = WalletProvider.genChainFromName(chainName, rpcUrl); chains[chainName] = chain; - }); + } return chains; }; diff --git a/packages/plugin-asterai/biome.json b/packages/plugin-asterai/biome.json new file mode 100644 index 0000000000..818716a621 --- /dev/null +++ b/packages/plugin-asterai/biome.json @@ -0,0 +1,41 @@ +{ + "$schema": "https://biomejs.dev/schemas/1.5.3/schema.json", + "organizeImports": { + "enabled": false + }, + "linter": { + "enabled": true, + "rules": { + "recommended": true, + "correctness": { + "noUnusedVariables": "error" + }, + "suspicious": { + "noExplicitAny": "error" + }, + "style": { + "useConst": "error", + "useImportType": "off" + } + } + }, + "formatter": { + "enabled": true, + "indentStyle": "space", + "indentWidth": 4, + "lineWidth": 100 + }, + "javascript": { + "formatter": { + "quoteStyle": "single", + "trailingCommas": "es5" + } + }, + "files": { + "ignore": [ + "dist/**/*", + "extra/**/*", + "node_modules/**/*" + ] + } +} \ No newline at end of file diff --git a/packages/plugin-asterai/package.json b/packages/plugin-asterai/package.json index 9e8af0e1ab..d96043d3a6 100644 --- a/packages/plugin-asterai/package.json +++ b/packages/plugin-asterai/package.json @@ -33,14 +33,19 @@ "@types/elliptic": "6.4.18", "@types/uuid": "10.0.0", "tsup": "8.3.5", - "vitest": "^1.2.1" + "vitest": "^1.2.1", + "@biomejs/biome": "1.9.4" }, "scripts": { "lines": "find . \\( -name '*.cdc' -o -name '*.ts' \\) -not -path '*/node_modules/*' -not -path '*/tests/*' -not -path '*/deps/*' -not -path '*/dist/*' -not -path '*/imports*' | xargs wc -l", "build": "tsup --format esm --dts", "dev": "tsup --format esm --dts --watch", "test": "vitest run", - "test:watch": "vitest" + "test:watch": "vitest", + "lint": "biome lint .", + "lint:fix": "biome check --apply .", + "format": "biome format .", + "format:fix": "biome format --write ." }, "peerDependencies": { "whatwg-url": "7.1.0" diff --git a/packages/plugin-autonome/biome.json b/packages/plugin-autonome/biome.json new file mode 100644 index 0000000000..ec7d14c614 --- /dev/null +++ b/packages/plugin-autonome/biome.json @@ -0,0 +1,42 @@ +{ + "$schema": "https://biomejs.dev/schemas/1.5.3/schema.json", + "organizeImports": { + "enabled": false + }, + "linter": { + "enabled": true, + "rules": { + "recommended": true, + "correctness": { + "noUnusedVariables": "error" + }, + "suspicious": { + "noExplicitAny": "error" + }, + "style": { + "useConst": "error", + "useImportType": "off" + } + } + }, + "formatter": { + "enabled": true, + "indentStyle": "space", + "indentWidth": 4, + "lineWidth": 100 + }, + "javascript": { + "formatter": { + "quoteStyle": "single", + + "trailingCommas": "es5" + } + }, + "files": { + "ignore": [ + "dist/**/*", + "extra/**/*", + "node_modules/**/*" + ] + } +} \ No newline at end of file diff --git a/packages/plugin-autonome/package.json b/packages/plugin-autonome/package.json index ee318fd2a3..807768126f 100644 --- a/packages/plugin-autonome/package.json +++ b/packages/plugin-autonome/package.json @@ -12,14 +12,17 @@ "axios": "^1.7.9" }, "devDependencies": { - "vitest": "^2.1.8" + "@biomejs/biome": "1.9.4" }, "scripts": { "build": "tsup --format esm --dts", "dev": "tsup --format esm --dts --watch", "test": "vitest run", - "test:watch": "vitest watch", - "test:coverage": "vitest run --coverage" + + "lint": "biome lint .", + "lint:fix": "biome check --apply .", + "format": "biome format .", + "format:fix": "biome format --write ." }, "peerDependencies": { "form-data": "4.0.1", diff --git a/packages/plugin-autonome/src/actions/launchAgent.ts b/packages/plugin-autonome/src/actions/launchAgent.ts index 08e34ce6ba..241d258bda 100644 --- a/packages/plugin-autonome/src/actions/launchAgent.ts +++ b/packages/plugin-autonome/src/actions/launchAgent.ts @@ -18,9 +18,17 @@ export interface LaunchAgentContent extends Content { config: string; } -function isLaunchAgentContent(content: any): content is LaunchAgentContent { +// Rafactoring +function isLaunchAgentContent(content: unknown): content is LaunchAgentContent { elizaLogger.log("Content for launchAgent", content); - return typeof content.name === "string" && typeof content.config === "string"; + return ( + typeof content === "object" && + content !== null && + "name" in content && + "config" in content && + typeof (content as LaunchAgentContent).name === "string" && + typeof (content as LaunchAgentContent).config === "string" + ); } const launchTemplate = `Respond with a JSON markdown block containing only the extracted values. Use null for any values that cannot be determined. @@ -54,16 +62,18 @@ export default { callback?: HandlerCallback ): Promise => { elizaLogger.log("Starting LAUNCH_AGENT handler..."); - // Initialize or update state - if (!state) { - state = (await runtime.composeState(message)) as State; + + // Initialize or update state also in lanuchContext + let currentState = state; + if (!currentState) { + currentState = (await runtime.composeState(message)) as State; } else { - state = await runtime.updateRecentMessageState(state); + currentState = await runtime.updateRecentMessageState(currentState); } // Compose launch context const launchContext = composeContext({ - state, + state: currentState, template: launchTemplate, }); @@ -113,14 +123,12 @@ export default { try { const resp = await sendPostRequest(); - if (resp && resp.data && resp.data.app && resp.data.app.id) { + if (resp?.data?.app?.id) { elizaLogger.log( "Launching successful, please find your agent on" ); elizaLogger.log( - "https://dev.autonome.fun/autonome/" + - resp.data.app.id + - "/details" + `https://dev.autonome.fun/autonome/${resp.data.app.id}/details` ); } if (callback) { @@ -128,10 +136,7 @@ export default { text: `Successfully launch agent ${content.name}`, content: { success: true, - appId: - "https://dev.autonome.fun/autonome/" + - resp.data.app.id + - "/details", + appId: `https://dev.autonome.fun/autonome/${resp.data.app.id}/details`, }, }); } diff --git a/packages/plugin-autonome/src/index.ts b/packages/plugin-autonome/src/index.ts index 0173ecb127..e1a23ac24b 100644 --- a/packages/plugin-autonome/src/index.ts +++ b/packages/plugin-autonome/src/index.ts @@ -1,6 +1,7 @@ import type { Plugin } from "@elizaos/core"; import launchAgent from "./actions/launchAgent"; +// Action setup export const autonomePlugin: Plugin = { name: "autonome", description: "Autonome Plugin for Eliza", diff --git a/packages/plugin-icp/src/actions/createToken.ts b/packages/plugin-icp/src/actions/createToken.ts index bc927ec129..17b6619668 100644 --- a/packages/plugin-icp/src/actions/createToken.ts +++ b/packages/plugin-icp/src/actions/createToken.ts @@ -72,7 +72,7 @@ async function generateTokenLogo( height: 512, count: 1, }, - runtime as any + runtime ); if (result.success && result.data && result.data.length > 0) { @@ -96,7 +96,7 @@ export const executeCreateToken: Action = { ], description: "Create a new meme token on PickPump platform (Internet Computer). This action helps users create and launch tokens specifically on the PickPump platform.", - validate: async (runtime: IAgentRuntime, message: Memory) => { + validate: async (_runtime: IAgentRuntime, message: Memory) => { const keywords = [ "pickpump", "pp", @@ -137,14 +137,16 @@ export const executeCreateToken: Action = { type: "processing", }); - if (!state) { - state = (await runtime.composeState(message)) as State; + // Initialize or update state + let currentState = state; + if (!currentState) { + currentState = (await runtime.composeState(message)) as State; } else { - state = await runtime.updateRecentMessageState(state); + currentState = await runtime.updateRecentMessageState(currentState); } const createTokenContext = composeContext({ - state, + state: currentState, template: createTokenTemplate, }); @@ -200,9 +202,9 @@ export const executeCreateToken: Action = { type: "success", }; callback?.(responseMsg); - } catch (error: any) { + } catch (error: unknown) { const responseMsg = { - text: `Failed to create token: ${error.message}`, + text: `Failed to create token: ${error instanceof Error ? error.message : "Unknown error"}`, action: "CREATE_TOKEN", type: "error", }; diff --git a/packages/plugin-icp/src/providers/wallet.ts b/packages/plugin-icp/src/providers/wallet.ts index a3933561b5..030221378b 100644 --- a/packages/plugin-icp/src/providers/wallet.ts +++ b/packages/plugin-icp/src/providers/wallet.ts @@ -25,7 +25,11 @@ export class WalletProvider { if (privateKeyBytes.length !== 32) { throw new Error("Invalid private key length"); } - return Ed25519KeyIdentity.fromSecretKey(privateKeyBytes); + const arrayBuffer = privateKeyBytes.buffer.slice( + privateKeyBytes.byteOffset, + privateKeyBytes.byteOffset + privateKeyBytes.length + ); + return Ed25519KeyIdentity.fromSecretKey(arrayBuffer); } catch { throw new Error("Failed to create ICP identity"); } @@ -62,13 +66,23 @@ export class WalletProvider { }; } +// Add interface for the wallet provider return type +interface ICPWalletResponse { + wallet: WalletProvider | null; + identity: Ed25519KeyIdentity | null; + principal: string | null; + isAuthenticated: boolean; + createActor?: typeof WalletProvider.prototype.createActor; + error?: string; +} + // Add the new provider instance export const icpWalletProvider: Provider = { async get( runtime: IAgentRuntime, _message: Memory, _state?: State - ): Promise { + ): Promise { try { const privateKey = runtime.getSetting( "INTERNET_COMPUTER_PRIVATE_KEY" @@ -86,13 +100,13 @@ export const icpWalletProvider: Provider = { isAuthenticated: true, createActor: wallet.createActor, }; - } catch (error: any) { + } catch (error: unknown) { return { wallet: null, identity: null, principal: null, isAuthenticated: false, - error: error.message, + error: error instanceof Error ? error.message : "Unknown error", }; } }, diff --git a/packages/plugin-icp/src/utils/common/types/variant.ts b/packages/plugin-icp/src/utils/common/types/variant.ts index cb63399409..eb8fb2c5b5 100644 --- a/packages/plugin-icp/src/utils/common/types/variant.ts +++ b/packages/plugin-icp/src/utils/common/types/variant.ts @@ -18,7 +18,7 @@ type Variant6 = Record< // Unwrap and extract only the key export const unwrapVariantKey = ( - v: Record + v: Record ): T => { const keys = Object.keys(v); if (keys.length === 0) throw new Error("variant must has a key");