# ElizaOS Developer Update (2025-12-31 → 2026-01-07)

This week focused on transport correctness across the messaging stack (HTTP/SSE/WebSocket), reliability fixes in `plugin-sql` (Postgres + PGLite), and CI automation upgrades (Claude workflows). Discord discussions surfaced a key integration pitfall when running Anthropic without an embedding provider.

---

## 1) Core Framework (Architecture / Runtime / Plugin System)

### Messaging stack: transport unification + double-processing fix
PR **feat: unified hooks with multi-transport support (HTTP/SSE/WebSocket)** consolidated client + server naming and fixed a long-standing architectural issue where messages could be processed 2–3 times depending on transport wiring.  
- PR: https://github.com/elizaos/eliza/pull/6300  
- Related issue (closed): **Messaging API - Fix double processing & align transports** https://github.com/elizaos/eliza/issues/6298

Key architectural changes:
- Server endpoints now use a `transport` parameter (preferred) instead of `mode`.
- Legacy `mode` is still accepted via mapping (`sync → http`, `stream → sse`), but is **deprecated**.
- WebSocket emission to the internal bus is now gated to the WebSocket transport path, preventing HTTP/SSE from triggering duplicate internal processing.

### MultiStep provider execution: parallelized for latency reduction
`default-message-service` MultiStep provider execution moved from sequential invocation to `Promise.allSettled`, improving end-to-end action latency when multiple providers fetch data concurrently.
- PR: https://github.com/elizaos/eliza/pull/6263

---

## 2) New Features (with examples)

### Unified client hooks with transport selection + lifecycle callbacks
The client package now exposes a single, transport-agnostic hook (`useElizaChat`) plus transport-specific hooks (`useHTTPChat`, `useSSEChat`, `useSocketChat`).
- PR: https://github.com/elizaos/eliza/pull/6300

Example (unified hook, SSE streaming):
```ts
import { useElizaChat } from "@elizaos/client";

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

  return (
    <div>
      <button
        disabled={loading}
        onClick={() => sendMessage({ content: "hello", metadata: { source: "ui" } })}
      >
        Send
      </button>

      {error && <pre>{String(error)}</pre>}
      <pre>{JSON.stringify(messages, null, 2)}</pre>
    </div>
  );
}
```

Example (server request: explicit `transport`):
```bash
curl -X POST \
  "http://localhost:3000/api/messaging/sessions/$SESSION_ID/messages?transport=sse" \
  -H "Content-Type: application/json" \
  -d '{"content":"ping"}'
```

### CI automation: Claude workflow upgrades + maintenance jobs
Claude-powered workflows were upgraded (stable v1 action, Opus 4.5) and new security/maintenance automation was added.
- PR: https://github.com/elizaos/eliza/pull/6324

Additionally, workflows were adjusted so the Cursor bot can trigger Claude review workflows.
- PR: https://github.com/elizaos/eliza/pull/6328

---

## 3) Bug Fixes (critical fixes with technical context)

### `plugin-sql`: Postgres `SET LOCAL` parameterization crash (data isolation)
When `ENABLE_DATA_ISOLATION=true`, the SQL plugin executed `SET LOCAL app.entity_id = $1` via Drizzle’s parameterization, which Postgres does not support for `SET` commands. This caused `syntax error at or near $1`, breaking essentially all DB operations under isolation.
- Fix: switched to `sql.raw()` for `SET LOCAL ...` with inline value, plus added unit + integration tests.
- PR: https://github.com/elizaos/eliza/pull/6316

Impact:
- Restores Postgres compatibility for isolation contexts.
- Unblocks production deployments relying on isolation scoping.

### `plugin-sql`: pool hardening + PGLite shutdown correctness
Several reliability improvements were merged:
- Added production-safe pool timeouts and keepalive defaults (prevents indefinite hangs and improves behavior in cloud environments).
- Added a pool `'error'` handler to prevent Node crashes when idle connections die (DB restart/network).
- PGLite adapter no longer returns `null as T` on shutdown; it throws a descriptive error instead.
- PR: https://github.com/elizaos/eliza/pull/6323

Operational note:
- The PGLite change is technically breaking (see **Breaking Changes**), but removes type-unsafe behavior that caused downstream crashes.

### CI: Claude code review failures (partial mitigation)
Discord reported intermittent Claude code review failures; the Cursor-trigger allowance in CI is one concrete fix merged this week.
- PR: https://github.com/elizaos/eliza/pull/6328  
(If failures persist, inspect workflow logs for action auth/rate limits and model/tool timeouts.)

---

## 4) API Changes (developer-facing)

### `mode` → `transport` (server + client alignment)
`transport` is now the canonical parameter across messaging endpoints, and transport naming is standardized across:
- `packages/server`
- `packages/api-client`
- `packages/client` hooks

PR: https://github.com/elizaos/eliza/pull/6300

Supported values:
- `"http"` (sync)
- `"sse"` (streaming)
- `"websocket"` (Socket.IO async)

Legacy compatibility:
- `mode=sync` maps to `transport=http`
- `mode=stream` maps to `transport=sse`

Action for developers:
- Update any direct REST calls, SDK usage, or reverse proxies that route by query param.
- Prefer `transport` in all new code; treat `mode` as deprecated.

---

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

### Twitter plugin: OAuth2 PKCE (in progress)
Work began to move the Twitter plugin toward OAuth2 PKCE for more secure auth and simpler configuration.
- PR: https://github.com/elizaos-plugins/plugin-twitter/pull/46

No Telegram/Discord/Farcaster plugin merges were captured in this week’s aggregated dataset, but Discord discussions indicated demand for low-latency social feeds (e.g., token creation monitoring) as part of Solana trading strategies.

---

## 6) Model Provider Updates (OpenAI / Anthropic / DeepSeek / …)

### Anthropic integration gotcha: embeddings provider still required
Discord surfaced a common failure mode when using Anthropic with an MCP server:

> `No handler found for delegate type: TEXT_EMBEDDING`

Resolution shared by maintainers/community:
- Provide an OpenAI key for embeddings and ensure the **OpenAI plugin is ordered after Anthropic** so embeddings resolve correctly. (In some setups, the OpenAI key “just needs a value” to satisfy configuration checks, but you should provide a valid key if embeddings are actually invoked.)

Developer recommendation:
- If running Anthropic-only for text generation, still configure a dedicated embeddings provider (OpenAI or another plugin implementing `TEXT_EMBEDDING`) until the runtime supports a native fallback.

Potential follow-up (not merged this week):
- Implement a `TEXT_EMBEDDING` handler fallback pathway for Anthropic+MCP flows (tracked as an action item in Discord; no PR link in this dataset).

### OpenAI plugin: media handling improvements (opened previously, still relevant)
Work to improve image description handling and introduce caching for audio/images was opened recently:
- PR: https://github.com/elizaos-plugins/plugin-openai/pull/23

---

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

### Breaking: PGLite adapter shutdown now throws instead of returning `null as T`
If you have code that assumes `withDatabase()` returns `null` during shutdown (or you were inadvertently relying on that behavior), you must handle exceptions instead.
- PR: https://github.com/elizaos/eliza/pull/6323

Mitigation pattern:
```ts
try {
  const result = await adapter.withDatabase((db) => db.select(...));
  // ...
} catch (e) {
  if (String(e).includes("shutting down")) {
    // handle graceful shutdown path
  } else {
    throw e;
  }
}
```

### Soft-breaking / deprecation: `mode` parameter replaced by `transport`
Existing integrations using `mode` should continue working due to legacy mapping, but:
- `mode` is deprecated and may be removed in a future major version.
- Update clients now to avoid surprise failures later.
- PR: https://github.com/elizaos/eliza/pull/6300

### Early signals: “elizacloud v2”
Discord referenced “elizacloud v2” development, but no concrete PRs/issues were included in this dataset. If you’re building tightly against hosted runtime assumptions, expect upcoming migration guidance once the v2 surface area is published.

---

## Notable Open Work / Watchlist

- **Draft:** `CachedDatabaseAdapter` + embedding dimension caching (do not merge yet)  
  PR: https://github.com/elizaos/eliza/pull/6329  
  If you operate serverless / high-latency DB setups, this is worth tracking; it aims to reduce redundant DB reads and repeated embedding-dimension probing.

- **Build tooling:** Turbo build memory spikes (21GB+) were reported in Discord; investigation pending (no PR linked).

---

## References

- Core PRs:  
  - Transport unification + hooks: https://github.com/elizaos/eliza/pull/6300  
  - MultiStep provider parallelization: https://github.com/elizaos/eliza/pull/6263  
  - SQL isolation fix (`SET LOCAL`): https://github.com/elizaos/eliza/pull/6316  
  - SQL pool hardening + PGLite shutdown: https://github.com/elizaos/eliza/pull/6323  
  - Claude CI upgrades: https://github.com/elizaos/eliza/pull/6324  
  - Cursor bot trigger for Claude workflows: https://github.com/elizaos/eliza/pull/6328

- Key issue (closed):  
  - Messaging double-processing: https://github.com/elizaos/eliza/issues/6298