<p>Since e got an agent panel, the panel has been a terminal. Press ⌘L, a pane opens beside your code, and inside it runs whatever agent you've chosen — Elyra, Claude Code, Codex, anything with a command line. The editor hosts; the agent reasons. That design has one enormous virtue, which is that it works with every agent, and we're not giving it up.</p><p>But for one agent — our own — we can do better than a terminal, because we know exactly what's on the other side of it. 0.9.21 adds Elyra Cascade: Elyra as a chat panel, drawn with native views, the way Devin Local and Windsurf's Cascade draw theirs. Here's what it is, how it works underneath, and why it's an option rather than a replacement.</p><h2>What a terminal can't do</h2><p>A terminal is a grid of characters. Everything Elyra shows you — the streaming reply, a diff, a tool call, a code block — has to be flattened into that grid, and everything you do — attach a file, pick a model, stop a turn — has to be typed as a command.</p><p>That's fine at the command line. Inside an editor it's a small constant friction. You want to say "look at this function" and you find yourself typing a path. You want to switch to a bigger model for one hard question and you type <code>/model</code> and scroll. You want to copy the code block it just wrote and you drag-select across a terminal and hope the line wrapping cooperates. None of it is hard. All of it is slower than clicking.</p><p>Cascade is what you get when the editor knows it's talking to Elyra and draws accordingly.</p><h2>The panel</h2><p>Turn it on with <strong>Settings → Agents → Elyra Cascade</strong>, or the palette command <strong>Agent: Elyra Cascade on/off</strong>. ⌘L now opens this:</p><p>The header is a session tab. ＋ starts a new session. ◷ lists this project's earlier sessions — pick one and it's resumed, conversation redrawn, right where you left it. ⋯ has compact, restart, and <strong>Use the terminal panel instead</strong>. ✕ closes.</p><p>The empty state says <em>Describe your task to Elyra</em>. Before you've stored an API key, it says where to add one instead — which is a small thing, but "the panel is empty and nothing happens" was the most common first-run report on the terminal version.</p><p>The transcript streams as markdown — headings, lists, tables render as themselves. A tool call is a card: the tool name, a one-line summary of what it's doing, running / done / error, and a preview of the result you can expand. Reasoning is dimmed so it's there if you want it and out of the way if you don't. Every code block and every reply has <strong>Copy</strong>.</p><p>The composer is where most of the difference lives:</p><pre><code class="language-text">  ┌──────────────────────────────────────────────────────────────┐
  │ Why does resolve() fail on paths like ./src/./main.rs?       │
  │ Normalise . components but leave .. as an error.             │
  │                                                              │
  │  ＋   ‹/› Code   ◇ Ask         Claude Opus 5 · high ▾     ↑  │
  └──────────────────────────────────────────────────────────────┘
    ⌂ Local   ▭ elyra-web
</code></pre><ul><li><p>＋ attaches context: the active file (sent as <code>@path</code>, which Elyra reads), the selection (file and line range), or all open files. Select a function, press ＋ → Selection, type "why?", send. That's the interaction the terminal couldn't give you.</p></li><li><p>‹/› Code / ◇ Ask — Code lets Elyra read, edit and run; Ask asks it to answer and plan without touching anything. Same as the terminal's modes, but visible, and one click.</p></li><li><p>The model chip lists every model Elyra offers, grouped by provider, with the thinking level for models that have one. Claude Opus 5 · high for the hard question; drop to Sonnet · medium for the follow-ups. It's remembered, so Elyra starts on your choice next time.</p></li><li><p>↑ sends. ■ stops the current turn. Typing while Elyra is working steers it — the message goes in mid-turn rather than waiting.</p></li></ul><p>Under the card: ⌂ Local ▭ elyra-web — where the agent runs and on what.</p><h2>Underneath</h2><p>This is the part we want to be precise about, because "chat panel" can mean a lot of things.</p><p>Cascade is not a second implementation of Elyra. Underneath, it runs the same <code>elyra</code> binary you have in your terminal — headless, with <code>--mode rpc</code>. In that mode Elyra speaks a structured protocol over stdio instead of drawing a TUI: events for each token, each tool call, each state change; commands for send, stop, steer, switch model. e reads those events and draws them as native views.</p><p>Which means:</p><ul><li><p>Every provider and model Elyra knows is available. Nine provider protocols, the OAuth logins, your <code>~/.elyra/agent/</code> settings, skills, memory, decision log — all of it, because it is Elyra.</p></li><li><p>Sessions are Elyra sessions. The ◷ list reads the same JSONL files the terminal writes. Start something in Cascade, finish it in a terminal window, or the other way round.</p></li><li><p>It stays fast however long the conversation gets. A terminal redraws the whole scrollback; native views redraw what changed. A two-hour session with forty tool calls scrolls like a document, not like a log file.</p></li></ul><p>And because it's Elyra headless, an Elyra update improves Cascade without an e update. The panel is a view; the agent is the agent.</p><h2>API keys, and where they go</h2><p>The terminal version assumed you'd exported <code>ANTHROPIC_API_KEY</code> in your shell, which is true of developers who live in the terminal and not true of anyone else. <strong>Settings → Agents</strong> now has a key field for Anthropic, OpenAI, Gemini and Grok (xAI).</p><p>Three things about how they're handled, in the order we think matters:</p><ol><li><p>Keys go in the macOS Keychain. Elsewhere, a <code>0600</code> file at <code>~/.config/e/secrets.json</code>. Never in <code>config.json</code>, which is plain text that people commit to dotfiles repos.</p></li><li><p>They're shown masked once saved — ••••1234, with <strong>Replace</strong> and <strong>Remove</strong>. You can see that a key is there and which one it is without the value ever being on screen again.</p></li><li><p>Cascade hands them to Elyra as environment variables (<code>ANTHROPIC_API_KEY</code>, <code>OPENAI_API_KEY</code>, <code>GEMINI_API_KEY</code>, <code>XAI_API_KEY</code>) when it starts the process — so a key entered once is all it takes. But a variable already exported in your shell still wins. If you've set things up the terminal way, Settings doesn't override you; it fills the gap where nothing was set.</p></li></ol><p>Elyra's own logins — <code>/login</code> for a Claude Pro/Max, ChatGPT or Copilot subscription, and <code>~/.elyra/agent/auth.json</code> — keep working alongside. <strong>Settings → Agents</strong> is for keys. Subscriptions were never keys.</p><h2>Why an option and not the default</h2><p>Cascade is off by default. The agent panel is still a terminal for every agent, Elyra included, until you turn it on.</p><p>Partly that's humility about a first release. But mostly it's that the terminal panel does something Cascade can't: it works for Claude Code, Codex, and any CLI agent that exists or will exist, unchanged, today. That generality is a real feature — an editor that isn't married to one agent — and we're not going to erode it by making the one agent we happen to make the privileged default. Cascade is better for Elyra. The terminal is universal. Both are one click apart, and ⋯ → <strong>Use the terminal panel instead</strong> is always there.</p><p>If you use Elyra, try Cascade for a day. If you use something else, nothing about your editor changed.</p><h2>Get it</h2><p>e 0.9.21 is at <a target="_blank" rel="noopener noreferrer nofollow" href="https://elyracode.com/e">elyracode.com/e</a> — a universal macOS disk image, plus tarballs for macOS and Linux on both architectures, signed and verified by the updater. If you're already on e, <code>/update</code> or the banner on start. Cascade needs an Elyra install (<code>npm i -g @elyracode/coding-agent</code>) — e finds it on your PATH.</p><p>The <a target="_blank" rel="noopener noreferrer nofollow" href="https://elyracode.com/docs/e/agents">agents guide</a> has the full panel, the key handling, and the switch.</p><p>Open a Laravel project. Press ⌘L. Select a method that's bothering you, press ＋ → Selection, and type why.</p>