# ElizaOS Developer Update: July 15-22, 2025

## Core Framework

### EventTarget Migration
We've completed a significant migration from Node.js EventEmitter to Bun's native EventTarget API ([#5609](https://github.com/elizaos/eliza/pull/5609)). This improves runtime performance and compatibility while maintaining backward compatibility with existing code:

```typescript
// Old EventEmitter pattern:
class MyComponent extends EventEmitter {
  someMethod() {
    this.emit('event', data);
  }
}

// New EventTarget pattern:
class MyComponent extends EventTarget {
  someMethod() {
    this.dispatchEvent(new CustomEvent('event', { detail: data }));
  }
}
```

Several follow-up PRs ([#5611](https://github.com/elizaos/eliza/pull/5611), [#5612](https://github.com/elizaos/eliza/pull/5612), [#5613](https://github.com/elizaos/eliza/pull/5613), [#5614](https://github.com/elizaos/eliza/pull/5614)) improved type safety and ensured backward compatibility.

### Service Types System
A comprehensive system for service types and standardized interfaces has been implemented ([#5565](https://github.com/elizaos/eliza/pull/5565)), featuring a new `getServicesByType()` method. This allows plugins to depend on abstract services rather than specific implementations:

```typescript
// Before: Direct service reference
const browserService = runtime.services['plugin-browser.browserService'];

// After: Type-based lookup
const browserServices = getServicesByType<BrowserService>(runtime, 'browser');
```

### Enhanced Module Resolution
The ModuleLoader system received a major upgrade ([#5629](https://github.com/elizaos/eliza/pull/5629)), implementing consistent local-first guarantees for module resolution. This addresses critical issues where modules were inconsistently loaded from global vs. local paths.

## New Features

### Action Chaining
Action chaining is now supported ([#5436](https://github.com/elizaos/eliza/pull/5436)), enabling sequential execution of actions with managed state:

```typescript
// First action returns state data
async function firstAction(state: State): Promise<ActionResult> {
  return {
    success: true,
    data: { key: 'value' }
  };
}

// Second action can use the first action's returned data
async function secondAction(state: State): Promise<ActionResult> {
  // Access data from previous action
  const previousData = state.actionState.firstAction?.data;
  
  // Use callback to send message to user during action processing
  state.callback("Processing your request...");
  
  return {
    success: true,
    data: { completed: true }
  };
}
```

### Image Generation Action
A new `generateImageAction` has been added to the agent pipeline ([#5446](https://github.com/elizaos/eliza/pull/5446)), enabling agents to generate images based on conversational context using `ModelType.IMAGE`.

### Plugin Quick Starter Template
We've added a streamlined `plugin-quick-starter` template ([#5589](https://github.com/elizaos/eliza/pull/5589)) for backend-only plugins without frontend overhead:

```bash
elizaos create my-quick-plugin --type plugin-quick-starter
```

### Auto-Building for Start Command
The `elizaos start` command now automatically builds your project ([#5504](https://github.com/elizaos/eliza/pull/5504)), similar to how the `dev` command works.

## Bug Fixes

### Critical Plugin Loading Fix
Fixed a critical bug ([#5624](https://github.com/elizaos/eliza/pull/5624)) where plugin actions were not being loaded in the NPM-deployed version of the CLI. This issue only manifested in the published package, not during local development.

### JSON String Handling in SQL Base
Fixed JSON string handling in the SQL base adapter ([#5628](https://github.com/elizaos/eliza/pull/5628)), resolving an issue where raw objects were being incorrectly passed to the Postgres JSONB cast.

### Project Creation and Directory Structure
- Fixed incorrect inheritance of `.elizadb` directories in nested projects ([#5618](https://github.com/elizaos/eliza/pull/5618))
- Fixed database directory creation path in new projects ([#5633](https://github.com/elizaos/eliza/pull/5633))
- Improved directory display during project creation and cleanup on interruption ([#5321](https://github.com/elizaos/eliza/pull/5321))

### Windows-Specific Fixes
Several Windows-specific issues were addressed:
- Fixed plugin loading on Windows platforms ([#5416](https://github.com/elizaos/eliza/pull/5416), [#5437](https://github.com/elizaos/eliza/pull/5437))
- Improved path handling with normalized file paths

## API Changes

### BaseApiClient Enhancements
Fixed the BaseApiClient to properly handle unwrapped server responses ([#5343](https://github.com/elizaos/eliza/pull/5343)), ensuring compatibility with server routes like `/api/server/health`.

### Action Result Interface
The ActionResult interface has been standardized across the codebase to improve developer experience and ensure consistent error handling:

```typescript
interface ActionResult {
  success: boolean;
  data?: any;
  error?: string;
}
```

## Social Media Integrations

### Twitter Plugin Updates
Added default post examples to the default Eliza character configuration ([#5652](https://github.com/elizaos/eliza/pull/5652)) to support Twitter posting functionality. The Twitter plugin documentation has also been updated to provide clearer setup instructions.

Current issues with the Twitter plugin are being addressed:
- "Failed to fetch Home timeline" errors ([#38](https://github.com/elizaos/eliza/issues/38))
- Client initialization errors ([#31](https://github.com/elizaos/eliza/issues/31))
- SQL database insertion errors ([#39](https://github.com/elizaos/eliza/issues/39))

## Model Provider Updates

### Ollama Integration
Work is in progress on implementing Ollama integration for the plugin-knowledge component. The implementation partially works but has some unresolved issues with the knowledge tab loading process. A GitHub branch has been created to implement this functionality: https://github.com/david-dina/plugin-knowledge/tree/feat/add-ollama.

### Model Selection Logic Improvements
The model selection logic has been refined to make the Ollama plugin truly conditional based on configuration ([#5594](https://github.com/elizaos/eliza/pull/5594)), rather than including it as a universal fallback.

## Breaking Changes

### Character V1 to V2 Migration
A new automatic V1 to V2 character conversion during JSON import has been implemented ([#5536](https://github.com/elizaos/eliza/pull/5536)), providing seamless backward compatibility. The conversion includes:

- Detection of V1 character format
- Transformation to V2 schema
- Plugin mapping for legacy plugins 
- Preservation of essential configuration

```typescript
// Example usage in components
import { useConvertCharacter } from '../hooks/use-character-convert';

// During import
const { convert } = useConvertCharacter();
const v2Character = convert(importedCharacter);
```

### Prompt Format Standardization
We've completed a comprehensive migration from JSON to XML prompts across the codebase ([#5623](https://github.com/elizaos/eliza/pull/5623)), significantly improving LLM response reliability. Developers should update any custom prompts to use the new XML format.