# ElizaOS Developer Update (2025-12-22 → 2025-12-28)

This week was relatively quiet on GitHub (Dec 27–28 had **0 merged PRs / 0 new issues**), but it capped off a major set of framework and plugin improvements that landed earlier in the week—especially around **streaming**, **SSE**, **typed events**, and **message handling modernization**. Discord discussions also surfaced a few actionable runtime/Cloud bugs (agent naming, deploy/ECR credentials, streaming UI parity).

---

## 1) Core Framework

### Streaming end-to-end plumbing (core/runtime/server/client)
Core streaming support was expanded and wired through multiple layers (runtime types, streaming context utilities, server response handlers, client chat rendering). See:
- Core streaming enhancement: **PR #6212** (multi-package changes)  
  https://github.com/elizaos/eliza/pull/6212

Key implications for framework developers:
- New/expanded streaming primitives in `@elizaos/core` (`types/streaming`, `StreamingContext`, helpers in `utils/streaming`).
- Server messaging endpoints updated to emit progressive tokens/events (aligning with earlier shift to “true SSE” rather than polling; see **Issue #5930**).  
  https://github.com/elizaos/eliza/issues/5930

### Typed custom events for plugins
Core now supports generic typing for custom event payloads via `registerEvent`, making plugin event contracts type-safe:
- **PR #6277**: “add generic type support for custom event handlers”  
  https://github.com/elizaos/eliza/pull/6277

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

interface AgentProgressPayload extends EventPayload {
  stepId: string;
  status: "started" | "token" | "completed" | "error";
  token?: string;
}

runtime.registerEvent<AgentProgressPayload>("agent.progress", (payload) => {
  if (payload.status === "token") process.stdout.write(payload.token ?? "");
});
```

### Unified API surface (serverless/node)
A unified API abstraction for serverless Node.js usage landed:
- **PR #6201**: “Unified API - serverless - nodejs”  
  https://github.com/elizaos/eliza/pull/6201

This helps standardize message sending/handling across environments (important if you run agents in serverless or edge-like deployments).

### Message handling modernization (deprecation pressure)
The ecosystem continues migrating away from legacy event-based message ingestion (`MESSAGE_RECEIVED`) toward the `messageService` API:
- **PR #6202**: plugin-sql migration + examples updated to `messageService.handleMessage()`  
  https://github.com/elizaos/eliza/pull/6202

If you maintain plugins/examples, treat the old event pathway as **deprecated** and plan to move now (see **Breaking Changes** section).

---

## 2) New Features

### ElizaOS Cloud becomes the default CLI provider (DX + onboarding)
The CLI now recommends ElizaOS Cloud as the first/default AI provider, including browser-based login and key provisioning:
- **PR #6208**: “Add ElizaOS Cloud as Default AI Provider in CLI”  
  https://github.com/elizaos/eliza/pull/6208

CLI behavior highlights:
- `elizaos create` flow prioritizes Cloud provider selection.
- Login flow opens browser to authenticate and configure API key automatically.

Example CLI flow:
```bash
bunx elizaos create my-agent
bunx elizaos login
bunx elizaos dev
```

### Streaming text generation (developer-facing)
With core streaming upgrades (PR #6212), clients can render incremental outputs. If your plugin/provider supports streaming, you should pass `stream: true` (exact option name may vary by provider wrapper, but core now exposes the necessary types and streaming context).

Illustrative usage pattern:
```ts
const result = await runtime.model.generateText({
  prompt,
  stream: true,
  onToken(token) {
    runtime.emit("agent.progress", {
      stepId: "reply",
      status: "token",
      token,
    });
  },
});
```

### Roadmap architecture signal: “jeju” distributed cloud + distributed SQLite
From `#core-devs` Discord: Shaw outlined an ambitious “**jeju**” distributed cloud platform intended to run “eliza cloud” on top of a fully distributed stack (Vercel AI SDK compatible, K8s+Helm, S3, Redis/Upstash, serverless SQLite), leveraging **TEE** and a distributed KMS (lit-protocol-like key sharding + proof-of-cloud). This is not merged code yet, but it’s a major architectural direction that will likely shape future runtime assumptions (identity, storage, multi-tenant auth, verifiable execution).

---

## 3) Bug Fixes (Critical / High-impact)

### SQL plugin: auto-create local directories + migration correctness
Two important stability fixes landed:
- **PR #6202**: auto-create PGLite directories + migrate examples to new message service API  
  https://github.com/elizaos/eliza/pull/6202
- **PR #6215**: optimized pre-1.6.5 migrations, improved RLS handling, schema organization + extensive tests  
  https://github.com/elizaos/eliza/pull/6215

Practical impact:
- Less foot-gun around missing `.eliza` / pglite directories (previously caused crashes unless users manually created dirs).
- Safer upgrades from older schema versions; improved multi-tenant/data-isolation groundwork via RLS test coverage.

### Agent responsiveness regression (MessageBusService)
Earlier in the week, a critical runtime defect that prevented agents from responding (MessageBusService error) was resolved:
- **Issue #6140** (closed)  
  https://github.com/elizaos/eliza/issues/6140

### Discord-reported: agent naming edge cases (needs fix)
From `#coders` Discord: creating agents with names like `"null"` or numeric strings (`"1"`, `"69"`, `"666"`) causes save failures or client-side exceptions, while symbols like `"$"` work. This strongly suggests an input validation + serialization/pathing bug (e.g., name → slug → route param or DB constraint collision).
- Action item: add server-side validation and canonicalization; ensure UI uses agent **id** as primary key in routes, not name.

### Discord-reported: `elizaos deploy` ECR credentials / repo not found
Also from `#coders`: deployments failing with ECR credential/repository resolution errors.
- Action item: improve AWS/ECR preflight checks in CLI deploy command; emit actionable hints (region/account mismatch, missing repository, expired token).

---

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

### Message ingestion: prefer `messageService.handleMessage()` over legacy events
The migration in **PR #6202** updates examples and plugin-sql to the new API. If your integration still relies on `MESSAGE_RECEIVED`, you should move to the message service interface.

Before (legacy pattern, increasingly brittle):
```ts
runtime.on("MESSAGE_RECEIVED", (msg) => { /* ... */ });
```

After (recommended):
```ts
await runtime.messageService.handleMessage({
  roomId,
  entityId,
  text,
  // attachments, metadata...
});
```

### Custom events now support typed payloads
If you created custom events previously, you can now strongly type them via generics:
- **PR #6277**  
  https://github.com/elizaos/eliza/pull/6277

### SSE / streaming response handlers
Server-side real-time behavior continues converging on true SSE patterns (vs polling). If you have custom clients, ensure they correctly handle incremental server events and don’t assume a single JSON response payload. Track:
- **Issue #5930**  
  https://github.com/elizaos/eliza/issues/5930

---

## 5) Social Media Integrations (Twitter / Telegram / Discord / Farcaster)

### Twitter plugin reliability
- **plugin-twitter PR #42**: fixes immediate application of posting enablement settings  
  https://github.com/elizaos-plugins/plugin-twitter/pull/42
- New issues opened to improve conversation UX (recent conversation default, duplication bugs):  
  https://github.com/elizaos-plugins/plugin-twitter/issues/6281  
  https://github.com/elizaos-plugins/plugin-twitter/issues/6282

### Discord plugin refactors + type safety
Large refactors and TS fixes improved stability and message handling:
- **plugin-discord PR #38** (TS errors + refactor)  
  https://github.com/elizaos-plugins/plugin-discord/pull/38
- **plugin-discord PR #32** (message handling overhaul)  
  https://github.com/elizaos-plugins/plugin-discord/pull/32
- Proposed multi-bot voice architecture (forward-looking):  
  https://github.com/elizaos-plugins/plugin-discord/pull/36

### Telegram messaging API alignment
Telegram plugin began aligning to the unified messaging API:
- **plugin-telegram PR #22**  
  https://github.com/elizaos-plugins/plugin-telegram/pull/22

### Farcaster (self-hosted)
Registry includes a self-hosted Farcaster hub plugin (for more autonomy, fewer third-party dependencies):
- **registry PR #243**  
  https://github.com/elizaos-plugins/registry/pull/243

---

## 6) Model Provider Updates (OpenAI / Anthropic / OpenRouter / others)

### OpenAI: streaming support in provider plugin
Provider-side streaming landed in the OpenAI plugin and is expected to pair with core streaming infrastructure:
- **plugin-openai PR #21**: streaming support  
  https://github.com/elizaos-plugins/plugin-openai/pull/21

Discord also noted a “streaming broken due to wrong dependencies” period earlier; if you hit regressions, verify your provider plugin versions match the core streaming APIs you’re compiling against.

### Anthropic + OpenRouter streaming work in progress
Streaming work was initiated across multiple providers to standardize the behavior:
- **plugin-anthropic PR #12**  
  https://github.com/elizaos-plugins/plugin-anthropic/pull/12
- **plugin-openrouter PR #21**  
  https://github.com/elizaos-plugins/plugin-openrouter/pull/21

---

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

### ⚠️ Message API migration is effectively mandatory
If your code depends on:
- `MESSAGE_RECEIVED` events
- legacy message formats that included `serverId` (or other deprecated fields)

…you should migrate now. Related fix that indicates format drift:
- **PR #6261**: bootstrap format change fix + `initPromise` exposure  
  https://github.com/elizaos/eliza/pull/6261

Recommended approach:
- Treat `messageService.handleMessage()` as the canonical ingestion point.
- Treat stable identifiers (`agentId`, `roomId`, `entityId`) as primary keys; avoid routing/DB operations keyed solely by mutable display names.

### ⚠️ Dependency alignment matters (streaming + drizzle)
There was an ecosystem-wide dependency bump to resolve `drizzle-orm` conflicts and tooling issues:
- **PR #6210**  
  https://github.com/elizaos/eliza/pull/6210

If you maintain external packages that peer-depend on drizzle or core types, re-check lockfiles and ensure compatible versions.

### Bun is still required for supported workflows
Discord reiterated that npm is not the supported path right now; ensure contributors use bun for consistent tooling (`bun.lock`, scripts, CI parity).

---

### References / Pointers
- Core repo: https://github.com/elizaos/eliza
- Docs location change (“Where did packages/docs/ go?”): **Issue #6122**  
  https://github.com/elizaos/eliza/issues/6122
- Open token snapshot/migration support issue (Tangem wallet / eligibility): **Issue #6211**  
  https://github.com/elizaos/eliza/issues/6211