# ElizaOS Developer Update - July 20, 2025

## Core Framework
The ElizaOS team has made substantial architectural improvements to the core framework this week:
- Migrated from Node.js EventEmitter to Bun's native EventTarget API for improved performance and runtime compatibility with full backward compatibility ([#5609](https://github.com/elizaos/eliza/pull/5609), [#5614](https://github.com/elizaos/eliza/pull/5614))
- Introduced standardized service types and interfaces with a new `getServicesByType()` method, enabling plugins to depend on abstract services rather than specific implementations ([#5565](https://github.com/elizaos/eliza/pull/5565))
- Enhanced ModuleLoader with local-first guarantees to ensure consistent module resolution across different environments ([#5629](https://github.com/elizaos/eliza/pull/5629))
- Created a new unified `@elizaos/config` package to centralize configurations for eslint, tsconfig, and prettier across all packages ([#5508](https://github.com/elizaos/eliza/pull/5508))

## New Features
### Action Chaining
Added a powerful action chaining system that allows sequential execution of actions with managed state ([#5436](https://github.com/elizaos/eliza/pull/5436)):
```typescript
// Example of action chaining
const actions = [
  {
    name: "fetchData",
    execute: async (state) => {
      const data = await api.getData();
      return { ...state, data };
    }
  },
  {
    name: "processData",
    execute: async (state) => {
      const processed = transform(state.data);
      return { ...state, processed };
    }
  }
];

// State is passed from one action to the next
const result = await runtime.executeActionChain(actions, initialState);
```

### Scenario Runner
Started implementation of a new "Scenario Runner" feature for agent evaluation via YAML-defined scenarios ([#5573](https://github.com/elizaos/eliza/issues/5573) - [#5579](https://github.com/elizaos/eliza/issues/5579)), allowing developers to define test cases like:

```yaml
name: Basic Conversation Flow
setup:
  agent: customer-support
  environment:
    PRODUCT_DB: test-products.json
steps:
  - user: "Hello, I need help with my order #12345"
    expect:
      intent: ORDER_INQUIRY
      actions: [FETCH_ORDER, REPLY]
  - user: "When will it be delivered?"
    expect:
      entities: [DELIVERY_DATE]
      response: /Your order will be delivered on/
```

### Backend-Only Plugin Template
Added a new `plugin-quick-starter` template for streamlined backend-only plugin development ([#5589](https://github.com/elizaos/eliza/pull/5589)), reducing boilerplate for developers creating utility plugins without UI components.

## Bug Fixes

### CLI Stability
- Fixed critical issues in the `elizaos create` command to prevent nested projects incorrectly inheriting `.elizadb` directories from parent projects ([#5618](https://github.com/elizaos/eliza/pull/5618))
- Resolved plugin actions not loading in NPM-deployed CLI versions, restoring core functionality for published packages ([#5624](https://github.com/elizaos/eliza/pull/5624))
- Fixed auto-installation of AI model plugins during project creation ([#5335](https://github.com/elizaos/eliza/pull/5335))
- Improved graceful shutdown for the dev server on Cmd+C (SIGINT/SIGTERM) ([#5562](https://github.com/elizaos/eliza/pull/5562))

### WebSocket API
A user named maikyman reported issues with WebSocket implementation in the tech-support channel:
> "Docs seem to differ from implementation. I expected createChannel() to take different parameters."

The issue was resolved by encouraging the user to examine source code for message submission, event listening, and message flow in the GitHub repository. This highlights a documentation gap that should be addressed.

## API Changes

### ModuleLoader Refactoring
Enhanced ModuleLoader system ([#5629](https://github.com/elizaos/eliza/pull/5629)) changes how modules are loaded:

```typescript
// Old: Import directly from path
const module = require(absolutePath);

// New: Use ModuleLoader for consistent resolution
const module = await ModuleLoader.load({
  packageName: '@elizaos/plugin-name',
  fallbackPaths: [localPath, nodePath]
});
```

### Action Results
The ActionResult interface was refined to provide better type safety ([#5593](https://github.com/elizaos/eliza/pull/5593)):

```typescript
// Previous (duplicate definition)
interface ActionResult {
  success: boolean;
  data?: any;
  error?: Error;
}

// New (unified definition)
interface ActionResult<T = unknown> {
  success: boolean;
  data?: T;
  error?: Error;
  message?: string;
}
```

## Social Media Integrations

### Twitter Plugin Issues
Users reported several persistent issues with the Twitter plugin:
- "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))

These issues are being prioritized as they represent a significant pain point for users of the Twitter integration.

### Twitter Account Status
The ElizaOS team's X (Twitter) accounts remain suspended, but Kenk reported that discussions with X are "moving in the right direction" with an encouraging reply received this week. The team is adapting their strategy to be less reliant on X while working to restore the account.

## Model Provider Updates

### Ollama Integration
A user named starlord has created a GitHub branch to implement Ollama integration for the plugin-knowledge component: https://github.com/david-dina/plugin-knowledge/tree/feat/add-ollama

The implementation partially works but has a couple of unresolved issues:
1. The knowledge tab never completes loading despite documents loading successfully
2. It's unclear if the agent properly uses the related actions

The ElizaOS team indicated that official Ollama integration is coming soon to the plugin-knowledge component.

### Model Selection Logic Improvements
- Made the Ollama plugin conditional based on `OLLAMA_API_ENDPOINT` environment variable ([#5594](https://github.com/elizaos/eliza/pull/5594))
- Updated character.convert to map the legacy "llama_local" provider in v1 to "@elizaos/plugin-ollama" ([#5582](https://github.com/elizaos/eliza/pull/5582))
- Refined prompts to reduce unnecessary provider use and improve reply speed ([#5526](https://github.com/elizaos/eliza/pull/5526))

## Breaking Changes

### V1 to V2 Migration
Added automatic V1 → V2 character conversion during JSON import for seamless backward compatibility ([#5536](https://github.com/elizaos/eliza/pull/5536)). This addresses potential plugin matching issues when importing legacy character configurations:

```typescript
// Example conversion usage
import { convertCharacterToV2 } from '@elizaos/core';

// When importing a character
const importCharacter = (jsonData) => {
  const character = JSON.parse(jsonData);
  const convertedCharacter = isV1Character(character) 
    ? convertCharacterToV2(character) 
    : character;
  return convertedCharacter;
};
```

### EventEmitter to EventTarget Migration
The migration from EventEmitter to EventTarget ([#5609](https://github.com/elizaos/eliza/pull/5609)) is mostly backward compatible, but custom plugins that extend these classes need to adapt their implementations:

```typescript
// Old (EventEmitter)
class MyService extends EventEmitter {
  constructor() {
    super();
    this.on('event', this.handleEvent);
  }
}

// New (EventTarget)
class MyService extends EventTarget {
  constructor() {
    super();
    this.addEventListener('event', this.handleEvent);
  }
}
```

Custom event listeners in plugins should be updated to use the EventTarget pattern for full compatibility with the latest version.