<p>That's the point.</p><h2>What changed</h2><p>Package Before After TypeScript 5.9 6.0 marked 15.0 18.0 vitest 3.2 4.1 diff 8.0 9.0</p><p>Plus the TypeScript native compiler (tsgo) updated to latest, and the build target bumped from ES2022 to ES2024.</p><h2>Why this matters</h2><p>Dependency debt is invisible until it isn't. Every month you skip a major version, the upgrade gets harder. Breaking changes accumulate. The gap between <em>what you're on</em> and <em>what the ecosystem expects</em> widens. Eventually you're three majors behind and the upgrade is a project in itself.</p><p>Elyra stays current. When TypeScript 6 dropped, we upgraded the same week. Not because we needed a specific feature, but because the cost of upgrading now is zero and the cost of upgrading later is unknown.</p><h2>TypeScript 6</h2><p>The biggest bump. TypeScript 6 brings stricter type inference, new default behaviors, and deprecation of some legacy options. Elyra's codebase passed without a single type error.</p><p>The only change needed was bumping the build target from ES2022 to ES2024. The TUI's Unicode width calculation uses the regex <code>v</code> flag (for proper emoji and zero-width character detection), which requires ES2024. The target was overdue for a bump anyway — Node 20+ has supported ES2024 features since launch.</p><p><code>experimentalDecorators</code> still works in TypeScript 6 (deprecated for 7). The web-ui package uses Lit decorators, so this buys time for the TC39 decorator migration.</p><h2>marked 18</h2><p>Three major versions in one jump (15 to 18). The markdown renderer is core infrastructure — every agent response flows through it. The changes across v16, v17, and v18 included a CJS build removal, list token restructuring, and stricter trailing whitespace handling.</p><p>Elyra's custom tokenizer (which handles strict strikethrough parsing) and the full token rendering pipeline worked without modification. The vendored <code>marked.min.js</code> used in HTML exports may need a future update, but the runtime renderer is clean.</p><h2>vitest 4</h2><p>The test runner upgrade. vitest 4 reworked its pool system, removed some deprecated config options, and changed mock naming. Elyra's test suites — 60+ test files across four packages — passed without changes. No deprecated config options were in use, no snapshots contained mock names.</p><h2>diff 9</h2><p>The simplest upgrade. Elyra uses <code>diffLines()</code> and <code>diffWords()</code> for file edit diffs and intra-line highlighting. Both functions are unchanged in v9. The breaking changes (patch formatting, ES5 removal) don't affect any code path in Elyra.</p><h2>What made this painless</h2><p>Four major bumps with zero code fixes isn't luck. It's a consequence of how the codebase is structured:</p><p><strong>Minimal API surface usage.</strong> Elyra uses <code>diff</code> for two functions, not twenty. It uses <code>marked</code> through a clean rendering abstraction, not scattered inline calls. When you touch less of a library's API, you're less likely to hit breaking changes.</p><p><strong>Current targets.</strong> The build was already on ES2022 with <code>strict: true</code> and <code>Node16</code> module resolution. No legacy options, no deprecated patterns. TypeScript 6's new defaults matched what Elyra was already doing explicitly.</p><p><strong>Good test coverage.</strong> Running <code>npm run check</code> after each upgrade immediately showed whether anything broke. The feedback loop between <em>install new version</em> and <em>know if it works</em> was under 30 seconds.</p><h2>The xAI footnote</h2><p>The only code change in this release was updating test model references. xAI removed <code>grok-2</code> and <code>grok-2-latest</code> from their API between builds, so tests that referenced those models needed to point to <code>grok-4.3</code> instead. This has happened three times now across releases — model APIs are more volatile than library APIs.</p><p>This is why Elyra's model list is auto-generated from live API data rather than hardcoded. The generated file changes; the code that uses it doesn't.</p>