# ElizaOS Developer Update (2026-01-04 → 2026-01-10)

This week focused on (1) unifying messaging/client abstractions across transports, (2) stabilizing SQL + bootstrap compatibility after the `serverId → messageServerId` migration, and (3) improving developer ergonomics (backend hot reload) while several V2.0.0 efforts ramp up.

---

## 1) Core Framework

### Unified multi-transport messaging + client hooks
Core now exposes a consistent chat interface across HTTP (sync), SSE (streaming), and WebSocket (async via Socket.IO), while removing a long-standing double/triple-processing path in the Messaging API.

- **PR:** `feat: unified hooks with multi-transport support (HTTP/SSE/WebSocket)` — https://github.com/elizaos/eliza/pull/6300  
  Key technical notes:
  - Server endpoints now use `transport` (preferred) instead of `mode` (deprecated but still accepted via legacy mapping).
  - The server now separates **DB persistence** from **bus emission** to avoid duplicate agent processing.
  - Client gains `useElizaChat` + transport-specific hooks, plus lifecycle callbacks.

**Example (client): unified chat hook**
```ts
import { useElizaChat } from "@elizaos/client";

export function ChatView({ agentId }: { agentId: string }) {
  const { messages, sendMessage, loading, error } = useElizaChat({
    agentId,
    transport: "sse", // "http" | "sse" | "websocket"
    onMessageAdded: (m) => console.debug("new message", m.id),
    onError: (e) => console.error("chat error", e),
  });

  return (
    <>
      {error && <pre>{String(error)}</pre>}
      <button
        disabled={loading}
        onClick={() => sendMessage({ content: "Hello from SSE" })}
      >
        Send
      </button>
      <pre>{JSON.stringify(messages, null, 2)}</pre>
    </>
  );
}
```

### Backend hot reload for local development
The dev runner now watches backend TypeScript sources across CLI/core/server/api-client/bootstrap/sql/config packages, rebuilds, restarts, and validates health.

- **PR:** `fix: Enable hot reload for backend development` — https://github.com/elizaos/eliza/pull/6293

**Usage**
```bash
bun run dev
# edit files in packages/{cli,core,server,api-client,plugin-bootstrap,plugin-sql,config}/src
# server rebuilds + restarts automatically and checks /api/server/ping
```

### Early V2.0.0 “runtime-first” branch lands as a large working PR
A major refactor is in flight to remove “non-essentials” (app/server/CLI/projects) and focus on a Claude-friendly runtime with consistent abstractions (discussed heavily in core-devs).

- **PR (WIP):** `V2.0.0` — https://github.com/elizaos/eliza/pull/6351  
- **Discord context:** Eliza 2.0 redesign proposal (TS/Rust/Python parity + FFI plugin interop; runtime-first documentation).

---

## 2) New Features

### plugin-sql: Neon serverless support + tighter RLS posture
- **PR:** `feat(plugin-sql): add Neon serverless support & improve RLS security` — https://github.com/elizaos/eliza/pull/6343  
Highlights:
- Adds a Neon adapter/manager targeting serverless Postgres.
- Improves RLS logic and test coverage to prevent cross-tenant leakage under `ENABLE_DATA_ISOLATION=true`.

**Example (conceptual): selecting Neon in SQL plugin configuration**
```ts
import { sqlPlugin } from "@elizaos/plugin-sql";

// Pseudocode: exact config keys may vary by your runtime wrapper
const plugin = sqlPlugin({
  adapter: "neon",
  connectionString: process.env.NEON_DATABASE_URL,
  dataIsolation: process.env.ENABLE_DATA_ISOLATION === "true",
});
```

### plugin-twitter: OAuth2 PKCE authentication (plus backward compatible 3-legged flows)
- **Repo update:** plugin-twitter implemented OAuth2 PKCE and preserved backward compatibility for “approve / 3-legged login” flows.  
  (See daily summary notes for 2026-01-09: https://elizaos.github.io/api/summaries/overall/day/2026-01-09.json)

**Developer impact**
- PKCE reduces risk for public clients and improves security posture vs. implicit/legacy flows.
- Expect additional docs to clarify required X/Twitter API tiers (community asked this explicitly; still unanswered on Discord).

### New registry entry: plugin-aimo-router
- Added to the registry this week (from daily summary notes; link not provided in aggregated data).  
Use case: routing/dispatch patterns for multi-agent or multi-skill selection. Expect follow-up docs/README once stabilized.

---

## 3) Bug Fixes (Critical)

### Bootstrap ↔ Discord compatibility: `serverId → messageServerId` migration completion
Users on core **v1.7.0** hit errors like `"No server ID found 10"` due to incomplete migration in bootstrap actions/providers (and interaction with plugin-discord v1.3.3). The fix makes bootstrap consistently consume `messageServerId` from room/world context, eliminating reliance on deprecated `serverId` paths.

- **PR:** `fix: plugin-bootstrap (+ sql minor) actions/providers for serverId => messageServerId change` — https://github.com/elizaos/eliza/pull/6333  
Technical context:
- Updated bootstrap actions/providers logging + validation to use `room.messageServerId`.
- Updated related fixtures/tests to ensure the new ID propagates across event lifecycle and shouldRespond logic.

**Operational guidance (from Discord triage)**
- If you’re blocked on v1.7.0 + Discord, you could temporarily downgrade to **v1.6.5** while awaiting your plugin version alignment, or consume a branch containing the fixes while testing.

### plugin-sql stability fixes (runtime crashes + pool safety)
Several fixes landed to address crashes and reliability issues in Postgres/PGLite adapters/managers.

- **PR:** `fix(plugin-sql): add pool config, error handler, and fix PGLite shutdown` — https://github.com/elizaos/eliza/pull/6323

### PGLite compatibility: avoid pgcrypto extension install
PGLite doesn’t support `pgcrypto`; attempting install generated warnings/noise and could confuse operators. The runtime migrator now skips it for PGLite/dev DBs.

- **PR:** `fix(plugin-sql): skip pgcrypto extension for PGLite` — https://github.com/elizaos/eliza/pull/6339

### RLS regression prevention in CI
To ensure the `$1` parameterization bug can’t regress silently, CI now runs with isolation enabled and tests use `withEntityContext()` consistently.

- **PR:** `test(plugin-sql): use withEntityContext in RLS tests + isolation in CI` — https://github.com/elizaos/eliza/pull/6330  
- **PR:** `fix(plugin-sql): use sql.raw() for SET LOCAL to avoid parameterization` — https://github.com/elizaos/eliza/pull/6316

### Cloud: TOCTOU/race-condition mitigation (design + rollout in progress)
Core-devs discussed cloud race fixes using a **deduct-before, reconcile-after** approach to eliminate TOCTOU windows in billing/credit style flows. Linear tickets were created; implementation details are tracked in internal workstreams (no PR link in provided data).

---

## 4) API Changes (Developer-facing)

### `mode` → `transport` on messaging endpoints (server)
- **PR:** https://github.com/elizaos/eliza/pull/6300  
`transport` values:
- `"http"`: synchronous request/response
- `"sse"`: streaming responses
- `"websocket"`: async via Socket.IO

Legacy `mode` is still accepted but **deprecated**.

**Example (HTTP request)**
```bash
curl -X POST "$ELIZA_BASE_URL/api/messaging/sessions/$SESSION_ID/messages?transport=sse" \
  -H "content-type: application/json" \
  -d '{"content":"stream this"}'
```

### Provider-qualified model names required in Cloud/hosted API calls
When using agent IDs + API endpoints in Eliza Cloud, “Model not found” errors were resolved by providing provider-prefixed model IDs:

- `openai/gpt-4o-mini`
- `anthropic/claude-sonnet-4.5`
- `google/gemini-2.5-flash`

(From Discord support; see 2026-01-07 notes.)

**Example**
```json
{
  "model": "anthropic/claude-sonnet-4.5",
  "input": "Summarize the last 20 messages."
}
```

### Context schema drift: `serverId` replaced by `messageServerId` in room/world contexts
Even though some types may retain `serverId` for backward compatibility, newer code paths (bootstrap/providers/tests) now standardize on `messageServerId`.

- **PR:** https://github.com/elizaos/eliza/pull/6333

---

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

### Twitter/X (plugin-twitter)
- OAuth2 PKCE added + backward compatible 3-legged login/approve flows (see daily summary: https://elizaos.github.io/api/summaries/overall/day/2026-01-09.json)
- **Open doc gap (Discord):** “Do you need Twitter API to run a Twitter agent?” remains unanswered; a docs item was requested.

### Discord (plugin-discord)
Work this week was mostly stabilization + alignment with core messaging semantics:

- Extensible slash command system restored join/leave behaviors:
  - **Issue:** https://github.com/elizaos-plugins/plugin-discord/issues/15
- Ongoing transition from `sendMessage` to standardized `handleMessage`:
  - **PR:** https://github.com/elizaos-plugins/plugin-discord/pull/41
- Release pipeline blocker preventing v1.3.4:
  - **P1 Issue:** https://github.com/elizaos-plugins/plugin-discord/issues/40
- Discord bot failures reported in the community were traced to bootstrap/context ID mismatches with plugin-discord v1.3.3; core fix landed in https://github.com/elizaos/eliza/pull/6333.

**Unanswered ops question (Discord):**
- “How do I set Discord Timer/Interval Settings for my agents?” is still open on Discord; recommend opening a GitHub issue with the exact plugin version + desired scheduling semantics (cron vs interval vs per-channel throttle).

### Telegram (plugin-telegram)
A new crash was identified: plugin-telegram throws a `TypeError` when processing certain images uploaded as photos.

- **Issue:** https://github.com/elizaos-plugins/plugin-telegram/issues/23

---

## 6) Model Provider Updates

### Claude workflows upgraded (CI automation)
Claude-powered CI workflows were upgraded to stable v1 action and **Opus 4.5**, and additional automated security/maintenance jobs were added.

- **PR:** https://github.com/elizaos/eliza/pull/6324  
- Cursor bot trigger fix:
  - **PR:** https://github.com/elizaos/eliza/pull/6328

### Experimental provider exploration (community)
Core-devs discussed testing **MiniMax M2** (interleaved thinking for long-running tasks) and running Claude Code with alternative endpoints in VPS setups. These are exploratory and not merged integrations yet (no PRs linked).

---

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

### ⚠️ V2.0.0 runtime-first redesign (in progress; expect major breakage)
- **PR (WIP):** https://github.com/elizaos/eliza/pull/6351  
Based on the design discussion, V2 aims to remove/replace:
- current API/server/CLI/projects structure,
- in favor of a documented runtime with consistent abstractions across TS/Rust/Python,
- plus cross-language plugin interop (FFI).

**Action for plugin/app developers**
- Do not assume V1 app/server entrypoints will exist in V2.
- Isolate your integration behind a small adapter layer so you can swap transports/runtime entrypoints later.

### ⚠️ `serverId` → `messageServerId`
- **PR:** https://github.com/elizaos/eliza/pull/6333  
If you parse room/world/provider outputs or rely on server identifiers in prompts/tools, update now.

**Quick migration tip**
```diff
- const id = room.serverId;
+ const id = room.messageServerId;
```

### ⚠️ `mode` → `transport`
- **PR:** https://github.com/elizaos/eliza/pull/6300  
Legacy `mode` still works but is deprecated; plan to move to `transport` to avoid silent behavior changes once legacy support is removed.

---

### References / Docs
- Docs expansion (~95% coverage) including REST API/CLI/streaming guides:
  - **PR:** https://github.com/elizaos/docs/pull/81
- Agent memory docs request (from Discord feedback loop):
  - **Issue:** https://github.com/elizaos/docs/issues/82
- HackMD “ElizaOS book” workspace (shared in core-devs):
  - https://hackmd.io/@elizaos/book