# ElizaOS Developer Update (Week of 2025-12-21 → 2025-12-27)

## 1) Core Framework

### Real-time transport: true SSE (server) and streaming plumbing
Core work this week continued the shift from polling-style updates to **true Server-Sent Events (SSE)** for real-time messaging/updates ([#5930](https://github.com/elizaOS/eliza/issues/5930)). This is foundational for low-latency chat UX, token-by-token model streaming, and consistent multi-client synchronization.

### Typed custom events in the agent runtime
Core runtime now supports **generic typing for custom event handlers**, making plugin-defined event payloads type-safe end-to-end ([#6277](https://github.com/elizaOS/eliza/pull/6277)).

```ts
import type { EventPayload } from "@elizaos/core";

interface MyCustomPayload extends EventPayload {
  roomId: string;
  score: number;
}

runtime.registerEvent<MyCustomPayload>("my:custom", async (payload) => {
  // payload.score is strongly typed
});
```

### Unified API foundation (serverless/node)
A “Unified API” foundation landed for serverless/nodejs usage patterns ([#6201](https://github.com/elizaOS/eliza/pull/6201)). If you maintain wrappers around `@elizaos/core`, review the updated `packages/core/src/elizaos.ts` and types to ensure compatibility with your runtime bootstrap code.

### Ongoing standardization: `handleMessage` across plugins
Discord discussions confirmed active work to **standardize `Elizaos.handleMessage` / message handling across plugins** (Discord: 2025-12-23/24). This aligns with earlier migrations away from legacy event emission (`MESSAGE_RECEIVED`) toward `messageService.handleMessage()` (see “Breaking Changes” below).

---

## 2) New Features

### Streaming text generation (core + client)
Streaming support for text generation was significantly expanded across core, server, CLI test runner, and client surfaces ([#6212](https://github.com/elizaOS/eliza/pull/6212)). This complements provider-level streaming work (e.g., OpenAI plugin) and the SSE transport changes.

**Developer impact:** you can now opt into streaming at the model request level (exact call sites vary by provider), and the client UI has improved incremental rendering paths.

```ts
// Pseudocode: use your provider’s generate call with stream enabled
const res = await runtime.model.generateText({
  prompt,
  stream: true,          // opt-in streaming
  onToken: (t) => {
    process.stdout.write(t);
  }
});
```

> Note: If you’re building custom UIs, confirm whether you should listen to SSE events or Socket.IO stream events depending on your deployment mode and server config.

### Eliza Cloud beta: developer-facing capabilities and constraints
Discord confirmed **Eliza Cloud entered beta** and is onboarding ecosystem builders for production feedback (Discord: 2025-12-23). Two developer-relevant platform constraints/features were clarified (Discord: 2025-12-24):

- **Knowledge/file uploads limited to 50MB** (current limit)
- **Markdown recommended** as the preferred upload format (most types still supported)
- **Custom model hosting is not available yet**, but is explicitly on the roadmap for “next week” (pending implementation)

If your agents rely on large corpora, plan to chunk data and/or use retrieval workflows rather than pushing raw context into prompts.

### Bun-native frontend exploration (R&D)
Core-devs discussed a **pure Bun frontend using Elysia workers + workerd** (Cloudflare-style) for a fully serverless app that builds faster than Next.js (Discord: 2025-12-24). No merged PRs were referenced yet, but this signals possible future build/deploy pathway changes for the web client.

---

## 3) Bug Fixes (Critical / Developer-impacting)

### SQL plugin: auto-create PGLite directories + API migration
A key fix modernized the SQL plugin and examples by:
- migrating from deprecated events to `messageService.handleMessage()`
- **auto-creating required PGLite directories** (removes a common “missing .eliza” crash footgun)
([#6202](https://github.com/elizaOS/eliza/pull/6202))

This directly addresses the recurring setup failure pattern where users had to manually create `.eliza/` before initializing the runtime.

### Message format/init sequencing fix for bootstrap + starters
A bootstrap/starter fix exposed `initPromise` so plugins can reliably await initialization and updated message format expectations ([#6261](https://github.com/elizaOS/eliza/pull/6261)). If you maintain plugins that assume pre-init availability of services, ensure you now await runtime init appropriately.

### Known newly-reported regressions to track
Four issues were opened Dec 24–25 with immediate developer relevance:

- **Conversation duplication across agents**: conversations from one agent appear in another agent’s history ([#6282](https://github.com/elizaOS/eliza/issues/6282))  
  *Likely impact:* room/agent scoping bug in session/conversation queries or client cache keying.
- **Open most recent conversation by default** when entering an agent chat ([#6281](https://github.com/elizaOS/eliza/issues/6281))  
  *Likely impact:* session selection logic; improves UX consistency for multi-room agents.
- **Numbered-list spacing formatting issues** ([#6283](https://github.com/elizaOS/eliza/issues/6283))
- **Outdated monorepo documentation** ([#6284](https://github.com/elizaOS/eliza/issues/6284))  
  Discord confirms doc updates are actively in progress (Stan, 2025-12-24).

---

## 4) API Changes (What to update in your code)

### Message handling: move to `messageService.handleMessage()`
Multiple changes this month/week converge on one direction: **plugins and examples should use the messageService API** rather than legacy event-based message ingestion. The SQL plugin + examples update is the canonical reference ([#6202](https://github.com/elizaOS/eliza/pull/6202)).

```ts
// New pattern (representative)
await runtime.messageService.handleMessage({
  roomId,
  senderId,
  text,
  // ...provider-specific metadata
});
```

If you still emit/subscribe to `MESSAGE_RECEIVED`, expect increasing friction as plugins align to the standardized message pipeline.

### Typed custom events
If your plugin defines custom events, adopt the generic payload typing added in core ([#6277](https://github.com/elizaOS/eliza/pull/6277)) to avoid `any` payload drift.

---

## 5) Social Media Integrations

### Discord plugin
The Discord plugin received major refactors and stability improvements earlier in the week (referenced in the weekly summary), including message handling overhaul and TypeScript fixes:
- Message handling overhaul: [elizaos-plugins/plugin-discord#32](https://github.com/elizaos-plugins/plugin-discord/pull/32)
- TypeScript/build fixes: [elizaos-plugins/plugin-discord#38](https://github.com/elizaos-plugins/plugin-discord/pull/38)

Discord discussions this week confirmed “Discord plugin fixes have been implemented” (Discord: 2025-12-23) and ongoing work to standardize handling across plugins.

### Twitter plugin
A reliability fix was merged to ensure posting enablement changes apply immediately:
- [elizaos-plugins/plugin-twitter#42](https://github.com/elizaos-plugins/plugin-twitter/pull/42)

### Telegram plugin
Unified messaging API refactor is in progress:
- [elizaos-plugins/plugin-telegram#22](https://github.com/elizaos-plugins/plugin-telegram/pull/22)

### Farcaster
Registry now includes a self-hosted Farcaster integration (local hub) to reduce third-party dependency:
- [elizaos-plugins/registry#243](https://github.com/elizaos-plugins/registry/pull/243)

---

## 6) Model Provider Updates

### OpenAI plugin: streaming support
Provider-level streaming support was added in the OpenAI plugin (awaiting integration alignment depending on your dependency pin):
- [elizaos-plugins/plugin-openai#21](https://github.com/elizaos-plugins/plugin-openai/pull/21)

### Anthropic + OpenRouter: streaming initiatives
Streaming efforts are also underway across:
- Anthropic streaming PR: [elizaos-plugins/plugin-anthropic#12](https://github.com/elizaos-plugins/plugin-anthropic/pull/12)
- OpenRouter streaming PR: [elizaos-plugins/plugin-openrouter#21](https://github.com/elizaos-plugins/plugin-openrouter/pull/21)
- OpenRouter version bump merged: [elizaos-plugins/plugin-openrouter#22](https://github.com/elizaos-plugins/plugin-openrouter/pull/22)

### CI note: Claude billing affecting GitHub Actions
A GitHub Actions job failure was attributed to **Claude billing needing a top-up** (Discord: 2025-12-24). If you rely on AI-assisted CI steps (doc generation, summaries, etc.), expect transient CI failures until billing is restored.

---

## 7) Breaking Changes / V1 → V2 Migration Warnings

### ⚠️ Message ingestion breaking change (legacy events → messageService)
If your V1 plugin or custom runtime code depends on `MESSAGE_RECEIVED` or other legacy message bus events, you should migrate to:

- `runtime.messageService.handleMessage()` (canonical path)
- standardized message payload shape (see [#6202](https://github.com/elizaOS/eliza/pull/6202) and [#6261](https://github.com/elizaOS/eliza/pull/6261))

**Symptoms of not migrating:**
- agents not responding (message never enters the standardized pipeline)
- mismatched message metadata (e.g., missing/renamed server/message server identifiers)
- flaky init ordering when plugins assume services exist before runtime init completes

### ⚠️ Initialization sequencing: rely on `initPromise` where appropriate
With `initPromise` exposure/fixes ([#6261](https://github.com/elizaOS/eliza/pull/6261)), plugins that previously “worked by accident” during startup may now require explicit awaits to avoid race conditions.

### ⚠️ SQL storage bootstrapping expectations changed (PGLite dirs)
Manual creation of `.eliza` for PGLite-backed setups should no longer be required after [#6202](https://github.com/elizaOS/eliza/pull/6202). If you carry local patches/workarounds, remove them to avoid conflicting directory logic.

---

## Links & References (this week)
- Core repo issues opened: [#6281](https://github.com/elizaOS/eliza/issues/6281), [#6282](https://github.com/elizaOS/eliza/issues/6282), [#6283](https://github.com/elizaOS/eliza/issues/6283), [#6284](https://github.com/elizaOS/eliza/issues/6284)
- Core PRs referenced: [#6212](https://github.com/elizaOS/eliza/pull/6212), [#6277](https://github.com/elizaOS/eliza/pull/6277), [#6202](https://github.com/elizaOS/eliza/pull/6202), [#6261](https://github.com/elizaOS/eliza/pull/6261), [#6201](https://github.com/elizaOS/eliza/pull/6201)
- Discord source channels (context):  
  - https://discord.com/channels/1253563208833433701/1253563209462448241  
  - https://discord.com/channels/1253563208833433701/1300025221834739744  
  - https://discord.com/channels/1253563208833433701/1377726087789940836