# ElizaOS Developer Update (2026-04-22 → 2026-04-28)

This week focused on (1) hardening the **agent runtime message/action pipeline**, (2) shipping **event-kind triggers** and automation UX improvements, and (3) pushing forward **monetization infrastructure** in Eliza Cloud (pay-as-you-go containers + org credit billing). A large ecosystem-wide dependency modernization effort (Node 24 / TypeScript 6) is in-flight pending CI.

---

## 1) Core Framework (runtime, architecture, plugin system)

### Event-kind triggers are now wired to the runtime event bus
A new bridge service connects inbound runtime events (e.g., Discord/Telegram message events, webhooks) to the trigger dispatcher, unblocking “event-kind” triggers that previously registered but never fired.

- PR: **feat(triggers): wire event-kind triggers to the runtime event bus**  
  https://github.com/elizaOS/eliza/pull/7116
- Related Telegram event emission fix (see Social Integrations): https://github.com/elizaOS/eliza/pull/7122

**What changed (conceptually):**
- Runtime emits typed events onto an internal event bus.
- `TriggerEventBridge` listens for those events and dispatches matching triggers into the existing trigger handler pipeline.

**Developer impact:**
- If you’ve built triggers that target inbound connector events (Telegram, Discord, Webhook, etc.), they should now execute without requiring custom glue code.

### Message/action pipeline hardening (preventing REPLY loss and improving planner tolerance)
Several fixes landed to reduce “silent failures” in the message router and to preserve explicit actions under concurrency and metadata “rescue” heuristics.

Key fixes:
- Preserve explicit `REPLY` when race-discard fires (older response was being blanket-dropped)  
  https://github.com/elizaOS/eliza/pull/7143
- Respect explicit `REPLY` action in metadata-rescue gate (avoid overriding planned REPLY)  
  https://github.com/elizaOS/eliza/pull/7141
- Tolerate malformed planner action XML (e.g., missing `</action>`)  
  https://github.com/elizaOS/eliza/pull/7099
- Preserve `SPAWN_AGENT` against metadata action correction (avoid “helpful” correction breaking delegation)  
  https://github.com/elizaOS/eliza/pull/7075
- Reduce prompt bloat in reflection/providers to avoid long-context cap regressions  
  https://github.com/elizaOS/eliza/pull/7013

### Shared concurrency primitives: `utils/batch-queue`
Core now has a shared batch/concurrency toolkit used by multiple background drains (embeddings, indexing, prompt batching), reducing duplicated queue logic and enabling bounded embedding work.

- PR: **feat(core): shared batch-queue drains and bounded knowledge embeddings**  
  https://github.com/elizaOS/eliza/pull/6722
- Docs: `packages/docs/runtime/batch-queue.mdx` (added in the same PR)

**Why it matters:** background work (especially embeddings) is now easier to reason about and tune consistently across features.

### “Agent starter” workspace added (`agent/`)
A new top-level `agent/` workspace was introduced as a starter surface and to improve repo bootstrapping, alongside updates to runtime composition APIs.

- PR: **feat: add agent/ like starter in develop**  
  https://github.com/elizaOS/eliza/pull/6702

If you maintain custom build tooling or workspace assumptions, review this PR closely—repo shape and composition entry points have evolved.

---

## 2) New Features (with examples)

### x402 monetization: paid plugin routes + hardened test harness
Agents can now expose **paid** plugin routes guarded by x402 payment verification middleware (seller mode), including replay protection and startup validation.

- PR: **feat(agent): x402 paid plugin routes and test harness hardening**  
  https://github.com/elizaOS/eliza/pull/7100

**High-level flow:**
1. Configure payment requirements for a plugin HTTP route.
2. Middleware validates x402 payment proofs (facilitator/standard flows).
3. Route executes only if payment is accepted; replays are rejected.

**Example: protect a plugin route (conceptual Express-style wiring)**
```ts
import { applyPaymentProtection } from "@elizaos/agent/middleware/x402";

app.post(
  "/api/plugins/my-plugin/do-work",
  applyPaymentProtection({
    // exact config shape lives in packages/agent/src/middleware/x402/*
    priceUsd: 0.005,
    asset: "USDC",
    chain: "base",
    replayWindowMs: 5 * 60_000,
  }),
  async (req, res) => {
    const result = await doWork(req.body);
    res.json({ ok: true, result });
  }
);
```

**Local test harness**
- Script added for route testing: `packages/agent/scripts/test-x402-plugin-route.ts` (PR #7100)

### Runtime prompt output format can be changed via env var
`dynamicPromptExecFromState` no longer forces TOON; you can switch formats for models that are inconsistent with TOON (notably Gemini and some local Llama/Ollama setups).

- PR: **feat(core): PROMPT_OUTPUT_FORMAT env var for dynamicPromptExecFromState**  
  https://github.com/elizaOS/eliza/pull/6978

**Usage**
```bash
# examples (actual accepted values depend on core’s resolver)
export PROMPT_OUTPUT_FORMAT=json
# or
export PROMPT_OUTPUT_FORMAT=toon
```

This is particularly useful if you maintain multi-provider deployments and want deterministic structured outputs per environment.

### Automations UX: generation progress + missing credentials banner + draft survival
Automation surfaces got multiple improvements to reduce confusion during 10–30s workflow generation and to handle missing credentials end-to-end.

Notable PRs:
- Multi-stage workflow generation progress card  
  https://github.com/elizaOS/eliza/pull/7127
- Missing-credentials banner in AutomationsView  
  https://github.com/elizaOS/eliza/pull/7134
- In-flight workflow draft selection survives stale-id check + synthesizes draft item  
  https://github.com/elizaOS/eliza/pull/7128
- Hero-chat workflow create resolves credentials end-to-end  
  https://github.com/elizaOS/eliza/pull/7118
- Streaming generation timeout increased 90s → 180s (workflow/tool calls)  
  https://github.com/elizaOS/eliza/pull/7117

---

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

### REPLY dropped during concurrency “race discard”
**Symptom:** If a newer message arrives in the same room while a response is generating, the older response could be discarded even when it was an explicit `REPLY`, causing apparent “agent silence”.

- Fix: https://github.com/elizaOS/eliza/pull/7143

**Root cause:** The race-check used a blanket discard policy for “older” generations without honoring explicit actions. The fix preserves explicit REPLY outputs in these race conditions.

### Metadata “rescue” could override an explicit REPLY
**Symptom:** Planner emits `['REPLY']`, but a metadata overlap heuristic “corrects” the action, suppressing the intended reply.

- Fix: https://github.com/elizaOS/eliza/pull/7141

**Root cause:** Heuristic treated REPLY as “upgradable” even when it was explicitly chosen. Now explicit REPLY is respected.

### Telegram triggers not firing (missing MESSAGE_RECEIVED event)
**Symptom:** Event-kind triggers bound to Telegram messages registered correctly but never executed.

- Fix: https://github.com/elizaOS/eliza/pull/7122

**Root cause:** The in-process Telegram shim path didn’t emit `MESSAGE_RECEIVED` onto the runtime event bus. The fix adds that emission (and works with the new TriggerEventBridge in #7116).

### In-memory DB adapter behavior mismatched SQL adapter
Two important consistency fixes for local/dev setups:
- Move memories between room lists on `roomId` change  
  https://github.com/elizaOS/eliza/pull/6965
- Sort `getMemories` descending to match `plugin-sql` ordering semantics  
  https://github.com/elizaOS/eliza/pull/7000

These reduce “works in prod, fails locally” (or vice versa) when switching adapters.

---

## 4) API Changes (developer-facing)

### Runtime event bus is now part of the trigger execution path
While not a single “public API” change, the operational contract changed:
- Connectors and shims are expected to emit runtime events (`MESSAGE_RECEIVED`, etc.).
- Triggers can now rely on those events being routed into the trigger dispatcher.

See:
- TriggerEventBridge: https://github.com/elizaOS/eliza/pull/7116
- Telegram emission: https://github.com/elizaOS/eliza/pull/7122

### x402 route protection introduces new middleware + types
PR #7100 extends route and payment types in core/agent and adds documented x402 flows.

- PR: https://github.com/elizaOS/eliza/pull/7100

If you maintain custom server wiring around plugin routes, audit for:
- new middleware requirements
- replay-guard expectations
- startup validation behavior

### GitHub PAT persistence for coding sub-agents (settings surface + env injection)
Coding sub-agents can now receive a persisted PAT via `process.env.GITHUB_TOKEN`.

- PR: https://github.com/elizaOS/eliza/pull/7139

This affects how you should provision GitHub auth for spawned agents; prefer the centralized settings card over ad-hoc env injection.

---

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

### Telegram: MESSAGE_RECEIVED event now emitted
Unblocks event-kind triggers for Telegram inbound messages.

- PR: https://github.com/elizaOS/eliza/pull/7122

### Discord/LifeOps routing hardening
LifeOps Discord routing + submodule bumps (fixes UX/routing regressions):

- PR: https://github.com/elizaOS/eliza/pull/6971

### Community note: Discord moderation + coordination
Discord saw:
- scammer detection and ban
- formation of an “eliza army” steering group for coordination  
Discord context (2026-04-27): https://discord.com/channels/1253563208833433701/1253563209462448241

(Primarily community ops, but relevant for devs: be cautious with “support links” and encourage users to validate official URLs.)

---

## 6) Model Provider Updates (OpenAI, Anthropic, DeepSeek, etc.)

### Anthropic: fix malformed Haiku model ID
A bad default model ID caused 404s against Anthropic.

- PR: https://github.com/elizaOS/eliza/pull/7078

### Provider UX/auth correctness
Anthropic credential display now distinguishes Claude Code CLI creds from in-app OAuth, preventing misleading “connected” states in Settings.

- PR: https://github.com/elizaOS/eliza/pull/7094

### Output format flexibility for non-Claude models
`PROMPT_OUTPUT_FORMAT` support (PR #6978) improves reliability for Gemini/local Ollama models that don’t consistently emit TOON.

- PR: https://github.com/elizaOS/eliza/pull/6978

---

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

### Node.js 24 + TypeScript 6 modernization is in-flight (potentially breaking)
A Renovate-driven modernization wave is targeting:
- Node.js **24**
- TypeScript **6**
- Rimraf **6**
across core repos; CI verification is pending per the daily engineering summary (2026-04-27).

**What to do now:**
- If you maintain plugins/apps pinned to older TS/Node, prepare for stricter typechecking and runtime shifts.
- Run CI against Node 24 early in your forks.

Related dependency PRs (examples):
- Node 24: https://github.com/elizaOS/eliza/pull/6909
- TypeScript 6: https://github.com/elizaOS/eliza/pull/6900
- Rimraf 6: https://github.com/elizaOS/eliza/pull/6899

### V2 runtime composition + repo shape changes
The addition of the `agent/` workspace and runtime composition API adjustments may break tooling that assumes older monorepo layout.

- PR: https://github.com/elizaOS/eliza/pull/6702

### Trigger system behavior change (now actually fires)
If you previously implemented “manual” dispatch hacks for event triggers, you may now get **double execution** if you don’t remove the workaround. Review trigger wiring after:
- https://github.com/elizaOS/eliza/pull/7116

---

## Pointers / Docs / Ongoing Work

- Background tasks & batch queue docs (new): see `packages/docs/runtime/batch-queue.mdx` (PR #6722)  
  https://github.com/elizaOS/eliza/pull/6722
- Automation credential resolution and UX improvements: https://github.com/elizaOS/eliza/pull/7118, https://github.com/elizaOS/eliza/pull/7134
- Discord discussion on HTN planning upgrade path (HTN-lite → full HTN at v2 beta): internal planning context from Discord (2026-04-25)  
  (No tracked PR yet; consider documenting HTN interfaces once stabilized.)

If you need a specific “diff-focused” changelog for a package (`@elizaos/core`, `@elizaos/agent`, `app-core`), share the package name and your current pinned versions (alpha tags), and we’ll produce a targeted migration checklist.