Bleeding Edge: Mosh, Sixel, TUI improvements#1
Merged
PhenixStar merged 108 commits intomainfrom Mar 15, 2026
Merged
Conversation
`wsh debugterm` currently decodes terminal bytes sourced from backend
block files. This extends it with a stdin-driven path so FE-emitted
payloads like `["...", "..."]` can be decoded directly without requiring
block lookup/RPC in that mode.
- **CLI surface**
- Added new mode: `--mode stdin`
- Updated mode help text to: `hex`, `decode`, `stdin`
- Centralized mode validation via `getDebugTermMode()`
- **Execution path split**
- Added mode-aware pre-run (`debugTermPreRun`):
- `stdin` mode: skips RPC setup
- `hex`/`decode`: keeps existing RPC setup behavior
- `stdin` mode now:
- reads all stdin
- parses JSON as `[]string`
- concatenates entries and runs existing decode formatter
- **Parsing support**
- Added `parseDebugTermStdinData([]byte) ([]byte, error)`
- Error messaging explicitly requires a JSON array of strings
- **Tests**
- Added focused coverage for:
- valid stdin JSON array parsing + decoded output
- invalid stdin JSON input
```go
stdinData, _ := io.ReadAll(WrappedStdin)
termData, err := parseDebugTermStdinData(stdinData) // expects []string JSON
if err != nil { return err }
WriteStdout("%s", formatDebugTermDecode(termData))
```
<!-- START COPILOT CODING AGENT TIPS -->
---
✨ Let Copilot coding agent [set things up for
you](https://github.com/wavetermdev/waveterm/issues/new?title=✨+Set+up+Copilot+instructions&body=Configure%20instructions%20for%20this%20repository%20as%20documented%20in%20%5BBest%20practices%20for%20Copilot%20coding%20agent%20in%20your%20repository%5D%28https://gh.io/copilot-coding-agent-tips%29%2E%0A%0A%3COnboard%20this%20repo%3E&assignees=copilot)
— coding agent works faster and does higher quality work when set up for
your repo.
---------
Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>
Co-authored-by: sawka <2722291+sawka@users.noreply.github.com>
Co-authored-by: sawka <mike@commandline.dev>
…up (#2954) Bumps the electron-patch group with 1 update: [electron-builder](https://github.com/electron-userland/electron-builder/tree/HEAD/packages/electron-builder). Updates `electron-builder` from 26.8.0 to 26.8.1 <details> <summary>Release notes</summary> <p><em>Sourced from <a href="https://github.com/electron-userland/electron-builder/releases">electron-builder's releases</a>.</em></p> <blockquote> <h2>electron-builder@26.8.1</h2> <h2>What's Changed</h2> <ul> <li>fix: always use package key when reading from dependency list instead of package <code>name</code> by <a href="https://github.com/mmaietta"><code>@mmaietta</code></a> in <a href="https://redirect.github.com/electron-userland/electron-builder/pull/9583">electron-userland/electron-builder#9583</a></li> <li>chore: add logging summary to end of node collector to flag any special cases/alerts by <a href="https://github.com/mmaietta"><code>@mmaietta</code></a> in <a href="https://redirect.github.com/electron-userland/electron-builder/pull/9587">electron-userland/electron-builder#9587</a></li> <li>chore: adding tolerance threshold (within 10 bytes) to vitest snapshots to adjust for package manager instabilities by <a href="https://github.com/mmaietta"><code>@mmaietta</code></a> in <a href="https://redirect.github.com/electron-userland/electron-builder/pull/9591">electron-userland/electron-builder#9591</a></li> <li>chore: update node_modules snapshots due to transitive fixture dependency changed by <a href="https://github.com/mmaietta"><code>@mmaietta</code></a> in <a href="https://redirect.github.com/electron-userland/electron-builder/pull/9592">electron-userland/electron-builder#9592</a></li> <li>fix(appimage): fix mime type directory in AppDir by <a href="https://github.com/sabonerune"><code>@sabonerune</code></a> in <a href="https://redirect.github.com/electron-userland/electron-builder/pull/9589">electron-userland/electron-builder#9589</a></li> <li>chore(deploy): Release (next) by <a href="https://github.com/electron-builder-release-bot"><code>@electron-builder-release-bot</code></a>[bot] in <a href="https://redirect.github.com/electron-userland/electron-builder/pull/9585">electron-userland/electron-builder#9585</a></li> </ul> <p><strong>Full Changelog</strong>: <a href="https://github.com/electron-userland/electron-builder/compare/electron-builder@26.8.0...electron-builder@26.8.1">https://github.com/electron-userland/electron-builder/compare/electron-builder@26.8.0...electron-builder@26.8.1</a></p> </blockquote> </details> <details> <summary>Changelog</summary> <p><em>Sourced from <a href="https://github.com/electron-userland/electron-builder/blob/master/packages/electron-builder/CHANGELOG.md">electron-builder's changelog</a>.</em></p> <blockquote> <h2>26.8.1</h2> <h3>Patch Changes</h3> <!-- raw HTML omitted --> <!-- raw HTML omitted --> <p><a href="https://github.com/electron-userland/electron-builder/commit/4edd6950454d369ef8994e5a1ad64f1d0c7b7643"><code>4edd695</code></a> <a href="https://github.com/electron-userland/electron-builder/commit/8940ec63bac6450ed9b7c5e761954f08e6fa4242"><code>8940ec6</code></a> <a href="https://github.com/electron-userland/electron-builder/commit/4edd6950454d369ef8994e5a1ad64f1d0c7b7643"><code>4edd695</code></a> <a href="https://github.com/electron-userland/electron-builder/commit/dde4309b9114e06d0826e8badc2cb968ceb75642"><code>dde4309</code></a></p> <!-- raw HTML omitted --> <ul> <li><code>app-builder-lib@26.8.1</code></li> <li><code>builder-util@26.8.1</code></li> <li><code>dmg-builder@26.8.1</code></li> </ul> <!-- raw HTML omitted --> </blockquote> </details> <details> <summary>Commits</summary> <ul> <li><a href="https://github.com/electron-userland/electron-builder/commit/9418d2c0fb3608d7b348d18ab2a6b6393374fe75"><code>9418d2c</code></a> chore(deploy): Release v26.8.1 (<a href="https://github.com/electron-userland/electron-builder/tree/HEAD/packages/electron-builder/issues/9585">#9585</a>)</li> <li>See full diff in <a href="https://github.com/electron-userland/electron-builder/commits/electron-builder@26.8.1/packages/electron-builder">compare view</a></li> </ul> </details> <br /> [](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores) Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`. [//]: # (dependabot-automerge-start) [//]: # (dependabot-automerge-end) --- <details> <summary>Dependabot commands and options</summary> <br /> You can trigger Dependabot actions by commenting on this PR: - `@dependabot rebase` will rebase this PR - `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it - `@dependabot show <dependency name> ignore conditions` will show all of the ignore conditions of the specified dependency - `@dependabot ignore <dependency name> major version` will close this group update PR and stop Dependabot creating any more for the specific dependency's major version (unless you unignore this specific dependency's major version or upgrade to it yourself) - `@dependabot ignore <dependency name> minor version` will close this group update PR and stop Dependabot creating any more for the specific dependency's minor version (unless you unignore this specific dependency's minor version or upgrade to it yourself) - `@dependabot ignore <dependency name>` will close this group update PR and stop Dependabot creating any more for the specific dependency (unless you unignore this specific dependency or upgrade to it yourself) - `@dependabot unignore <dependency name>` will remove all of the ignore conditions of the specified dependency - `@dependabot unignore <dependency name> <ignore condition>` will remove the ignore condition of the specified dependency and ignore conditions </details> Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Bumps [google.golang.org/api](https://github.com/googleapis/google-api-go-client) from 0.267.0 to 0.269.0. <details> <summary>Release notes</summary> <p><em>Sourced from <a href="https://github.com/googleapis/google-api-go-client/releases">google.golang.org/api's releases</a>.</em></p> <blockquote> <h2>v0.269.0</h2> <h2><a href="https://github.com/googleapis/google-api-go-client/compare/v0.268.0...v0.269.0">0.269.0</a> (2026-02-24)</h2> <h3>Features</h3> <ul> <li><strong>all:</strong> Auto-regenerate discovery clients (<a href="https://redirect.github.com/googleapis/google-api-go-client/issues/3512">#3512</a>) (<a href="https://github.com/googleapis/google-api-go-client/commit/7565f1ce32823b000e15c99cee73abe69b956a80">7565f1c</a>)</li> </ul> <h3>Bug Fixes</h3> <ul> <li><strong>generator:</strong> Handle preview version pkg name (<a href="https://redirect.github.com/googleapis/google-api-go-client/issues/3511">#3511</a>) (<a href="https://github.com/googleapis/google-api-go-client/commit/2a249ce376787bdfb5b9a71198e7e2458d471b54">2a249ce</a>)</li> </ul> <h2>v0.268.0</h2> <h2><a href="https://github.com/googleapis/google-api-go-client/compare/v0.267.0...v0.268.0">0.268.0</a> (2026-02-23)</h2> <h3>Features</h3> <ul> <li><strong>all:</strong> Auto-regenerate discovery clients (<a href="https://redirect.github.com/googleapis/google-api-go-client/issues/3502">#3502</a>) (<a href="https://github.com/googleapis/google-api-go-client/commit/5ccf9b931da20908e6fcfacacc2a5b187e3c2d18">5ccf9b9</a>)</li> <li><strong>all:</strong> Auto-regenerate discovery clients (<a href="https://redirect.github.com/googleapis/google-api-go-client/issues/3505">#3505</a>) (<a href="https://github.com/googleapis/google-api-go-client/commit/f405df9cfcfd63da04a8041398a1ac7e05b19be0">f405df9</a>)</li> <li><strong>all:</strong> Auto-regenerate discovery clients (<a href="https://redirect.github.com/googleapis/google-api-go-client/issues/3506">#3506</a>) (<a href="https://github.com/googleapis/google-api-go-client/commit/cda923ae8e234c4b83585867e67163dfbf7228af">cda923a</a>)</li> <li><strong>all:</strong> Auto-regenerate discovery clients (<a href="https://redirect.github.com/googleapis/google-api-go-client/issues/3507">#3507</a>) (<a href="https://github.com/googleapis/google-api-go-client/commit/e9015cc2681ce9d6300f4fae2ae6b075c6d75ead">e9015cc</a>)</li> <li><strong>all:</strong> Auto-regenerate discovery clients (<a href="https://redirect.github.com/googleapis/google-api-go-client/issues/3508">#3508</a>) (<a href="https://github.com/googleapis/google-api-go-client/commit/20fbcc132145cd4a09a58494dcb0b11974d5a681">20fbcc1</a>)</li> <li><strong>all:</strong> Auto-regenerate discovery clients (<a href="https://redirect.github.com/googleapis/google-api-go-client/issues/3509">#3509</a>) (<a href="https://github.com/googleapis/google-api-go-client/commit/20c1e0f7c75bfe94e9eb5a12a13003dcafa93342">20c1e0f</a>)</li> <li>Update to go 1.26 (<a href="https://redirect.github.com/googleapis/google-api-go-client/issues/3504">#3504</a>) (<a href="https://github.com/googleapis/google-api-go-client/commit/cc5baec2a450cf4d15a4aa1e71f5cefea339f2ea">cc5baec</a>)</li> </ul> </blockquote> </details> <details> <summary>Changelog</summary> <p><em>Sourced from <a href="https://github.com/googleapis/google-api-go-client/blob/main/CHANGES.md">google.golang.org/api's changelog</a>.</em></p> <blockquote> <h2><a href="https://github.com/googleapis/google-api-go-client/compare/v0.268.0...v0.269.0">0.269.0</a> (2026-02-24)</h2> <h3>Features</h3> <ul> <li><strong>all:</strong> Auto-regenerate discovery clients (<a href="https://redirect.github.com/googleapis/google-api-go-client/issues/3512">#3512</a>) (<a href="https://github.com/googleapis/google-api-go-client/commit/7565f1ce32823b000e15c99cee73abe69b956a80">7565f1c</a>)</li> </ul> <h3>Bug Fixes</h3> <ul> <li><strong>generator:</strong> Handle preview version pkg name (<a href="https://redirect.github.com/googleapis/google-api-go-client/issues/3511">#3511</a>) (<a href="https://github.com/googleapis/google-api-go-client/commit/2a249ce376787bdfb5b9a71198e7e2458d471b54">2a249ce</a>)</li> </ul> <h2><a href="https://github.com/googleapis/google-api-go-client/compare/v0.267.0...v0.268.0">0.268.0</a> (2026-02-23)</h2> <h3>Features</h3> <ul> <li><strong>all:</strong> Auto-regenerate discovery clients (<a href="https://redirect.github.com/googleapis/google-api-go-client/issues/3502">#3502</a>) (<a href="https://github.com/googleapis/google-api-go-client/commit/5ccf9b931da20908e6fcfacacc2a5b187e3c2d18">5ccf9b9</a>)</li> <li><strong>all:</strong> Auto-regenerate discovery clients (<a href="https://redirect.github.com/googleapis/google-api-go-client/issues/3505">#3505</a>) (<a href="https://github.com/googleapis/google-api-go-client/commit/f405df9cfcfd63da04a8041398a1ac7e05b19be0">f405df9</a>)</li> <li><strong>all:</strong> Auto-regenerate discovery clients (<a href="https://redirect.github.com/googleapis/google-api-go-client/issues/3506">#3506</a>) (<a href="https://github.com/googleapis/google-api-go-client/commit/cda923ae8e234c4b83585867e67163dfbf7228af">cda923a</a>)</li> <li><strong>all:</strong> Auto-regenerate discovery clients (<a href="https://redirect.github.com/googleapis/google-api-go-client/issues/3507">#3507</a>) (<a href="https://github.com/googleapis/google-api-go-client/commit/e9015cc2681ce9d6300f4fae2ae6b075c6d75ead">e9015cc</a>)</li> <li><strong>all:</strong> Auto-regenerate discovery clients (<a href="https://redirect.github.com/googleapis/google-api-go-client/issues/3508">#3508</a>) (<a href="https://github.com/googleapis/google-api-go-client/commit/20fbcc132145cd4a09a58494dcb0b11974d5a681">20fbcc1</a>)</li> <li><strong>all:</strong> Auto-regenerate discovery clients (<a href="https://redirect.github.com/googleapis/google-api-go-client/issues/3509">#3509</a>) (<a href="https://github.com/googleapis/google-api-go-client/commit/20c1e0f7c75bfe94e9eb5a12a13003dcafa93342">20c1e0f</a>)</li> <li>Update to go 1.26 (<a href="https://redirect.github.com/googleapis/google-api-go-client/issues/3504">#3504</a>) (<a href="https://github.com/googleapis/google-api-go-client/commit/cc5baec2a450cf4d15a4aa1e71f5cefea339f2ea">cc5baec</a>)</li> </ul> </blockquote> </details> <details> <summary>Commits</summary> <ul> <li><a href="https://github.com/googleapis/google-api-go-client/commit/312ac01a523ef2f8ea1eff4280bfc2a5e9de45c7"><code>312ac01</code></a> chore(main): release 0.268.1 (<a href="https://redirect.github.com/googleapis/google-api-go-client/issues/3513">#3513</a>)</li> <li><a href="https://github.com/googleapis/google-api-go-client/commit/7565f1ce32823b000e15c99cee73abe69b956a80"><code>7565f1c</code></a> feat(all): auto-regenerate discovery clients (<a href="https://redirect.github.com/googleapis/google-api-go-client/issues/3512">#3512</a>)</li> <li><a href="https://github.com/googleapis/google-api-go-client/commit/2a249ce376787bdfb5b9a71198e7e2458d471b54"><code>2a249ce</code></a> fix(generator): handle preview version pkg name (<a href="https://redirect.github.com/googleapis/google-api-go-client/issues/3511">#3511</a>)</li> <li><a href="https://github.com/googleapis/google-api-go-client/commit/26ea8895bbfc1f52ce2267bb4931650cd50771ee"><code>26ea889</code></a> chore(all): update all (<a href="https://redirect.github.com/googleapis/google-api-go-client/issues/3498">#3498</a>)</li> <li><a href="https://github.com/googleapis/google-api-go-client/commit/5b078d9393554b428a442c2d34abb4eff0fa9c60"><code>5b078d9</code></a> chore(main): release 0.268.0 (<a href="https://redirect.github.com/googleapis/google-api-go-client/issues/3503">#3503</a>)</li> <li><a href="https://github.com/googleapis/google-api-go-client/commit/20c1e0f7c75bfe94e9eb5a12a13003dcafa93342"><code>20c1e0f</code></a> feat(all): auto-regenerate discovery clients (<a href="https://redirect.github.com/googleapis/google-api-go-client/issues/3509">#3509</a>)</li> <li><a href="https://github.com/googleapis/google-api-go-client/commit/20fbcc132145cd4a09a58494dcb0b11974d5a681"><code>20fbcc1</code></a> feat(all): auto-regenerate discovery clients (<a href="https://redirect.github.com/googleapis/google-api-go-client/issues/3508">#3508</a>)</li> <li><a href="https://github.com/googleapis/google-api-go-client/commit/e9015cc2681ce9d6300f4fae2ae6b075c6d75ead"><code>e9015cc</code></a> feat(all): auto-regenerate discovery clients (<a href="https://redirect.github.com/googleapis/google-api-go-client/issues/3507">#3507</a>)</li> <li><a href="https://github.com/googleapis/google-api-go-client/commit/cc5baec2a450cf4d15a4aa1e71f5cefea339f2ea"><code>cc5baec</code></a> feat: update to go 1.26 (<a href="https://redirect.github.com/googleapis/google-api-go-client/issues/3504">#3504</a>)</li> <li><a href="https://github.com/googleapis/google-api-go-client/commit/cda923ae8e234c4b83585867e67163dfbf7228af"><code>cda923a</code></a> feat(all): auto-regenerate discovery clients (<a href="https://redirect.github.com/googleapis/google-api-go-client/issues/3506">#3506</a>)</li> <li>Additional commits viewable in <a href="https://github.com/googleapis/google-api-go-client/compare/v0.267.0...v0.269.0">compare view</a></li> </ul> </details> <br /> [](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores) Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`. [//]: # (dependabot-automerge-start) [//]: # (dependabot-automerge-end) --- <details> <summary>Dependabot commands and options</summary> <br /> You can trigger Dependabot actions by commenting on this PR: - `@dependabot rebase` will rebase this PR - `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it - `@dependabot show <dependency name> ignore conditions` will show all of the ignore conditions of the specified dependency - `@dependabot ignore this major version` will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this minor version` will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this dependency` will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself) </details> Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Bumps the dev-dependencies-minor group with 4 updates: [@tailwindcss/vite](https://github.com/tailwindlabs/tailwindcss/tree/HEAD/packages/@tailwindcss-vite), [tailwindcss](https://github.com/tailwindlabs/tailwindcss/tree/HEAD/packages/tailwindcss), [eslint-plugin-mdx](https://github.com/mdx-js/eslint-mdx) and [@tailwindcss/cli](https://github.com/tailwindlabs/tailwindcss/tree/HEAD/packages/@tailwindcss-cli). Updates `@tailwindcss/vite` from 4.1.18 to 4.2.1 <details> <summary>Release notes</summary> <p><em>Sourced from <a href="https://github.com/tailwindlabs/tailwindcss/releases"><code>@tailwindcss/vite</code>'s releases</a>.</em></p> <blockquote> <h2>v4.2.1</h2> <h3>Fixed</h3> <ul> <li>Allow trailing dash in functional utility names for backwards compatibility (<a href="https://redirect.github.com/tailwindlabs/tailwindcss/pull/19696">#19696</a>)</li> <li>Properly detect classes containing <code>.</code> characters within curly braces in MDX files (<a href="https://redirect.github.com/tailwindlabs/tailwindcss/pull/19711">#19711</a>)</li> </ul> <h2>v4.2.0</h2> <h3>Added</h3> <ul> <li>Add mauve, olive, mist, and taupe color palettes to the default theme (<a href="https://redirect.github.com/tailwindlabs/tailwindcss/pull/19627">#19627</a>)</li> <li>Add <code>@tailwindcss/webpack</code> package to run Tailwind CSS as a webpack plugin (<a href="https://redirect.github.com/tailwindlabs/tailwindcss/pull/19610">#19610</a>)</li> <li>Add <code>pbs-*</code> and <code>pbe-*</code> utilities for <code>padding-block-start</code> and <code>padding-block-end</code> (<a href="https://redirect.github.com/tailwindlabs/tailwindcss/pull/19601">#19601</a>)</li> <li>Add <code>mbs-*</code> and <code>mbe-*</code> utilities for <code>margin-block-start</code> and <code>margin-block-end</code> (<a href="https://redirect.github.com/tailwindlabs/tailwindcss/pull/19601">#19601</a>)</li> <li>Add <code>scroll-pbs-*</code> and <code>scroll-pbe-*</code> utilities for <code>scroll-padding-block-start</code> and <code>scroll-padding-block-end</code> (<a href="https://redirect.github.com/tailwindlabs/tailwindcss/pull/19601">#19601</a>)</li> <li>Add <code>scroll-mbs-*</code> and <code>scroll-mbe-*</code> utilities for <code>scroll-margin-block-start</code> and <code>scroll-margin-block-end</code> (<a href="https://redirect.github.com/tailwindlabs/tailwindcss/pull/19601">#19601</a>)</li> <li>Add <code>border-bs-*</code> and <code>border-be-*</code> utilities for <code>border-block-start</code> and <code>border-block-end</code> (<a href="https://redirect.github.com/tailwindlabs/tailwindcss/pull/19601">#19601</a>)</li> <li>Add <code>inline-*</code>, <code>min-inline-*</code>, <code>max-inline-*</code> utilities for <code>inline-size</code>, <code>min-inline-size</code>, and <code>max-inline-size</code> (<a href="https://redirect.github.com/tailwindlabs/tailwindcss/pull/19612">#19612</a>)</li> <li>Add <code>block-*</code>, <code>min-block-*</code>, <code>max-block-*</code> utilities for <code>block-size</code>, <code>min-block-size</code>, and <code>max-block-size</code> (<a href="https://redirect.github.com/tailwindlabs/tailwindcss/pull/19612">#19612</a>)</li> <li>Add <code>inset-s-*</code>, <code>inset-e-*</code>, <code>inset-bs-*</code>, <code>inset-be-*</code> utilities for <code>inset-inline-start</code>, <code>inset-inline-end</code>, <code>inset-block-start</code>, and <code>inset-block-end</code> (<a href="https://redirect.github.com/tailwindlabs/tailwindcss/pull/19613">#19613</a>)</li> <li>Add <code>font-features-*</code> utility for <code>font-feature-settings</code> (<a href="https://redirect.github.com/tailwindlabs/tailwindcss/pull/19623">#19623</a>)</li> </ul> <h3>Fixed</h3> <ul> <li>Prevent double <code>@supports</code> wrapper for <code>color-mix</code> values (<a href="https://redirect.github.com/tailwindlabs/tailwindcss/pull/19450">#19450</a>)</li> <li>Allow whitespace around <code>@source inline()</code> argument (<a href="https://redirect.github.com/tailwindlabs/tailwindcss/pull/19461">#19461</a>)</li> <li>Emit comment when source maps are saved to files when using <code>@tailwindcss/cli</code> (<a href="https://redirect.github.com/tailwindlabs/tailwindcss/pull/19447">#19447</a>)</li> <li>Detect utilities containing capital letters followed by numbers (<a href="https://redirect.github.com/tailwindlabs/tailwindcss/pull/19465">#19465</a>)</li> <li>Fix class extraction for Rails' strict locals (<a href="https://redirect.github.com/tailwindlabs/tailwindcss/pull/19525">#19525</a>)</li> <li>Align <code>@Utility</code> name validation with Oxide scanner rules (<a href="https://redirect.github.com/tailwindlabs/tailwindcss/pull/19524">#19524</a>)</li> <li>Fix infinite loop when using <code>@variant</code> inside <code>@custom-variant</code> (<a href="https://redirect.github.com/tailwindlabs/tailwindcss/pull/19633">#19633</a>)</li> <li>Allow multiples of <code>.25</code> in <code>aspect-*</code> fractions (e.g. <code>aspect-8.5/11</code>) (<a href="https://redirect.github.com/tailwindlabs/tailwindcss/pull/19688">#19688</a>)</li> <li>Ensure changes to external files listed via <code>@source</code> trigger a full page reload when using <code>@tailwindcss/vite</code> (<a href="https://redirect.github.com/tailwindlabs/tailwindcss/pull/19670">#19670</a>)</li> <li>Improve performance of Oxide scanner in bigger projects by reducing file system walks (<a href="https://redirect.github.com/tailwindlabs/tailwindcss/pull/19632">#19632</a>)</li> <li>Ensure import aliases in Astro v5 work without crashing when using <code>@tailwindcss/vite</code> (<a href="https://redirect.github.com/tailwindlabs/tailwindcss/issues/19677">#19677</a>)</li> <li>Allow escape characters in <code>@Utility</code> names to improve support with formatters such as Biome (<a href="https://redirect.github.com/tailwindlabs/tailwindcss/pull/19626">#19626</a>)</li> <li>Fix incorrect canonicalization results when canonicalizing multiple times (<a href="https://redirect.github.com/tailwindlabs/tailwindcss/pull/19675">#19675</a>)</li> <li>Add <code>.jj</code> to default ignored content directories (<a href="https://redirect.github.com/tailwindlabs/tailwindcss/pull/19687">#19687</a>)</li> </ul> <h3>Deprecated</h3> <ul> <li>Deprecate <code>start-*</code> and <code>end-*</code> utilities in favor of <code>inset-s-*</code> and <code>inset-e-*</code> utilities (<a href="https://redirect.github.com/tailwindlabs/tailwindcss/pull/19613">#19613</a>)</li> </ul> </blockquote> </details> <details> <summary>Changelog</summary> <p><em>Sourced from <a href="https://github.com/tailwindlabs/tailwindcss/blob/main/CHANGELOG.md"><code>@tailwindcss/vite</code>'s changelog</a>.</em></p> <blockquote> <h2>[4.2.1] - 2026-02-23</h2> <h3>Fixed</h3> <ul> <li>Allow trailing dash in functional utility names for backwards compatibility (<a href="https://redirect.github.com/tailwindlabs/tailwindcss/pull/19696">#19696</a>)</li> <li>Properly detect classes containing <code>.</code> characters within curly braces in MDX files (<a href="https://redirect.github.com/tailwindlabs/tailwindcss/pull/19711">#19711</a>)</li> </ul> <h2>[4.2.0] - 2026-02-18</h2> <h3>Added</h3> <ul> <li>Add mauve, olive, mist, and taupe color palettes to the default theme (<a href="https://redirect.github.com/tailwindlabs/tailwindcss/pull/19627">#19627</a>)</li> <li>Add <code>@tailwindcss/webpack</code> package to run Tailwind CSS as a webpack plugin (<a href="https://redirect.github.com/tailwindlabs/tailwindcss/pull/19610">#19610</a>)</li> <li>Add <code>pbs-*</code> and <code>pbe-*</code> utilities for <code>padding-block-start</code> and <code>padding-block-end</code> (<a href="https://redirect.github.com/tailwindlabs/tailwindcss/pull/19601">#19601</a>)</li> <li>Add <code>mbs-*</code> and <code>mbe-*</code> utilities for <code>margin-block-start</code> and <code>margin-block-end</code> (<a href="https://redirect.github.com/tailwindlabs/tailwindcss/pull/19601">#19601</a>)</li> <li>Add <code>scroll-pbs-*</code> and <code>scroll-pbe-*</code> utilities for <code>scroll-padding-block-start</code> and <code>scroll-padding-block-end</code> (<a href="https://redirect.github.com/tailwindlabs/tailwindcss/pull/19601">#19601</a>)</li> <li>Add <code>scroll-mbs-*</code> and <code>scroll-mbe-*</code> utilities for <code>scroll-margin-block-start</code> and <code>scroll-margin-block-end</code> (<a href="https://redirect.github.com/tailwindlabs/tailwindcss/pull/19601">#19601</a>)</li> <li>Add <code>border-bs-*</code> and <code>border-be-*</code> utilities for <code>border-block-start</code> and <code>border-block-end</code> (<a href="https://redirect.github.com/tailwindlabs/tailwindcss/pull/19601">#19601</a>)</li> <li>Add <code>inline-*</code>, <code>min-inline-*</code>, <code>max-inline-*</code> utilities for <code>inline-size</code>, <code>min-inline-size</code>, and <code>max-inline-size</code> (<a href="https://redirect.github.com/tailwindlabs/tailwindcss/pull/19612">#19612</a>)</li> <li>Add <code>block-*</code>, <code>min-block-*</code>, <code>max-block-*</code> utilities for <code>block-size</code>, <code>min-block-size</code>, and <code>max-block-size</code> (<a href="https://redirect.github.com/tailwindlabs/tailwindcss/pull/19612">#19612</a>)</li> <li>Add <code>inset-s-*</code>, <code>inset-e-*</code>, <code>inset-bs-*</code>, <code>inset-be-*</code> utilities for <code>inset-inline-start</code>, <code>inset-inline-end</code>, <code>inset-block-start</code>, and <code>inset-block-end</code> (<a href="https://redirect.github.com/tailwindlabs/tailwindcss/pull/19613">#19613</a>)</li> <li>Add <code>font-features-*</code> utility for <code>font-feature-settings</code> (<a href="https://redirect.github.com/tailwindlabs/tailwindcss/pull/19623">#19623</a>)</li> </ul> <h3>Fixed</h3> <ul> <li>Prevent double <code>@supports</code> wrapper for <code>color-mix</code> values (<a href="https://redirect.github.com/tailwindlabs/tailwindcss/pull/19450">#19450</a>)</li> <li>Allow whitespace around <code>@source inline()</code> argument (<a href="https://redirect.github.com/tailwindlabs/tailwindcss/pull/19461">#19461</a>)</li> <li>Emit comment when source maps are saved to files when using <code>@tailwindcss/cli</code> (<a href="https://redirect.github.com/tailwindlabs/tailwindcss/pull/19447">#19447</a>)</li> <li>Detect utilities containing capital letters followed by numbers (<a href="https://redirect.github.com/tailwindlabs/tailwindcss/pull/19465">#19465</a>)</li> <li>Fix class extraction for Rails' strict locals (<a href="https://redirect.github.com/tailwindlabs/tailwindcss/pull/19525">#19525</a>)</li> <li>Align <code>@Utility</code> name validation with Oxide scanner rules (<a href="https://redirect.github.com/tailwindlabs/tailwindcss/pull/19524">#19524</a>)</li> <li>Fix infinite loop when using <code>@variant</code> inside <code>@custom-variant</code> (<a href="https://redirect.github.com/tailwindlabs/tailwindcss/pull/19633">#19633</a>)</li> <li>Allow multiples of <code>.25</code> in <code>aspect-*</code> fractions (e.g. <code>aspect-8.5/11</code>) (<a href="https://redirect.github.com/tailwindlabs/tailwindcss/pull/19688">#19688</a>)</li> <li>Ensure changes to external files listed via <code>@source</code> trigger a full page reload when using <code>@tailwindcss/vite</code> (<a href="https://redirect.github.com/tailwindlabs/tailwindcss/pull/19670">#19670</a>)</li> <li>Improve performance of Oxide scanner in bigger projects by reducing file system walks (<a href="https://redirect.github.com/tailwindlabs/tailwindcss/pull/19632">#19632</a>)</li> <li>Ensure import aliases in Astro v5 work without crashing when using <code>@tailwindcss/vite</code> (<a href="https://redirect.github.com/tailwindlabs/tailwindcss/issues/19677">#19677</a>)</li> <li>Allow escape characters in <code>@Utility</code> names to improve support with formatters such as Biome (<a href="https://redirect.github.com/tailwindlabs/tailwindcss/pull/19626">#19626</a>)</li> <li>Fix incorrect canonicalization results when canonicalizing multiple times (<a href="https://redirect.github.com/tailwindlabs/tailwindcss/pull/19675">#19675</a>)</li> <li>Add <code>.jj</code> to default ignored content directories (<a href="https://redirect.github.com/tailwindlabs/tailwindcss/pull/19687">#19687</a>)</li> </ul> <h3>Deprecated</h3> <ul> <li>Deprecate <code>start-*</code> and <code>end-*</code> utilities in favor of <code>inset-s-*</code> and <code>inset-e-*</code> utilities (<a href="https://redirect.github.com/tailwindlabs/tailwindcss/pull/19613">#19613</a>)</li> </ul> </blockquote> </details> <details> <summary>Commits</summary> <ul> <li><a href="https://github.com/tailwindlabs/tailwindcss/commit/1dce64ee7ec2e414c845b4e268ac3b9b89aaf0c8"><code>1dce64e</code></a> 4.2.1 (<a href="https://github.com/tailwindlabs/tailwindcss/tree/HEAD/packages/@tailwindcss-vite/issues/19714">#19714</a>)</li> <li><a href="https://github.com/tailwindlabs/tailwindcss/commit/1b16411919457ee47d38910fd07e134e9765eb4c"><code>1b16411</code></a> 4.2.0 (<a href="https://github.com/tailwindlabs/tailwindcss/tree/HEAD/packages/@tailwindcss-vite/issues/19695">#19695</a>)</li> <li><a href="https://github.com/tailwindlabs/tailwindcss/commit/d9fff9f5956433e362dc231ca16dcd77497def76"><code>d9fff9f</code></a> docs: update package README CI badge to main (<a href="https://github.com/tailwindlabs/tailwindcss/tree/HEAD/packages/@tailwindcss-vite/issues/19692">#19692</a>)</li> <li><a href="https://github.com/tailwindlabs/tailwindcss/commit/bc6e4b85bf1dce84e2947f81cbb9881a77427de7"><code>bc6e4b8</code></a> Fallback to <code>config.createResolver</code> for <code>client</code> and <code>ssr</code> environments in `@...</li> <li><a href="https://github.com/tailwindlabs/tailwindcss/commit/f212b0fc22c3e6f93a5068654e67bd2818109b95"><code>f212b0f</code></a> fix: restore full page reload for watched external files on Vite 7.1+ (<a href="https://github.com/tailwindlabs/tailwindcss/tree/HEAD/packages/@tailwindcss-vite/issues/19670">#19670</a>)</li> <li><a href="https://github.com/tailwindlabs/tailwindcss/commit/8ed67bf5510d8435d2be766b25245abe15b3bcef"><code>8ed67bf</code></a> Fix Tailwind CSS package README GitHub links (<a href="https://github.com/tailwindlabs/tailwindcss/tree/HEAD/packages/@tailwindcss-vite/issues/19644">#19644</a>)</li> <li><a href="https://github.com/tailwindlabs/tailwindcss/commit/e3e85b364fc62a19b97a4250854580132e7967c7"><code>e3e85b3</code></a> [tailwindcss-vite] Add Register dependency messages logline (<a href="https://github.com/tailwindlabs/tailwindcss/tree/HEAD/packages/@tailwindcss-vite/issues/19611">#19611</a>)</li> <li>See full diff in <a href="https://github.com/tailwindlabs/tailwindcss/commits/v4.2.1/packages/@tailwindcss-vite">compare view</a></li> </ul> </details> <br /> Updates `tailwindcss` from 4.1.18 to 4.2.1 <details> <summary>Release notes</summary> <p><em>Sourced from <a href="https://github.com/tailwindlabs/tailwindcss/releases">tailwindcss's releases</a>.</em></p> <blockquote> <h2>v4.2.1</h2> <h3>Fixed</h3> <ul> <li>Allow trailing dash in functional utility names for backwards compatibility (<a href="https://redirect.github.com/tailwindlabs/tailwindcss/pull/19696">#19696</a>)</li> <li>Properly detect classes containing <code>.</code> characters within curly braces in MDX files (<a href="https://redirect.github.com/tailwindlabs/tailwindcss/pull/19711">#19711</a>)</li> </ul> <h2>v4.2.0</h2> <h3>Added</h3> <ul> <li>Add mauve, olive, mist, and taupe color palettes to the default theme (<a href="https://redirect.github.com/tailwindlabs/tailwindcss/pull/19627">#19627</a>)</li> <li>Add <code>@tailwindcss/webpack</code> package to run Tailwind CSS as a webpack plugin (<a href="https://redirect.github.com/tailwindlabs/tailwindcss/pull/19610">#19610</a>)</li> <li>Add <code>pbs-*</code> and <code>pbe-*</code> utilities for <code>padding-block-start</code> and <code>padding-block-end</code> (<a href="https://redirect.github.com/tailwindlabs/tailwindcss/pull/19601">#19601</a>)</li> <li>Add <code>mbs-*</code> and <code>mbe-*</code> utilities for <code>margin-block-start</code> and <code>margin-block-end</code> (<a href="https://redirect.github.com/tailwindlabs/tailwindcss/pull/19601">#19601</a>)</li> <li>Add <code>scroll-pbs-*</code> and <code>scroll-pbe-*</code> utilities for <code>scroll-padding-block-start</code> and <code>scroll-padding-block-end</code> (<a href="https://redirect.github.com/tailwindlabs/tailwindcss/pull/19601">#19601</a>)</li> <li>Add <code>scroll-mbs-*</code> and <code>scroll-mbe-*</code> utilities for <code>scroll-margin-block-start</code> and <code>scroll-margin-block-end</code> (<a href="https://redirect.github.com/tailwindlabs/tailwindcss/pull/19601">#19601</a>)</li> <li>Add <code>border-bs-*</code> and <code>border-be-*</code> utilities for <code>border-block-start</code> and <code>border-block-end</code> (<a href="https://redirect.github.com/tailwindlabs/tailwindcss/pull/19601">#19601</a>)</li> <li>Add <code>inline-*</code>, <code>min-inline-*</code>, <code>max-inline-*</code> utilities for <code>inline-size</code>, <code>min-inline-size</code>, and <code>max-inline-size</code> (<a href="https://redirect.github.com/tailwindlabs/tailwindcss/pull/19612">#19612</a>)</li> <li>Add <code>block-*</code>, <code>min-block-*</code>, <code>max-block-*</code> utilities for <code>block-size</code>, <code>min-block-size</code>, and <code>max-block-size</code> (<a href="https://redirect.github.com/tailwindlabs/tailwindcss/pull/19612">#19612</a>)</li> <li>Add <code>inset-s-*</code>, <code>inset-e-*</code>, <code>inset-bs-*</code>, <code>inset-be-*</code> utilities for <code>inset-inline-start</code>, <code>inset-inline-end</code>, <code>inset-block-start</code>, and <code>inset-block-end</code> (<a href="https://redirect.github.com/tailwindlabs/tailwindcss/pull/19613">#19613</a>)</li> <li>Add <code>font-features-*</code> utility for <code>font-feature-settings</code> (<a href="https://redirect.github.com/tailwindlabs/tailwindcss/pull/19623">#19623</a>)</li> </ul> <h3>Fixed</h3> <ul> <li>Prevent double <code>@supports</code> wrapper for <code>color-mix</code> values (<a href="https://redirect.github.com/tailwindlabs/tailwindcss/pull/19450">#19450</a>)</li> <li>Allow whitespace around <code>@source inline()</code> argument (<a href="https://redirect.github.com/tailwindlabs/tailwindcss/pull/19461">#19461</a>)</li> <li>Emit comment when source maps are saved to files when using <code>@tailwindcss/cli</code> (<a href="https://redirect.github.com/tailwindlabs/tailwindcss/pull/19447">#19447</a>)</li> <li>Detect utilities containing capital letters followed by numbers (<a href="https://redirect.github.com/tailwindlabs/tailwindcss/pull/19465">#19465</a>)</li> <li>Fix class extraction for Rails' strict locals (<a href="https://redirect.github.com/tailwindlabs/tailwindcss/pull/19525">#19525</a>)</li> <li>Align <code>@Utility</code> name validation with Oxide scanner rules (<a href="https://redirect.github.com/tailwindlabs/tailwindcss/pull/19524">#19524</a>)</li> <li>Fix infinite loop when using <code>@variant</code> inside <code>@custom-variant</code> (<a href="https://redirect.github.com/tailwindlabs/tailwindcss/pull/19633">#19633</a>)</li> <li>Allow multiples of <code>.25</code> in <code>aspect-*</code> fractions (e.g. <code>aspect-8.5/11</code>) (<a href="https://redirect.github.com/tailwindlabs/tailwindcss/pull/19688">#19688</a>)</li> <li>Ensure changes to external files listed via <code>@source</code> trigger a full page reload when using <code>@tailwindcss/vite</code> (<a href="https://redirect.github.com/tailwindlabs/tailwindcss/pull/19670">#19670</a>)</li> <li>Improve performance of Oxide scanner in bigger projects by reducing file system walks (<a href="https://redirect.github.com/tailwindlabs/tailwindcss/pull/19632">#19632</a>)</li> <li>Ensure import aliases in Astro v5 work without crashing when using <code>@tailwindcss/vite</code> (<a href="https://redirect.github.com/tailwindlabs/tailwindcss/issues/19677">#19677</a>)</li> <li>Allow escape characters in <code>@Utility</code> names to improve support with formatters such as Biome (<a href="https://redirect.github.com/tailwindlabs/tailwindcss/pull/19626">#19626</a>)</li> <li>Fix incorrect canonicalization results when canonicalizing multiple times (<a href="https://redirect.github.com/tailwindlabs/tailwindcss/pull/19675">#19675</a>)</li> <li>Add <code>.jj</code> to default ignored content directories (<a href="https://redirect.github.com/tailwindlabs/tailwindcss/pull/19687">#19687</a>)</li> </ul> <h3>Deprecated</h3> <ul> <li>Deprecate <code>start-*</code> and <code>end-*</code> utilities in favor of <code>inset-s-*</code> and <code>inset-e-*</code> utilities (<a href="https://redirect.github.com/tailwindlabs/tailwindcss/pull/19613">#19613</a>)</li> </ul> </blockquote> </details> <details> <summary>Changelog</summary> <p><em>Sourced from <a href="https://github.com/tailwindlabs/tailwindcss/blob/main/CHANGELOG.md">tailwindcss's changelog</a>.</em></p> <blockquote> <h2>[4.2.1] - 2026-02-23</h2> <h3>Fixed</h3> <ul> <li>Allow trailing dash in functional utility names for backwards compatibility (<a href="https://redirect.github.com/tailwindlabs/tailwindcss/pull/19696">#19696</a>)</li> <li>Properly detect classes containing <code>.</code> characters within curly braces in MDX files (<a href="https://redirect.github.com/tailwindlabs/tailwindcss/pull/19711">#19711</a>)</li> </ul> <h2>[4.2.0] - 2026-02-18</h2> <h3>Added</h3> <ul> <li>Add mauve, olive, mist, and taupe color palettes to the default theme (<a href="https://redirect.github.com/tailwindlabs/tailwindcss/pull/19627">#19627</a>)</li> <li>Add <code>@tailwindcss/webpack</code> package to run Tailwind CSS as a webpack plugin (<a href="https://redirect.github.com/tailwindlabs/tailwindcss/pull/19610">#19610</a>)</li> <li>Add <code>pbs-*</code> and <code>pbe-*</code> utilities for <code>padding-block-start</code> and <code>padding-block-end</code> (<a href="https://redirect.github.com/tailwindlabs/tailwindcss/pull/19601">#19601</a>)</li> <li>Add <code>mbs-*</code> and <code>mbe-*</code> utilities for <code>margin-block-start</code> and <code>margin-block-end</code> (<a href="https://redirect.github.com/tailwindlabs/tailwindcss/pull/19601">#19601</a>)</li> <li>Add <code>scroll-pbs-*</code> and <code>scroll-pbe-*</code> utilities for <code>scroll-padding-block-start</code> and <code>scroll-padding-block-end</code> (<a href="https://redirect.github.com/tailwindlabs/tailwindcss/pull/19601">#19601</a>)</li> <li>Add <code>scroll-mbs-*</code> and <code>scroll-mbe-*</code> utilities for <code>scroll-margin-block-start</code> and <code>scroll-margin-block-end</code> (<a href="https://redirect.github.com/tailwindlabs/tailwindcss/pull/19601">#19601</a>)</li> <li>Add <code>border-bs-*</code> and <code>border-be-*</code> utilities for <code>border-block-start</code> and <code>border-block-end</code> (<a href="https://redirect.github.com/tailwindlabs/tailwindcss/pull/19601">#19601</a>)</li> <li>Add <code>inline-*</code>, <code>min-inline-*</code>, <code>max-inline-*</code> utilities for <code>inline-size</code>, <code>min-inline-size</code>, and <code>max-inline-size</code> (<a href="https://redirect.github.com/tailwindlabs/tailwindcss/pull/19612">#19612</a>)</li> <li>Add <code>block-*</code>, <code>min-block-*</code>, <code>max-block-*</code> utilities for <code>block-size</code>, <code>min-block-size</code>, and <code>max-block-size</code> (<a href="https://redirect.github.com/tailwindlabs/tailwindcss/pull/19612">#19612</a>)</li> <li>Add <code>inset-s-*</code>, <code>inset-e-*</code>, <code>inset-bs-*</code>, <code>inset-be-*</code> utilities for <code>inset-inline-start</code>, <code>inset-inline-end</code>, <code>inset-block-start</code>, and <code>inset-block-end</code> (<a href="https://redirect.github.com/tailwindlabs/tailwindcss/pull/19613">#19613</a>)</li> <li>Add <code>font-features-*</code> utility for <code>font-feature-settings</code> (<a href="https://redirect.github.com/tailwindlabs/tailwindcss/pull/19623">#19623</a>)</li> </ul> <h3>Fixed</h3> <ul> <li>Prevent double <code>@supports</code> wrapper for <code>color-mix</code> values (<a href="https://redirect.github.com/tailwindlabs/tailwindcss/pull/19450">#19450</a>)</li> <li>Allow whitespace around <code>@source inline()</code> argument (<a href="https://redirect.github.com/tailwindlabs/tailwindcss/pull/19461">#19461</a>)</li> <li>Emit comment when source maps are saved to files when using <code>@tailwindcss/cli</code> (<a href="https://redirect.github.com/tailwindlabs/tailwindcss/pull/19447">#19447</a>)</li> <li>Detect utilities containing capital letters followed by numbers (<a href="https://redirect.github.com/tailwindlabs/tailwindcss/pull/19465">#19465</a>)</li> <li>Fix class extraction for Rails' strict locals (<a href="https://redirect.github.com/tailwindlabs/tailwindcss/pull/19525">#19525</a>)</li> <li>Align <code>@Utility</code> name validation with Oxide scanner rules (<a href="https://redirect.github.com/tailwindlabs/tailwindcss/pull/19524">#19524</a>)</li> <li>Fix infinite loop when using <code>@variant</code> inside <code>@custom-variant</code> (<a href="https://redirect.github.com/tailwindlabs/tailwindcss/pull/19633">#19633</a>)</li> <li>Allow multiples of <code>.25</code> in <code>aspect-*</code> fractions (e.g. <code>aspect-8.5/11</code>) (<a href="https://redirect.github.com/tailwindlabs/tailwindcss/pull/19688">#19688</a>)</li> <li>Ensure changes to external files listed via <code>@source</code> trigger a full page reload when using <code>@tailwindcss/vite</code> (<a href="https://redirect.github.com/tailwindlabs/tailwindcss/pull/19670">#19670</a>)</li> <li>Improve performance of Oxide scanner in bigger projects by reducing file system walks (<a href="https://redirect.github.com/tailwindlabs/tailwindcss/pull/19632">#19632</a>)</li> <li>Ensure import aliases in Astro v5 work without crashing when using <code>@tailwindcss/vite</code> (<a href="https://redirect.github.com/tailwindlabs/tailwindcss/issues/19677">#19677</a>)</li> <li>Allow escape characters in <code>@Utility</code> names to improve support with formatters such as Biome (<a href="https://redirect.github.com/tailwindlabs/tailwindcss/pull/19626">#19626</a>)</li> <li>Fix incorrect canonicalization results when canonicalizing multiple times (<a href="https://redirect.github.com/tailwindlabs/tailwindcss/pull/19675">#19675</a>)</li> <li>Add <code>.jj</code> to default ignored content directories (<a href="https://redirect.github.com/tailwindlabs/tailwindcss/pull/19687">#19687</a>)</li> </ul> <h3>Deprecated</h3> <ul> <li>Deprecate <code>start-*</code> and <code>end-*</code> utilities in favor of <code>inset-s-*</code> and <code>inset-e-*</code> utilities (<a href="https://redirect.github.com/tailwindlabs/tailwindcss/pull/19613">#19613</a>)</li> </ul> </blockquote> </details> <details> <summary>Commits</summary> <ul> <li><a href="https://github.com/tailwindlabs/tailwindcss/commit/1dce64ee7ec2e414c845b4e268ac3b9b89aaf0c8"><code>1dce64e</code></a> 4.2.1 (<a href="https://github.com/tailwindlabs/tailwindcss/tree/HEAD/packages/tailwindcss/issues/19714">#19714</a>)</li> <li><a href="https://github.com/tailwindlabs/tailwindcss/commit/d15d92ca60b2c06a11c2db6a24dfcca18147de59"><code>d15d92c</code></a> Allow trailing dash in functional utility names (<a href="https://github.com/tailwindlabs/tailwindcss/tree/HEAD/packages/tailwindcss/issues/19696">#19696</a>)</li> <li><a href="https://github.com/tailwindlabs/tailwindcss/commit/1b16411919457ee47d38910fd07e134e9765eb4c"><code>1b16411</code></a> 4.2.0 (<a href="https://github.com/tailwindlabs/tailwindcss/tree/HEAD/packages/tailwindcss/issues/19695">#19695</a>)</li> <li><a href="https://github.com/tailwindlabs/tailwindcss/commit/6118f4f6a796ece218d145b626770e3fb9163d91"><code>6118f4f</code></a> Fix/misc docs and tests (<a href="https://github.com/tailwindlabs/tailwindcss/tree/HEAD/packages/tailwindcss/issues/19652">#19652</a>)</li> <li><a href="https://github.com/tailwindlabs/tailwindcss/commit/5a4a7eba3a3db4f4a834f37a3e37624fe9c4daa7"><code>5a4a7eb</code></a> fix(canonicalize): prevent collapse cache pollution across calls (<a href="https://github.com/tailwindlabs/tailwindcss/tree/HEAD/packages/tailwindcss/issues/19675">#19675</a>)</li> <li><a href="https://github.com/tailwindlabs/tailwindcss/commit/d0a56128721b7be01703b7879056f38443239fc5"><code>d0a5612</code></a> Add mauve, olive, mist, and taupe color palettes (<a href="https://github.com/tailwindlabs/tailwindcss/tree/HEAD/packages/tailwindcss/issues/19627">#19627</a>)</li> <li><a href="https://github.com/tailwindlabs/tailwindcss/commit/d9fff9f5956433e362dc231ca16dcd77497def76"><code>d9fff9f</code></a> docs: update package README CI badge to main (<a href="https://github.com/tailwindlabs/tailwindcss/tree/HEAD/packages/tailwindcss/issues/19692">#19692</a>)</li> <li><a href="https://github.com/tailwindlabs/tailwindcss/commit/ed52d3e6c9c20ca2a1c23d57d346ac399ebe9400"><code>ed52d3e</code></a> feat: handle backslash in <code>@Utility</code> name (<a href="https://github.com/tailwindlabs/tailwindcss/tree/HEAD/packages/tailwindcss/issues/19626">#19626</a>)</li> <li><a href="https://github.com/tailwindlabs/tailwindcss/commit/6eb3b324340f451a14389b7ed97f43a264ad4487"><code>6eb3b32</code></a> Allow multiples of <code>.25</code> in <code>aspect-*</code> fractions (<a href="https://github.com/tailwindlabs/tailwindcss/tree/HEAD/packages/tailwindcss/issues/19688">#19688</a>)</li> <li><a href="https://github.com/tailwindlabs/tailwindcss/commit/8ed67bf5510d8435d2be766b25245abe15b3bcef"><code>8ed67bf</code></a> Fix Tailwind CSS package README GitHub links (<a href="https://github.com/tailwindlabs/tailwindcss/tree/HEAD/packages/tailwindcss/issues/19644">#19644</a>)</li> <li>Additional commits viewable in <a href="https://github.com/tailwindlabs/tailwindcss/commits/v4.2.1/packages/tailwindcss">compare view</a></li> </ul> </details> <details> <summary>Maintainer changes</summary> <p>This version was pushed to npm by [GitHub Actions](<a href="https://www.npmjs.com/~GitHub">https://www.npmjs.com/~GitHub</a> Actions), a new releaser for tailwindcss since your current version.</p> </details> <br /> Updates `eslint-plugin-mdx` from 3.6.2 to 3.7.0 <details> <summary>Release notes</summary> <p><em>Sourced from <a href="https://github.com/mdx-js/eslint-mdx/releases">eslint-plugin-mdx's releases</a>.</em></p> <blockquote> <h2>eslint-plugin-mdx@3.7.0</h2> <h3>Minor Changes</h3> <ul> <li><a href="https://redirect.github.com/mdx-js/eslint-mdx/pull/602">#602</a> <a href="https://github.com/mdx-js/eslint-mdx/commit/e189e74c4a9f77cea0c398800652dd897d5fa071"><code>e189e74</code></a> Thanks <a href="https://github.com/astrochemx"><code>@astrochemx</code></a>! - feat: <code>eslint</code> 10 support</li> </ul> <h3>Patch Changes</h3> <ul> <li> <p><a href="https://redirect.github.com/mdx-js/eslint-mdx/pull/606">#606</a> <a href="https://github.com/mdx-js/eslint-mdx/commit/a38199079b79ba787fd4c7e50a34b15615ac727b"><code>a381990</code></a> Thanks <a href="https://github.com/remcohaszing"><code>@remcohaszing</code></a>! - chore: use OIDC for publishing</p> </li> <li> <p>Updated dependencies [<a href="https://github.com/mdx-js/eslint-mdx/commit/a38199079b79ba787fd4c7e50a34b15615ac727b"><code>a381990</code></a>, <a href="https://github.com/mdx-js/eslint-mdx/commit/00a836938fed26c4bd95358d25a0f045fcee6245"><code>00a8369</code></a>]:</p> <ul> <li>eslint-mdx@3.7.0</li> </ul> </li> </ul> </blockquote> </details> <details> <summary>Commits</summary> <ul> <li><a href="https://github.com/mdx-js/eslint-mdx/commit/f717ff284a5fb8c6cf3c99318d0a1316686b9c8f"><code>f717ff2</code></a> chore: release package(s) (<a href="https://redirect.github.com/mdx-js/eslint-mdx/issues/603">#603</a>)</li> <li><a href="https://github.com/mdx-js/eslint-mdx/commit/a38199079b79ba787fd4c7e50a34b15615ac727b"><code>a381990</code></a> chore: use OIDC for publishing (<a href="https://redirect.github.com/mdx-js/eslint-mdx/issues/606">#606</a>)</li> <li><a href="https://github.com/mdx-js/eslint-mdx/commit/00a836938fed26c4bd95358d25a0f045fcee6245"><code>00a8369</code></a> fix: remove unneeded dependency upon uvu (<a href="https://redirect.github.com/mdx-js/eslint-mdx/issues/600">#600</a>)</li> <li><a href="https://github.com/mdx-js/eslint-mdx/commit/e189e74c4a9f77cea0c398800652dd897d5fa071"><code>e189e74</code></a> feat: <code>eslint</code> 10 support (<a href="https://redirect.github.com/mdx-js/eslint-mdx/issues/602">#602</a>)</li> <li>See full diff in <a href="https://github.com/mdx-js/eslint-mdx/compare/eslint-plugin-mdx@3.6.2...eslint-plugin-mdx@3.7.0">compare view</a></li> </ul> </details> <details> <summary>Maintainer changes</summary> <p>This version was pushed to npm by [GitHub Actions](<a href="https://www.npmjs.com/~GitHub">https://www.npmjs.com/~GitHub</a> Actions), a new releaser for eslint-plugin-mdx since your current version.</p> </details> <br /> Updates `@tailwindcss/cli` from 4.1.18 to 4.2.1 <details> <summary>Release notes</summary> <p><em>Sourced from <a href="https://github.com/tailwindlabs/tailwindcss/releases"><code>@tailwindcss/cli</code>'s releases</a>.</em></p> <blockquote> <h2>v4.2.1</h2> <h3>Fixed</h3> <ul> <li>Allow trailing dash in functional utility names for backwards compatibility (<a href="https://redirect.github.com/tailwindlabs/tailwindcss/pull/19696">#19696</a>)</li> <li>Properly detect classes containing <code>.</code> characters within curly braces in MDX files (<a href="https://redirect.github.com/tailwindlabs/tailwindcss/pull/19711">#19711</a>)</li> </ul> <h2>v4.2.0</h2> <h3>Added</h3> <ul> <li>Add mauve, olive, mist, and taupe color palettes to the default theme (<a href="https://redirect.github.com/tailwindlabs/tailwindcss/pull/19627">#19627</a>)</li> <li>Add <code>@tailwindcss/webpack</code> package to run Tailwind CSS as a webpack plugin (<a href="https://redirect.github.com/tailwindlabs/tailwindcss/pull/19610">#19610</a>)</li> <li>Add <code>pbs-*</code> and <code>pbe-*</code> utilities for <code>padding-block-start</code> and <code>padding-block-end</code> (<a href="https://redirect.github.com/tailwindlabs/tailwindcss/pull/19601">#19601</a>)</li> <li>Add <code>mbs-*</code> and <code>mbe-*</code> utilities for <code>margin-block-start</code> and <code>margin-block-end</code> (<a href="https://redirect.github.com/tailwindlabs/tailwindcss/pull/19601">#19601</a>)</li> <li>Add <code>scroll-pbs-*</code> and <code>scroll-pbe-*</code> utilities for <code>scroll-padding-block-start</code> and <code>scroll-padding-block-end</code> (<a href="https://redirect.github.com/tailwindlabs/tailwindcss/pull/19601">#19601</a>)</li> <li>Add <code>scroll-mbs-*</code> and <code>scroll-mbe-*</code> utilities for <code>scroll-margin-block-start</code> and <code>scroll-margin-block-end</code> (<a href="https://redirect.github.com/tailwindlabs/tailwindcss/pull/19601">#19601</a>)</li> <li>Add <code>border-bs-*</code> and <code>border-be-*</code> utilities for <code>border-block-start</code> and <code>border-block-end</code> (<a href="https://redirect.github.com/tailwindlabs/tailwindcss/pull/19601">#19601</a>)</li> <li>Add <code>inline-*</code>, <code>min-inline-*</code>, <code>max-inline-*</code> utilities for <code>inline-size</code>, <code>min-inline-size</code>, and <code>max-inline-size</code> (<a href="https://redirect.github.com/tailwindlabs/tailwindcss/pull/19612">#19612</a>)</li> <li>Add <code>block-*</code>, <code>min-block-*</code>, <code>max-block-*</code> utilities for <code>block-size</code>, <code>min-block-size</code>, and <code>max-block-size</code> (<a href="https://redirect.github.com/tailwindlabs/tailwindcss/pull/19612">#19612</a>)</li> <li>Add <code>inset-s-*</code>, <code>inset-e-*</code>, <code>inset-bs-*</code>, <code>inset-be-*</code> utilities for <code>inset-inline-start</code>, <code>inset-inline-end</code>, <code>inset-block-start</code>, and <code>inset-block-end</code> (<a href="https://redirect.github.com/tailwindlabs/tailwindcss/pull/19613">#19613</a>)</li> <li>Add <code>font-features-*</code> utility for <code>font-feature-settings</code> (<a href="https://redirect.github.com/tailwindlabs/tailwindcss/pull/19623">#19623</a>)</li> </ul> <h3>Fixed</h3> <ul> <li>Prevent double <code>@supports</code> wrapper for <code>color-mix</code> values (<a href="https://redirect.github.com/tailwindlabs/tailwindcss/pull/19450">#19450</a>)</li> <li>Allow whitespace around <code>@source inline()</code> argument (<a href="https://redirect.github.com/tailwindlabs/tailwindcss/pull/19461">#19461</a>)</li> <li>Emit comment when source maps are saved to files when using <code>@tailwindcss/cli</code> (<a href="https://redirect.github.com/tailwindlabs/tailwindcss/pull/19447">#19447</a>)</li> <li>Detect utilities containing capital letters followed by numbers (<a href="https://redirect.github.com/tailwindlabs/tailwindcss/pull/19465">#19465</a>)</li> <li>Fix class extraction for Rails' strict locals (<a href="https://redirect.github.com/tailwindlabs/tailwindcss/pull/19525">#19525</a>)</li> <li>Align <code>@Utility</code> name validation with Oxide scanner rules (<a href="https://redirect.github.com/tailwindlabs/tailwindcss/pull/19524">#19524</a>)</li> <li>Fix infinite loop when using <code>@variant</code> inside <code>@custom-variant</code> (<a href="https://redirect.github.com/tailwindlabs/tailwindcss/pull/19633">#19633</a>)</li> <li>Allow multiples of <code>.25</code> in <code>aspect-*</code> fractions (e.g. <code>aspect-8.5/11</code>) (<a href="https://redirect.github.com/tailwindlabs/tailwindcss/pull/19688">#19688</a>)</li> <li>Ensure changes to external files listed via <code>@source</code> trigger a full page reload when using <code>@tailwindcss/vite</code> (<a href="https://redirect.github.com/tailwindlabs/tailwindcss/pull/19670">#19670</a>)</li> <li>Improve performance of Oxide scanner in bigger projects by reducing file system walks (<a href="https://redirect.github.com/tailwindlabs/tailwindcss/pull/19632">#19632</a>)</li> <li>Ensure import aliases in Astro v5 work without crashing when using <code>@tailwindcss/vite</code> (<a href="https://redirect.github.com/tailwindlabs/tailwindcss/issues/19677">#19677</a>)</li> <li>Allow escape characters in <code>@Utility</code> names to improve support with formatters such as Biome (<a href="https://redirect.github.com/tailwindlabs/tailwindcss/pull/19626">#19626</a>)</li> <li>Fix incorrect canonicalization results when canonicalizing multiple times (<a href="https://redirect.github.com/tailwindlabs/tailwindcss/pull/19675">#19675</a>)</li> <li>Add <code>.jj</code> to default ignored content directories (<a href="https://redirect.github.com/tailwindlabs/tailwindcss/pull/19687">#19687</a>)</li> </ul> <h3>Deprecated</h3> <ul> <li>Deprecate <code>start-*</code> and <code>end-*</code> utilities in favor of <code>inset-s-*</code> and <code>inset-e-*</code> utilities (<a href="https://redirect.github.com/tailwindlabs/tailwindcss/pull/19613">#19613</a>)</li> </ul> </blockquote> </details> <details> <summary>Changelog</summary> <p><em>Sourced from <a href="https://github.com/tailwindlabs/tailwindcss/blob/main/CHANGELOG.md"><code>@tailwindcss/cli</code>'s changelog</a>.</em></p> <blockquote> <h2>[4.2.1] - 2026-02-23</h2> <h3>Fixed</h3> <ul> <li>Allow trailing dash in functional utility names for backwards compatibility (<a href="https://redirect.github.com/tailwindlabs/tailwindcss/pull/19696">#19696</a>)</li> <li>Properly detect classes containing <code>.</code> characters within curly braces in MDX files (<a href="https://redirect.github.com/tailwindlabs/tailwindcss/pull/19711">#19711</a>)</li> </ul> <h2>[4.2.0] - 2026-02-18</h2> <h3>Added</h3> <ul> <li>Add mauve, olive, mist, and taupe color palettes to the default theme (<a href="https://redirect.github.com/tailwindlabs/tailwindcss/pull/19627">#19627</a>)</li> <li>Add <code>@tailwindcss/webpack</code> package to run Tailwind CSS as a webpack plugin (<a href="https://redirect.github.com/tailwindlabs/tailwindcss/pull/19610">#19610</a>)</li> <li>Add <code>pbs-*</code> and <code>pbe-*</code> utilities for <code>padding-block-start</code> and <code>padding-block-end</code> (<a href="https://redirect.github.com/tailwindlabs/tailwindcss/pull/19601">#19601</a>)</li> <li>Add <code>mbs-*</code> and <code>mbe-*</code> utilities for <code>margin-block-start</code> and <code>margin-block-end</code> (<a href="https://redirect.github.com/tailwindlabs/tailwindcss/pull/19601">#19601</a>)</li> <li>Add <code>scroll-pbs-*</code> and <code>scroll-pbe-*</code> utilities for <code>scroll-padding-block-start</code> and <code>scroll-padding-block-end</code> (<a href="https://redirect.github.com/tailwindlabs/tailwindcss/pull/19601">#19601</a>)</li> <li>Add <code>scroll-mbs-*</code> and <code>scroll-mbe-*</code> utilities for <code>scroll-margin-block-start</code> and <code>scroll-margin-block-end</code> (<a href="https://redirect.github.com/tailwindlabs/tailwindcss/pull/19601">#19601</a>)</li> <li>Add <code>border-bs-*</code> and <code>border-be-*</code> utilities for <code>border-block-start</code> and <code>border-block-end</code> (<a href="https://redirect.github.com/tailwindlabs/tailwindcss/pull/19601">#19601</a>)</li> <li>Add <code>inline-*</code>, <code>min-inline-*</code>, <code>max-inline-*</code> utilities for <code>inline-size</code>, <code>min-inline-size</code>, and <code>max-inline-size</code> (<a href="https://redirect.github.com/tailwindlabs/tailwindcss/pull/19612">#19612</a>)</li> <li>Add <code>block-*</code>, <code>min-block-*</code>, <code>max-block-*</code> utilities for <code>block-size</code>, <code>min-block-size</code>, and <code>max-block-size</code> (<a href="https://redirect.github.com/tailwindlabs/tailwindcss/pull/19612">#19612</a>)</li> <li>Add <code>inset-s-*</code>, <code>inset-e-*</code>, <code>inset-bs-*</code>, <code>inset-be-*</code> utilities for <code>inset-inline-start</code>, <code>inset-inline-end</code>, <code>inset-block-start</code>, and <code>inset-block-end</code> (<a href="https://redirect.github.com/tailwindlabs/tailwindcss/pull/19613">#19613</a>)</li> <li>Add <code>font-features-*</code> utility for <code>font-feature-settings</code> (<a href="https://redirect.github.com/tailwindlabs/tailwindcss/pull/19623">#19623</a>)</li> </ul> <h3>Fixed</h3> <ul> <li>Prevent double <code>@supports</code> wrapper for <code>color-mix</code> values (<a href="https://redirect.github.com/tailwindlabs/tailwindcss/pull/19450">#19450</a>)</li> <li>Allow whitespace around <code>@source inline()</code> argument (<a href="https://redirect.github.com/tailwindlabs/tailwindcss/pull/19461">#19461</a>)</li> <li>Emit comment when source maps are saved to files when using <code>@tailwindcss/cli</code> (<a href="https://redirect.github.com/tailwindlabs/tailwindcss/pull/19447">#19447</a>)</li> <li>Detect utilities containing capital letters followed by numbers (<a href="https://redirect.github.com/tailwindlabs/tailwindcss/pull/19465">#19465</a>)</li> <li>Fix class extraction for Rails' strict locals (<a href="https://redirect.github.com/tailwindlabs/tailwindcss/pull/19525">#19525</a>)</li> <li>Align <code>@Utility</code> name validation with Oxide scanner rules (<a href="https://redirect.github.com/tailwindlabs/tailwindcss/pull/19524">#19524</a>)</li> <li>Fix infinite loop when using <code>@variant</code> inside <code>@custom-variant</code> (<a href="https://redirect.github.com/tailwindlabs/tailwindcss/pull/19633">#19633</a>)</li> <li>Allow multiples of <code>.25</code> in <code>aspect-*</code> fractions (e.g. <code>aspect-8.5/11</code>) (<a href="https://redirect.github.com/tailwindlabs/tailwindcss/pull/19688">#19688</a>)</li> <li>Ensure changes to external files listed via <code>@source</code> trigger a full page reload when using <code>@tailwindcss/vite</code> (<a href="https://redirect.github.com/tailwindlabs/tailwindcss/pull/19670">#19670</a>)</li> <li>Improve performance of Oxide scanner in bigger projects by reducing file system walks (<a href="https://redirect.github.com/tailwindlabs/tailwindcss/pull/19632">#19632</a>)</li> <li>Ensure import aliases in Astro v5 work without crashing when using <code>@tailwindcss/vite</code> (<a href="https://redirect.github.com/tailwindlabs/tailwindcss/issues/19677">#19677</a>)</li> <li>Allow escape characters in <code>@Utility</code> names to improve support with formatters such as Biome (<a href="https://redirect.github.com/tailwindlabs/tailwindcss/pull/19626">#19626</a>)</li> <li>Fix incorrect canonicalization results when canonicalizing multiple times (<a href="https://redirect.github.com/tailwindlabs/tailwindcss/pull/19675">#19675</a>)</li> <li>Add <code>.jj</code> to default ignored content directories (<a href="https://redirect.github.com/tailwindlabs/tailwindcss/pull/19687">#19687</a>)</li> </ul> <h3>Deprecated</h3> <ul> <li>Deprecate <code>start-*</code> and <code>end-*</code> utilities in favor of <code>inset-s-*</code> and <code>inset-e-*</code> utilities (<a href="https://redirect.github.com/tailwindlabs/tailwindcss/pull/19613">#19613</a>)</li> </ul> </blockquote> </details> <details> <summary>Commits</summary> <ul> <li><a href="https://github.com/tailwindlabs/tailwindcss/commit/1dce64ee7ec2e414c845b4e268ac3b9b89aaf0c8"><code>1dce64e</code></a> 4.2.1 (<a href="https://github.com/tailwindlabs/tailwindcss/tree/HEAD/packages/@tailwindcss-cli/issues/19714">#19714</a>)</li> <li><a href="https://github.com/tailwindlabs/tailwindcss/commit/1b16411919457ee47d38910fd07e134e9765eb4c"><code>1b16411</code></a> 4.2.0 (<a href="https://github.com/tailwindlabs/tailwindcss/tree/HEAD/packages/@tailwindcss-cli/issues/19695">#19695</a>)</li> <li><a href="https://github.com/tailwindlabs/tailwindcss/commit/d9c4cd8c7ca8f406644770a4e7731e8102ca2723"><code>d9c4cd8</code></a> Update enhanced-resolve 5.18.4 → 5.19.0 (minor) (<a href="https://github.com/tailwindlabs/tailwindcss/tree/HEAD/packages/@tailwindcss-cli/issues/19658">#19658</a>)</li> <li><a href="https://github.com/tailwindlabs/tailwindcss/commit/d9fff9f5956433e362dc231ca16dcd77497def76"><code>d9fff9f</code></a> docs: update package README CI badge to main (<a href="https://github.com/tailwindlabs/tailwindcss/tree/HEAD/packages/@tailwindcss-cli/issues/19692">#19692</a>)</li> <li><a href="https://github.com/tailwindlabs/tailwindcss/commit/8ed67bf5510d8435d2be766b25245abe15b3bcef"><code>8ed67bf</code></a> Fix Tailwind CSS package README GitHub links (<a href="https://github.com/tailwindlabs/tailwindcss/tree/HEAD/packages/@tailwindcss-cli/issues/19644">#19644</a>)</li> <li><a href="https://github.com/tailwindlabs/tailwindcss/commit/d6ad8dddcfa774b6b7963fb40ef08bdfffa9f1d9"><code>d6ad8dd</code></a> Update enhanced-resolve 5.18.3 → 5.18.4 (patch) (<a href="https://github.com/tailwindlabs/tailwindcss/tree/HEAD/packages/@tailwindcss-cli/issues/19462">#19462</a>)</li> <li><a href="https://github.com/tailwindlabs/tailwindcss/commit/219e019b2458a5441bf7e3cf54884ed8b888f3cc"><code>219e019</code></a> CLI: Emit comment when source maps are saved to files (<a href="https://github.com/tailwindlabs/tailwindcss/tree/HEAD/packages/@tailwindcss-cli/issues/19447">#19447</a>)</li> <li>See full diff in <a href="https://github.com/tailwindlabs/tailwindcss/commits/v4.2.1/packages/@tailwindcss-cli">compare view</a></li> </ul> </details> <br /> Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`. [//]: # (dependabot-automerge-start) [//]: # (dependabot-automerge-end) --- <details> <summary>Dependabot commands and options</summary> <br /> You can trigger Dependabot actions by commenting on this PR: - `@dependabot rebase` will rebase this PR - `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it - `@dependabot show <dependency name> ignore conditions` will show all of the ignore conditions of the specified dependency - `@dependabot ignore <dependency name> major version` will close this group update PR and stop Dependabot creating any more for the specific dependency's major version (unless you unignore this specific dependency's major version or upgrade to it yourself) - `@dependabot ignore <dependency name> minor version` will close this group update PR and stop Dependabot creating any more for the specific dependency's minor version (unless you unignore this specific dependency's minor version or upgrade to it yourself) - `@dependabot ignore <dependency name>` will close this group update PR and stop Dependabot creating any more for the specific dependency (unless you unignore this specific dependency or upgrade to it yourself) - `@dependabot unignore <dependency name>` will remove all of the ignore conditions of the specified dependency - `@dependabot unignore <dependency name> <ignore condition>` will remove the ignore condition of the specified dependency and ignore conditions </details> Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
* Add per blockId mutex to block controller resync * Pass initial termsize through to startJob
There may be more cases here that I don't know about, but this fixes a good chunk of them. This catches the CC "repaint" transaction and forces a scrollToBottom. That should handle context repaints and resize repaints. Also adds a new (hidden) terminal escape sequence debugger, and (in dev mode) adds a last 50 writes cache that can be used to look at and debug output.
…artial reads (#2945)
`WriteWaveHomeConfigFile()` previously used direct `os.WriteFile`, which
can expose truncation/partial-write states to the JSON file watcher.
This change switches config persistence to temp-file + rename semantics
and serializes writes through a single process-wide lock for config file
writes.
- **Atomic file write helper**
- Added `AtomicWriteFile()` in `pkg/util/fileutil/fileutil.go`.
- Writes to `<filename>.tmp` in the same directory, then renames to the
target path.
- Performs temp-file cleanup on error paths.
- Introduced a shared suffix constant (`TempFileSuffix`) used by
implementation/tests.
- **Config write path update**
- Updated `WriteWaveHomeConfigFile()` in `pkg/wconfig/settingsconfig.go`
to:
- Use a package-level mutex (`configWriteLock`) so only one config write
runs at a time (across all config files).
- Call `fileutil.AtomicWriteFile(...)` instead of direct
`os.WriteFile(...)`.
- **Focused coverage for atomic behavior**
- Added `pkg/util/fileutil/fileutil_test.go` with tests for:
- Successful atomic write (target file contains expected payload and no
leftover `.tmp` file).
- Rename-failure path cleanup (temp file is removed).
```go
func WriteWaveHomeConfigFile(fileName string, m waveobj.MetaMapType) error {
configWriteLock.Lock()
defer configWriteLock.Unlock()
fullFileName := filepath.Join(wavebase.GetWaveConfigDir(), fileName)
barr, err := jsonMarshalConfigInOrder(m)
if err != nil {
return err
}
return fileutil.AtomicWriteFile(fullFileName, barr, 0644)
}
```
<!-- START COPILOT CODING AGENT TIPS -->
---
🔒 GitHub Advanced Security automatically protects Copilot coding agent
pull requests. You can protect all pull requests by enabling Advanced
Security for your repositories. [Learn more about Advanced
Security.](https://gh.io/cca-advanced-security)
---------
Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>
Co-authored-by: sawka <2722291+sawka@users.noreply.github.com>
Bumps [rollup](https://github.com/rollup/rollup) from 4.50.1 to 4.59.0. <details> <summary>Release notes</summary> <p><em>Sourced from <a href="https://github.com/rollup/rollup/releases">rollup's releases</a>.</em></p> <blockquote> <h2>v4.59.0</h2> <h2>4.59.0</h2> <p><em>2026-02-22</em></p> <h3>Features</h3> <ul> <li>Throw when the generated bundle contains paths that would leave the output directory (<a href="https://redirect.github.com/rollup/rollup/issues/6276">#6276</a>)</li> </ul> <h3>Pull Requests</h3> <ul> <li><a href="https://redirect.github.com/rollup/rollup/pull/6275">#6275</a>: Validate bundle stays within output dir (<a href="https://github.com/lukastaegert"><code>@lukastaegert</code></a>)</li> </ul> <h2>v4.58.0</h2> <h2>4.58.0</h2> <p><em>2026-02-20</em></p> <h3>Features</h3> <ul> <li>Also support <code>__NO_SIDE_EFFECTS__</code> annotation before variable declarations declaring function expressions (<a href="https://redirect.github.com/rollup/rollup/issues/6272">#6272</a>)</li> </ul> <h3>Pull Requests</h3> <ul> <li><a href="https://redirect.github.com/rollup/rollup/pull/6256">#6256</a>: docs: document PreRenderedChunk properties including isDynamicEntry and isImplicitEntry (<a href="https://github.com/njg7194"><code>@njg7194</code></a>, <a href="https://github.com/lukastaegert"><code>@lukastaegert</code></a>)</li> <li><a href="https://redirect.github.com/rollup/rollup/pull/6259">#6259</a>: docs: Correct typo and improve sentence structure in docs for <code>output.experimentalMinChunkSize</code> (<a href="https://github.com/millerick"><code>@millerick</code></a>, <a href="https://github.com/lukastaegert"><code>@lukastaegert</code></a>)</li> <li><a href="https://redirect.github.com/rollup/rollup/pull/6260">#6260</a>: fix(deps): update rust crate swc_compiler_base to v47 (<a href="https://github.com/renovate"><code>@renovate</code></a>[bot], <a href="https://github.com/lukastaegert"><code>@lukastaegert</code></a>)</li> <li><a href="https://redirect.github.com/rollup/rollup/pull/6261">#6261</a>: fix(deps): lock file maintenance minor/patch updates (<a href="https://github.com/renovate"><code>@renovate</code></a>[bot], <a href="https://github.com/lukastaegert"><code>@lukastaegert</code></a>)</li> <li><a href="https://redirect.github.com/rollup/rollup/pull/6262">#6262</a>: Avoid unnecessary cloning of the code string (<a href="https://github.com/lukastaegert"><code>@lukastaegert</code></a>)</li> <li><a href="https://redirect.github.com/rollup/rollup/pull/6263">#6263</a>: fix(deps): update minor/patch updates (<a href="https://github.com/renovate"><code>@renovate</code></a>[bot], <a href="https://github.com/lukastaegert"><code>@lukastaegert</code></a>)</li> <li><a href="https://redirect.github.com/rollup/rollup/pull/6265">#6265</a>: chore(deps): lock file maintenance (<a href="https://github.com/renovate"><code>@renovate</code></a>[bot])</li> <li><a href="https://redirect.github.com/rollup/rollup/pull/6267">#6267</a>: fix(deps): update minor/patch updates (<a href="https://github.com/renovate"><code>@renovate</code></a>[bot])</li> <li><a href="https://redirect.github.com/rollup/rollup/pull/6268">#6268</a>: chore(deps): update dependency eslint-plugin-unicorn to v63 (<a href="https://github.com/renovate"><code>@renovate</code></a>[bot], <a href="https://github.com/lukastaegert"><code>@lukastaegert</code></a>)</li> <li><a href="https://redirect.github.com/rollup/rollup/pull/6269">#6269</a>: chore(deps): update dependency lru-cache to v11 (<a href="https://github.com/renovate"><code>@renovate</code></a>[bot])</li> <li><a href="https://redirect.github.com/rollup/rollup/pull/6270">#6270</a>: chore(deps): lock file maintenance (<a href="https://github.com/renovate"><code>@renovate</code></a>[bot])</li> <li><a href="https://redirect.github.com/rollup/rollup/pull/6272">#6272</a>: forward NO_SIDE_EFFECTS annotations to function expressions in variable declarations (<a href="https://github.com/lukastaegert"><code>@lukastaegert</code></a>)</li> </ul> <h2>v4.57.1</h2> <h2>4.57.1</h2> <p><em>2026-01-30</em></p> <h3>Bug Fixes</h3> <ul> <li>Fix heap corruption issue in Windows (<a href="https://redirect.github.com/rollup/rollup/issues/6251">#6251</a>)</li> <li>Ensure exports of a dynamic import are fully included when called from a try...catch (<a href="https://redirect.github.com/rollup/rollup/issues/6254">#6254</a>)</li> </ul> <h3>Pull Requests</h3> <ul> <li><a href="https://redirect.github.com/rollup/rollup/pull/6251">#6251</a>: fix: Isolate and cache <code>process.report.getReport()</code> calls in a child process for robust environment detection (<a href="https://github.com/alan-agius4"><code>@alan-agius4</code></a>, <a href="https://github.com/lukastaegert"><code>@lukastaegert</code></a>)</li> </ul> <!-- raw HTML omitted --> </blockquote> <p>... (truncated)</p> </details> <details> <summary>Changelog</summary> <p><em>Sourced from <a href="https://github.com/rollup/rollup/blob/master/CHANGELOG.md">rollup's changelog</a>.</em></p> <blockquote> <h2>4.59.0</h2> <p><em>2026-02-22</em></p> <h3>Features</h3> <ul> <li>Throw when the generated bundle contains paths that would leave the output directory (<a href="https://redirect.github.com/rollup/rollup/issues/6276">#6276</a>)</li> </ul> <h3>Pull Requests</h3> <ul> <li><a href="https://redirect.github.com/rollup/rollup/pull/6275">#6275</a>: Validate bundle stays within output dir (<a href="https://github.com/lukastaegert"><code>@lukastaegert</code></a>)</li> </ul> <h2>4.58.0</h2> <p><em>2026-02-20</em></p> <h3>Features</h3> <ul> <li>Also support <code>__NO_SIDE_EFFECTS__</code> annotation before variable declarations declaring function expressions (<a href="https://redirect.github.com/rollup/rollup/issues/6272">#6272</a>)</li> </ul> <h3>Pull Requests</h3> <ul> <li><a href="https://redirect.github.com/rollup/rollup/pull/6256">#6256</a>: docs: document PreRenderedChunk properties including isDynamicEntry and isImplicitEntry (<a href="https://github.com/njg7194"><code>@njg7194</code></a>, <a href="https://github.com/lukastaegert"><code>@lukastaegert</code></a>)</li> <li><a href="https://redirect.github.com/rollup/rollup/pull/6259">#6259</a>: docs: Correct typo and improve sentence structure in docs for <code>output.experimentalMinChunkSize</code> (<a href="https://github.com/millerick"><code>@millerick</code></a>, <a href="https://github.com/lukastaegert"><code>@lukastaegert</code></a>)</li> <li><a href="https://redirect.github.com/rollup/rollup/pull/6260">#6260</a>: fix(deps): update rust crate swc_compiler_base to v47 (<a href="https://github.com/renovate"><code>@renovate</code></a>[bot], <a href="https://github.com/lukastaegert"><code>@lukastaegert</code></a>)</li> <li><a href="https://redirect.github.com/rollup/rollup/pull/6261">#6261</a>: fix(deps): lock file maintenance minor/patch updates (<a href="https://github.com/renovate"><code>@renovate</code></a>[bot], <a href="https://github.com/lukastaegert"><code>@lukastaegert</code></a>)</li> <li><a href="https://redirect.github.com/rollup/rollup/pull/6262">#6262</a>: Avoid unnecessary cloning of the code string (<a href="https://github.com/lukastaegert"><code>@lukastaegert</code></a>)</li> <li><a href="https://redirect.github.com/rollup/rollup/pull/6263">#6263</a>: fix(deps): update minor/patch updates (<a href="https://github.com/renovate"><code>@renovate</code></a>[bot], <a href="https://github.com/lukastaegert"><code>@lukastaegert</code></a>)</li> <li><a href="https://redirect.github.com/rollup/rollup/pull/6265">#6265</a>: chore(deps): lock file maintenance (<a href="https://github.com/renovate"><code>@renovate</code></a>[bot])</li> <li><a href="https://redirect.github.com/rollup/rollup/pull/6267">#6267</a>: fix(deps): update minor/patch updates (<a href="https://github.com/renovate"><code>@renovate</code></a>[bot])</li> <li><a href="https://redirect.github.com/rollup/rollup/pull/6268">#6268</a>: chore(deps): update dependency eslint-plugin-unicorn to v63 (<a href="https://github.com/renovate"><code>@renovate</code></a>[bot], <a href="https://github.com/lukastaegert"><code>@lukastaegert</code></a>)</li> <li><a href="https://redirect.github.com/rollup/rollup/pull/6269">#6269</a>: chore(deps): update dependency lru-cache to v11 (<a href="https://github.com/renovate"><code>@renovate</code></a>[bot])</li> <li><a href="https://redirect.github.com/rollup/rollup/pull/6270">#6270</a>: chore(deps): lock file maintenance (<a href="https://github.com/renovate"><code>@renovate</code></a>[bot])</li> <li><a href="https://redirect.github.com/rollup/rollup/pull/6272">#6272</a>: forward NO_SIDE_EFFECTS annotations to function expressions in variable declarations (<a href="https://github.com/lukastaegert"><code>@lukastaegert</code></a>)</li> </ul> <h2>4.57.1</h2> <p><em>2026-01-30</em></p> <h3>Bug Fixes</h3> <ul> <li>Fix heap corruption issue in Windows (<a href="https://redirect.github.com/rollup/rollup/issues/6251">#6251</a>)</li> <li>Ensure exports of a dynamic import are fully included when called from a try...catch (<a href="https://redirect.github.com/rollup/rollup/issues/6254">#6254</a>)</li> </ul> <h3>Pull Requests</h3> <ul> <li><a href="https://redirect.github.com/rollup/rollup/pull/6251">#6251</a>: fix: Isolate and cache <code>process.report.getReport()</code> calls in a child process for robust environment detection (<a href="https://github.com/alan-agius4"><code>@alan-agius4</code></a>, <a href="https://github.com/lukastaegert"><code>@lukastaegert</code></a>)</li> <li><a href="https://redirect.github.com/rollup/rollup/pull/6252">#6252</a>: chore(deps): update dependency lru-cache to v11 (<a href="https://github.com/renovate"><code>@renovate</code></a>[bot])</li> <li><a href="https://redirect.github.com/rollup/rollup/pull/6253">#6253</a>: chore(deps): lock file maintenance minor/patch updates (<a href="https://github.com/renovate"><code>@renovate</code></a>[bot], <a href="https://github.com/lukastaegert"><code>@lukastaegert</code></a>)</li> <li><a href="https://redirect.github.com/rollup/rollup/pull/6254">#6254</a>: Fully include dynamic imports in a try-catch (<a href="https://github.com/lukastaegert"><code>@lukastaegert</code></a>)</li> </ul> <!-- raw HTML omitted --> </blockquote> <p>... (truncated)</p> </details> <details> <summary>Commits</summary> <ul> <li><a href="https://github.com/rollup/rollup/commit/ae846957f109690a866cc3e4c073613c338d3476"><code>ae84695</code></a> 4.59.0</li> <li><a href="https://github.com/rollup/rollup/commit/b39616e9175b3d9fc3977c99153174c490805a93"><code>b39616e</code></a> Update audit-resolve</li> <li><a href="https://github.com/rollup/rollup/commit/c60770d7aaf750e512c1b2774989ea4596e660b2"><code>c60770d</code></a> Validate bundle stays within output dir (<a href="https://redirect.github.com/rollup/rollup/issues/6275">#6275</a>)</li> <li><a href="https://github.com/rollup/rollup/commit/33f39c1f205ea2eadaf4b589e493453e2baa3662"><code>33f39c1</code></a> 4.58.0</li> <li><a href="https://github.com/rollup/rollup/commit/b61c40803b717854c1c28937e8098e5ad3c7b8ca"><code>b61c408</code></a> forward NO_SIDE_EFFECTS annotations to function expressions in variable decla...</li> <li><a href="https://github.com/rollup/rollup/commit/7f00689ec90e2cafb11c26eefbcac62343c936f6"><code>7f00689</code></a> Extend agent instructions</li> <li><a href="https://github.com/rollup/rollup/commit/e7b2b85af0901244ecc141b9d792c6db6b527ea4"><code>e7b2b85</code></a> chore(deps): lock file maintenance (<a href="https://redirect.github.com/rollup/rollup/issues/6270">#6270</a>)</li> <li><a href="https://github.com/rollup/rollup/commit/2aa5da9baf82211b8207d268c8751630cb766970"><code>2aa5da9</code></a> fix(deps): update minor/patch updates (<a href="https://redirect.github.com/rollup/rollup/issues/6267">#6267</a>)</li> <li><a href="https://github.com/rollup/rollup/commit/4319837c5448d0c10d89e9ded118888deec2eeec"><code>4319837</code></a> chore(deps): update dependency lru-cache to v11 (<a href="https://redirect.github.com/rollup/rollup/issues/6269">#6269</a>)</li> <li><a href="https://github.com/rollup/rollup/commit/c3b6b4bdc4f2ed978fa233132a526957e6513233"><code>c3b6b4b</code></a> chore(deps): update dependency eslint-plugin-unicorn to v63 (<a href="https://redirect.github.com/rollup/rollup/issues/6268">#6268</a>)</li> <li>Additional commits viewable in <a href="https://github.com/rollup/rollup/compare/v4.50.1...v4.59.0">compare view</a></li> </ul> </details> <details> <summary>Maintainer changes</summary> <p>This version was pushed to npm by [GitHub Actions](<a href="https://www.npmjs.com/~GitHub">https://www.npmjs.com/~GitHub</a> Actions), a new releaser for rollup since your current version.</p> </details> <details> <summary>Install script changes</summary> <p>This version modifies <code>prepare</code> script that runs during installation. Review the package contents before updating.</p> </details> <br /> [](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores) Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`. [//]: # (dependabot-automerge-start) [//]: # (dependabot-automerge-end) --- <details> <summary>Dependabot commands and options</summary> <br /> You can trigger Dependabot actions by commenting on this PR: - `@dependabot rebase` will rebase this PR - `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it - `@dependabot show <dependency name> ignore conditions` will show all of the ignore conditions of the specified dependency - `@dependabot ignore this major version` will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this minor version` will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this dependency` will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself) You can disable automated security fix PRs for this repo from the [Security Alerts page](https://github.com/wavetermdev/waveterm/network/alerts). </details> Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
…llback) (#2946)
The new color validator is used exclusively in the Electron/Chromium
frontend, so fallback parsing via temporary DOM elements is unnecessary.
This update tightens the implementation to rely on the browser-native
CSS capability check only.
- **Scope**
- Keep `validateCssColor(color: string): string` behavior unchanged
(returns normalized type for valid colors, throws on invalid).
- Remove non-Chromium fallback logic from validation path.
- **Implementation**
- **`frontend/util/color-validator.ts`**
- `isValidCssColor` now exclusively uses:
- `CSS.supports("color", color)`
- Removed fallback using `document.createElement(...).style.color`
assignment/parsing.
- **Behavioral contract (unchanged)**
- Valid values still return specific type strings (`hex`, `hex8`, `rgb`,
`rgba`, `hsl`, `keyword`, etc.).
- Invalid values still throw `Error("Invalid CSS color: ...")`.
```ts
function isValidCssColor(color: string): boolean {
if (typeof CSS == "undefined" || typeof CSS.supports != "function") {
return false;
}
return CSS.supports("color", color);
}
```
<!-- START COPILOT CODING AGENT TIPS -->
---
✨ Let Copilot coding agent [set things up for
you](https://github.com/wavetermdev/waveterm/issues/new?title=✨+Set+up+Copilot+instructions&body=Configure%20instructions%20for%20this%20repository%20as%20documented%20in%20%5BBest%20practices%20for%20Copilot%20coding%20agent%20in%20your%20repository%5D%28https://gh.io/copilot-coding-agent-tips%29%2E%0A%0A%3COnboard%20this%20repo%3E&assignees=copilot)
— coding agent works faster and does higher quality work when set up for
your repo.
---------
Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>
Co-authored-by: sawka <2722291+sawka@users.noreply.github.com>
Co-authored-by: sawka <mike@commandline.dev>
`FilesPage` was previously previewed through a special path because
`EditBashrcCommand` (Monaco via `CodeEditor`) threw in preview mode.
With preview/global handling now fixed, preview can run the real Files
onboarding flow end-to-end without command overrides.
- **Files preview now uses the real FilesPage path**
- `OnboardingPreview` renders `FilesPage` directly.
- Removed preview-only command injection/override behavior for Files
onboarding.
- **Reverted FilesPage customization**
- Dropped optional command renderer plumbing added for preview.
- Restored FilesPage to its original internal command rotation:
`EditBashrcCommand -> ViewShortcutsCommand -> ViewLogoCommand`.
- **Result**
- No Files-specific preview fork remains.
- Preview and production use the same FilesPage command lifecycle.
```tsx
const commands = [
(onComplete: () => void) => <EditBashrcCommand onComplete={onComplete} />,
(onComplete: () => void) => <ViewShortcutsCommand isMac={isMac} onComplete={onComplete} />,
(onComplete: () => void) => <ViewLogoCommand onComplete={onComplete} />,
];
```
<screenshot>

</screenshot>
<!-- START COPILOT CODING AGENT TIPS -->
---
✨ Let Copilot coding agent [set things up for
you](https://github.com/wavetermdev/waveterm/issues/new?title=✨+Set+up+Copilot+instructions&body=Configure%20instructions%20for%20this%20repository%20as%20documented%20in%20%5BBest%20practices%20for%20Copilot%20coding%20agent%20in%20your%20repository%5D%28https://gh.io/copilot-coding-agent-tips%29%2E%0A%0A%3COnboard%20this%20repo%3E&assignees=copilot)
— coding agent works faster and does higher quality work when set up for
your repo.
---------
Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>
Co-authored-by: sawka <2722291+sawka@users.noreply.github.com>
Co-authored-by: sawka <mike@commandline.dev>
…backend tests (#2961)
`makeHTTPClient(proxyURL)` had been duplicated across AI backends with
equivalent behavior. This change consolidates the logic into a single
helper in `aiutil` and updates backends to consume it, then removes
backend-local tests that only re-verified that shared utility behavior.
- **Shared client construction**
- Added `aiutil.MakeHTTPClient(proxyURL string) (*http.Client, error)`
in `pkg/aiusechat/aiutil/aiutil.go`.
- Standardizes proxy parsing and `http.Transport.Proxy` setup in one
place.
- Keeps streaming-safe client semantics (`Timeout: 0`) and existing
invalid proxy URL error behavior.
- **Backend refactor**
- Removed duplicated client/proxy setup blocks from:
- `pkg/aiusechat/openaichat/openaichat-backend.go`
- `pkg/aiusechat/gemini/gemini-backend.go`
- `pkg/aiusechat/openai/openai-backend.go`
- `pkg/aiusechat/anthropic/anthropic-backend.go`
- Replaced with direct calls to the shared helper.
- **Test cleanup**
- Deleted backend tests that only covered basic proxy client creation
and no backend-specific behavior:
- `pkg/aiusechat/openaichat/openaichat-backend_test.go`
- `pkg/aiusechat/gemini/gemini-backend_test.go`
```go
httpClient, err := aiutil.MakeHTTPClient(chatOpts.Config.ProxyURL)
if err != nil {
return nil, nil, nil, err
}
resp, err := httpClient.Do(req)
```
<!-- START COPILOT CODING AGENT TIPS -->
---
💬 We'd love your input! Share your thoughts on Copilot coding agent in
our [2 minute survey](https://gh.io/copilot-coding-agent-survey).
---------
Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>
Co-authored-by: sawka <2722291+sawka@users.noreply.github.com>
… align preview state wiring (#2965)
The onboarding preview was missing the first two pages in the
new-install flow (`InitPage` and `NoTelemetryStarPage`). This update
adds those views to the preview and aligns state access with the current
store pattern so they render correctly in preview mode.
- **Preview coverage**
- Added `InitPage` and `NoTelemetryStarPage` to
`frontend/preview/previews/onboarding.preview.tsx` so the full early
onboarding path is visible in the preview server.
- **Settings access modernization**
- Replaced full `settingsAtom` usage in `InitPage` with targeted
`useSettingsKeyAtom("telemetry:enabled")`.
- Removes broad settings dependency and uses the existing preview-safe
settings path.
- **Preview bootstrap state init**
- Added `ClientModel.getInstance().initialize(null)` in
`frontend/preview/preview.tsx` to ensure `clientAtom` is initialized in
preview runtime without backend client data.
```tsx
// onboarding.tsx
const telemetrySetting = useSettingsKeyAtom("telemetry:enabled");
const clientData = useAtomValue(ClientModel.getInstance().clientAtom);
const [telemetryEnabled, setTelemetryEnabled] = useState<boolean>(!!telemetrySetting);
// preview.tsx
setWaveWindowType("preview");
ClientModel.getInstance().initialize(null);
```
- **<screenshot>**
- 
<!-- START COPILOT CODING AGENT TIPS -->
---
🔒 GitHub Advanced Security automatically protects Copilot coding agent
pull requests. You can protect all pull requests by enabling Advanced
Security for your repositories. [Learn more about Advanced
Security.](https://gh.io/cca-advanced-security)
---------
Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>
Co-authored-by: sawka <2722291+sawka@users.noreply.github.com>
…d` through server, generated clients, and CLI (#2963)
This PR extends WSH RPC command signatures to support `ctx + 2+ typed
args` while preserving existing `ctx` and `ctx + 1 arg` behavior. It
also adds a concrete `TestMultiArgCommand` end-to-end so the generated
Go/TS client surfaces can be inspected and exercised from CLI.
- **RPC wire + dispatch model**
- Added `wshrpc.MultiArg` (`args []any`) as the over-the-wire envelope
for 2+ arg commands.
- Extended RPC metadata to track all command arg types
(`CommandDataTypes`) and exposed a helper for normalized access.
- Updated server adapter unmarshalling to:
- decode `MultiArg` for 2+ arg commands,
- validate arg count,
- re-unmarshal each arg into its declared type before invoking typed
handlers.
- Kept single-arg commands on the existing non-`MultiArg` path.
- **Code generation (Go + TS)**
- Go codegen now emits multi-parameter wrappers for 2+ arg methods and
packs payload as `wshrpc.MultiArg`.
- TS codegen now emits multi-parameter API methods and packs payload as
`{ args: [...] }`.
- 0/1-arg generation remains unchanged to avoid wire/API churn.
- **Concrete command added for validation**
- Added to `WshRpcInterface`:
- `TestMultiArgCommand(ctx context.Context, arg1 string, arg2 int, arg3
bool) (string, error)`
- Implemented in `wshserver` with deterministic formatted return output
including source + all args.
- Updated `wsh test` command to call `TestMultiArgCommand` and print the
returned string.
- **Focused coverage**
- Added/updated targeted tests around RPC metadata and Go/TS multi-arg
codegen behavior, including command declaration for `testmultiarg`.
Example generated call shape:
```go
func TestMultiArgCommand(w *wshutil.WshRpc, arg1 string, arg2 int, arg3 bool, opts *wshrpc.RpcOpts) (string, error) {
return sendRpcRequestCallHelper[string](
w,
"testmultiarg",
wshrpc.MultiArg{Args: []any{arg1, arg2, arg3}},
opts,
)
}
```
<!-- START COPILOT CODING AGENT TIPS -->
---
💡 You can make Copilot smarter by setting up custom instructions,
customizing its development environment and configuring Model Context
Protocol (MCP) servers. Learn more [Copilot coding agent
tips](https://gh.io/copilot-coding-agent-tips) in the docs.
---------
Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>
Co-authored-by: sawka <2722291+sawka@users.noreply.github.com>
Co-authored-by: sawka <mike@commandline.dev>
Dragging in the vertical tab bar had two UX artifacts: the drop marker
reserved layout space (leaving a visible accent gap above selected
tabs), and hover styling could remain on the old row after drop until
the mouse moved. This updates drag visuals to be overlay-based and
forces hover recalculation at drag end.
- **Drop marker moved out of flow (no selected-tab accent gap)**
- Replaced per-row in-flow divider placeholders with a single absolutely
positioned drop line in the scroll container.
- Drop line now aligns to actual tab boundaries (`offsetTop` /
`offsetHeight`) so it covers the divider location directly.
- **Drop target rendering simplified**
- Container is `relative`; marker is conditionally rendered only while
reordering.
- `dropLineTop` is tracked during drag events and used to position the
marker without affecting layout.
- **Stale hover state cleared after drop**
- Added a minimal drag-lifecycle reset mechanism (`hoverResetVersion`)
and used it in `VTab` keys.
- On drag end/drop, rows remount once, clearing browser-retained
`:hover` on the old index immediately.
```tsx
<VTab key={`${tab.id}:${hoverResetVersion}`} ... />
{dragTabId != null && dropIndex != null && dropLineTop != null && (
<div
className="pointer-events-none absolute left-0 right-0 border-t-2 border-accent/80"
style={{ top: dropLineTop, transform: "translateY(-1px)" }}
/>
)}
```
- **<screenshot>**
-
https://github.com/user-attachments/assets/8c25ef6f-c600-484e-a4fa-6ac83657b484
<!-- START COPILOT CODING AGENT TIPS -->
---
🔒 GitHub Advanced Security automatically protects Copilot coding agent
pull requests. You can protect all pull requests by enabling Advanced
Security for your repositories. [Learn more about Advanced
Security.](https://gh.io/cca-advanced-security)
---------
Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>
Co-authored-by: sawka <2722291+sawka@users.noreply.github.com>
This PR introduces a new frontend TreeView widget intended for
VSCode-style explorer use cases, without backend wiring yet. It provides
a reusable, backend-agnostic API with virtualization, flat visible-row
projection, and preview coverage under `frontend/preview`.
- **What this adds**
- New `TreeView` component in `frontend/app/treeview/treeview.tsx`
designed around:
- flat `visibleRows` projection with `depth` (not recursive render)
- TanStack Virtual row virtualization
- responsive width constraints + horizontal/vertical scrolling
- single-selection, expand/collapse, and basic keyboard navigation
- New preview: `frontend/preview/previews/treeview.preview.tsx` with
async mocked directory loading and width controls.
- Focused tests: `frontend/app/treeview/treeview.test.ts` for
projection/sorting/synthetic-row behavior.
- **Tree model + projection behavior**
- Defines a canonical `TreeNodeData` wrapper (separate from direct
`FileInfo` coupling) with:
- `id`, `parentId`, `isDirectory`, `mimeType`, flags, `childrenStatus`,
`childrenIds`, `capInfo`
- Builds `visibleRows` from `nodesById + expandedIds` and injects
synthetic rows for:
- `loading`
- `error`
- `capped` (“Showing first N entries”)
- **Interaction model implemented**
- Click: select row
- Double-click directory (or chevron click): expand/collapse
- Double-click file: emits `onOpenFile`
- Keyboard:
- Up/Down: move visible selection
- Left: collapse selected dir or move to parent
- Right: expand selected dir or move to first child
- **Sorting + icon strategy**
- Child sorting is deterministic and stable:
- directories first
- case-insensitive label order
- id/path tie-breaker
- Icon resolution supports directory/file/error states and simple
mimetype/extension fallbacks.
- **Example usage**
```tsx
<TreeView
rootIds={["workspace:/"]}
initialNodes={{ "workspace:/": { id: "workspace:/", isDirectory: true, childrenStatus: "unloaded" } }}
fetchDir={async (id, limit) => ({ nodes: data[id].slice(0, limit), capped: data[id].length > limit })}
maxDirEntries={120}
minWidth={100}
maxWidth={400}
height={420}
onSelectionChange={(id) => setSelection(id)}
/>
```
- **<screenshot>**
-
https://github.com/user-attachments/assets/6f8b8a2a-f9a1-454d-bf4f-1d4a97b6e123
<!-- START COPILOT CODING AGENT TIPS -->
---
💬 We'd love your input! Share your thoughts on Copilot coding agent in
our [2 minute survey](https://gh.io/copilot-coding-agent-survey).
---------
Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>
Co-authored-by: sawka <2722291+sawka@users.noreply.github.com>
Bumps [immutable](https://github.com/immutable-js/immutable-js) from 5.1.3 to 5.1.5. <details> <summary>Release notes</summary> <p><em>Sourced from <a href="https://github.com/immutable-js/immutable-js/releases">immutable's releases</a>.</em></p> <blockquote> <h2>v5.1.5</h2> <h2>What's Changed</h2> <ul> <li>Fix Improperly Controlled Modification of Object Prototype Attributes ('Prototype Pollution') in immutable</li> <li>Upgrade devtools and use immutable version by <a href="https://github.com/jdeniau"><code>@jdeniau</code></a> in <a href="https://redirect.github.com/immutable-js/immutable-js/pull/2158">immutable-js/immutable-js#2158</a></li> </ul> <p><strong>Full Changelog</strong>: <a href="https://github.com/immutable-js/immutable-js/compare/v5.1.4...v5.1.5">https://github.com/immutable-js/immutable-js/compare/v5.1.4...v5.1.5</a></p> <h2>v5.1.4</h2> <h2>What's Changed</h2> <ul> <li>Migrate some files to TS by <a href="https://github.com/jdeniau"><code>@jdeniau</code></a> in <a href="https://redirect.github.com/immutable-js/immutable-js/pull/2125">immutable-js/immutable-js#2125</a> <ul> <li>Iterator.ts</li> <li>PairSorting.ts</li> <li>toJS.ts</li> <li>Math.ts</li> <li>Hash.ts</li> </ul> </li> <li>Extract CollectionHelperMethods and convert to TS by <a href="https://github.com/jdeniau"><code>@jdeniau</code></a> in <a href="https://redirect.github.com/immutable-js/immutable-js/pull/2131">immutable-js/immutable-js#2131</a></li> <li>Use npm <a href="https://docs.npmjs.com/trusted-publishers">trusted publishing only</a> to avoid token stealing.</li> </ul> <h3>Documentation</h3> <ul> <li>Fix/a11y issues by <a href="https://github.com/lyannel"><code>@lyannel</code></a> in <a href="https://redirect.github.com/immutable-js/immutable-js/pull/2136">immutable-js/immutable-js#2136</a></li> <li>Doc add Map.get signature update by <a href="https://github.com/borracciaBlu"><code>@borracciaBlu</code></a> in <a href="https://redirect.github.com/immutable-js/immutable-js/pull/2138">immutable-js/immutable-js#2138</a></li> <li>fix(doc):minor-issues#2132 by <a href="https://github.com/JayMeDotDot"><code>@JayMeDotDot</code></a> in <a href="https://redirect.github.com/immutable-js/immutable-js/pull/2133">immutable-js/immutable-js#2133</a></li> <li>Fix algolia search by <a href="https://github.com/jdeniau"><code>@jdeniau</code></a> in <a href="https://redirect.github.com/immutable-js/immutable-js/pull/2135">immutable-js/immutable-js#2135</a></li> <li>Typo in OrderedMap by <a href="https://github.com/jdeniau"><code>@jdeniau</code></a> in <a href="https://redirect.github.com/immutable-js/immutable-js/pull/2144">immutable-js/immutable-js#2144</a></li> </ul> <h3>Internal</h3> <ul> <li>chore: Sort all imports and activate eslint import rule by <a href="https://github.com/jdeniau"><code>@jdeniau</code></a> in <a href="https://redirect.github.com/immutable-js/immutable-js/pull/2119">immutable-js/immutable-js#2119</a></li> </ul> <h2>New Contributors</h2> <ul> <li><a href="https://github.com/JayMeDotDot"><code>@JayMeDotDot</code></a> made their first contribution in <a href="https://redirect.github.com/immutable-js/immutable-js/pull/2133">immutable-js/immutable-js#2133</a></li> <li><a href="https://github.com/lyannel"><code>@lyannel</code></a> made their first contribution in <a href="https://redirect.github.com/immutable-js/immutable-js/pull/2136">immutable-js/immutable-js#2136</a></li> <li><a href="https://github.com/borracciaBlu"><code>@borracciaBlu</code></a> made their first contribution in <a href="https://redirect.github.com/immutable-js/immutable-js/pull/2138">immutable-js/immutable-js#2138</a></li> </ul> <p><strong>Full Changelog</strong>: <a href="https://github.com/immutable-js/immutable-js/compare/v5.1.3...v5.1.4">https://github.com/immutable-js/immutable-js/compare/v5.1.3...v5.1.4</a></p> </blockquote> </details> <details> <summary>Changelog</summary> <p><em>Sourced from <a href="https://github.com/immutable-js/immutable-js/blob/main/CHANGELOG.md">immutable's changelog</a>.</em></p> <blockquote> <h2>5.1.5</h2> <ul> <li>Fix Improperly Controlled Modification of Object Prototype Attributes ('Prototype Pollution') in immutable</li> </ul> <h2>5.1.4</h2> <ul> <li>Migrate some files to TS by <a href="https://github.com/jdeniau"><code>@jdeniau</code></a> in <a href="https://redirect.github.com/immutable-js/immutable-js/pull/2125">immutable-js/immutable-js#2125</a> <ul> <li>Iterator.ts</li> <li>PairSorting.ts</li> <li>toJS.ts</li> <li>Math.ts</li> <li>Hash.ts</li> </ul> </li> <li>Extract CollectionHelperMethods and convert to TS by <a href="https://github.com/jdeniau"><code>@jdeniau</code></a> in <a href="https://redirect.github.com/immutable-js/immutable-js/pull/2131">immutable-js/immutable-js#2131</a></li> <li>Use npm <a href="https://docs.npmjs.com/trusted-publishers">trusted publishing only</a> to avoid token stealing.</li> </ul> <h3>Documentation</h3> <ul> <li>Fix/a11y issues by <a href="https://github.com/lyannel"><code>@lyannel</code></a> in <a href="https://redirect.github.com/immutable-js/immutable-js/pull/2136">immutable-js/immutable-js#2136</a></li> <li>Doc add Map.get signature update by <a href="https://github.com/borracciaBlu"><code>@borracciaBlu</code></a> in <a href="https://redirect.github.com/immutable-js/immutable-js/pull/2138">immutable-js/immutable-js#2138</a></li> <li>fix(doc):minor-issues#2132 by <a href="https://github.com/JayMeDotDot"><code>@JayMeDotDot</code></a> in <a href="https://redirect.github.com/immutable-js/immutable-js/pull/2133">immutable-js/immutable-js#2133</a></li> <li>Fix algolia search by <a href="https://github.com/jdeniau"><code>@jdeniau</code></a> in <a href="https://redirect.github.com/immutable-js/immutable-js/pull/2135">immutable-js/immutable-js#2135</a></li> <li>Typo in OrderedMap by <a href="https://github.com/jdeniau"><code>@jdeniau</code></a> in <a href="https://redirect.github.com/immutable-js/immutable-js/pull/2144">immutable-js/immutable-js#2144</a></li> </ul> <h3>Internal</h3> <ul> <li>chore: Sort all imports and activate eslint import rule by <a href="https://github.com/jdeniau"><code>@jdeniau</code></a> in <a href="https://redirect.github.com/immutable-js/immutable-js/pull/2119">immutable-js/immutable-js#2119</a></li> </ul> </blockquote> </details> <details> <summary>Commits</summary> <ul> <li><a href="https://github.com/immutable-js/immutable-js/commit/b37b85568632227751ddc8a16034cacc0f42b652"><code>b37b855</code></a> 5.1.5</li> <li><a href="https://github.com/immutable-js/immutable-js/commit/16b3313fdf2c5f579f10799e22869f6909abf945"><code>16b3313</code></a> Merge commit from fork</li> <li><a href="https://github.com/immutable-js/immutable-js/commit/fd2ef4977ee654c5bf26368dbf2f983c8d679bd6"><code>fd2ef49</code></a> fix new proto key injection</li> <li><a href="https://github.com/immutable-js/immutable-js/commit/6734b7b2af7e9dadf517eb9473cc64d2dfe2e301"><code>6734b7b</code></a> fix Prototype Pollution in mergeDeep, toJS, etc.</li> <li><a href="https://github.com/immutable-js/immutable-js/commit/6f772de1e44dcde14128e48d19081a7a077f2162"><code>6f772de</code></a> Merge pull request <a href="https://redirect.github.com/immutable-js/immutable-js/issues/2175">#2175</a> from immutable-js/dependabot/npm_and_yarn/rollup-4.59.0</li> <li><a href="https://github.com/immutable-js/immutable-js/commit/5f3dc61fd0e231654f04a850b8764e7e864c54b3"><code>5f3dc61</code></a> Bump rollup from 4.34.8 to 4.59.0</li> <li><a href="https://github.com/immutable-js/immutable-js/commit/049a594410962c13dfd0f2d0bf0ef2154271079e"><code>049a594</code></a> Merge pull request <a href="https://redirect.github.com/immutable-js/immutable-js/issues/2173">#2173</a> from immutable-js/dependabot/npm_and_yarn/lodash-4.1...</li> <li><a href="https://github.com/immutable-js/immutable-js/commit/2481a77331122eea4ace8afd4842042c6ae7510c"><code>2481a77</code></a> Merge pull request <a href="https://redirect.github.com/immutable-js/immutable-js/issues/2172">#2172</a> from mrazauskas/update-tstyche</li> <li><a href="https://github.com/immutable-js/immutable-js/commit/eb047790b44dac8e5ace49529a5c9928edfc8e12"><code>eb04779</code></a> Bump lodash from 4.17.21 to 4.17.23</li> <li><a href="https://github.com/immutable-js/immutable-js/commit/b973bf3b6242c9966143169825e1e14248c07c31"><code>b973bf3</code></a> format</li> <li>Additional commits viewable in <a href="https://github.com/immutable-js/immutable-js/compare/v5.1.3...v5.1.5">compare view</a></li> </ul> </details> <details> <summary>Maintainer changes</summary> <p>This version was pushed to npm by [GitHub Actions](<a href="https://www.npmjs.com/~GitHub">https://www.npmjs.com/~GitHub</a> Actions), a new releaser for immutable since your current version.</p> </details> <br /> [](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores) Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`. [//]: # (dependabot-automerge-start) [//]: # (dependabot-automerge-end) --- <details> <summary>Dependabot commands and options</summary> <br /> You can trigger Dependabot actions by commenting on this PR: - `@dependabot rebase` will rebase this PR - `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it - `@dependabot show <dependency name> ignore conditions` will show all of the ignore conditions of the specified dependency - `@dependabot ignore this major version` will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this minor version` will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this dependency` will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself) You can disable automated security fix PRs for this repo from the [Security Alerts page](https://github.com/wavetermdev/waveterm/network/alerts). </details> Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
AppsFloatingWindow currently lists local apps but does not provide an
in-context way to open the app builder picker. This change adds a bottom
ghost-style action strip (`+ Build/Edit Apps`) that launches the builder
via Electron preload with `openBuilder(null)`.
- **What changed**
- Added a new bottom strip action inside `AppsFloatingWindow`:
- Label: `+ Build/Edit Apps`
- Visual style: ghost-like footer strip with top border, hover state,
full-width click target
- Wired the strip to call the preload API and close the floating window:
- `getApi().openBuilder(null)` (`null` app id opens the app picker)
- Kept the change scoped to `frontend/app/workspace/widgets.tsx` with no
behavior changes to app-grid item launching.
- **Implementation detail**
- Imported `getApi` from `@/store/global`
- Added a memoized handler for builder launch:
```tsx
const handleOpenBuilder = useCallback(() => {
getApi().openBuilder(null);
onClose();
}, [onClose]);
```
- **UI preview**
-
<screenshot>https://github.com/user-attachments/assets/1448588f-ff1d-41b5-af72-2849135ca1f3</screenshot>
<!-- START COPILOT CODING AGENT TIPS -->
---
✨ Let Copilot coding agent [set things up for
you](https://github.com/wavetermdev/waveterm/issues/new?title=✨+Set+up+Copilot+instructions&body=Configure%20instructions%20for%20this%20repository%20as%20documented%20in%20%5BBest%20practices%20for%20Copilot%20coding%20agent%20in%20your%20repository%5D%28https://gh.io/copilot-coding-agent-tips%29%2E%0A%0A%3COnboard%20this%20repo%3E&assignees=copilot)
— coding agent works faster and does higher quality work when set up for
your repo.
---------
Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>
Co-authored-by: sawka <2722291+sawka@users.noreply.github.com>
Co-authored-by: sawka <mike@commandline.dev>
…tream robustness (#2971)
This updates `pkg/aiusechat/anthropic` from partial implementation to
full backend parity for core tool-use orchestration and stream behavior.
The main gaps were unimplemented tool lifecycle methods, missing
persisted tool-use UI state, and weaker disconnect/error handling versus
the OpenAI backend.
- **Tool-use lifecycle parity (critical path)**
- Implemented Anthropic backend support for:
- `UpdateToolUseData`
- `RemoveToolUseCall`
- `GetFunctionCallInputByToolCallId`
- Wired `pkg/aiusechat/usechat-backend.go` to call Anthropic
implementations instead of stubs.
- Added Anthropic run-step nil-message guard so `nil` responses are not
wrapped into `[]GenAIMessage{nil}`.
- **Persisted tool-use state in Anthropic native messages**
- Added internal `ToolUseData` storage on Anthropic `tool_use` blocks.
- Ensured internal-only fields are stripped before API requests via
`Clean()`.
- **UI conversion parity for reloaded history**
- Extended `ConvertToUIMessage()` to emit `data-tooluse` parts when
tool-use metadata exists, in addition to `tool-{name}` parts.
- **Streaming UX parity for tool argument deltas**
- Added `aiutil.SendToolProgress(...)` calls during:
- `input_json_delta` (incremental updates)
- `content_block_stop` for `tool_use` (final update)
- **Disconnect/stream robustness**
- Added `sse.Err()` checks in event handling and decode-error path.
- Added partial-text extraction on client disconnect and deterministic
ordering of partial blocks.
- Cleans up completed blocks from in-flight state to avoid duplicate
partial extraction.
- **Correctness + hygiene alignment**
- Continuation model checks now use `AreModelsCompatible(...)` (instead
of strict string equality).
- Added hostname sanitization in Anthropic error paths (HTTP error
parsing and `httpClient.Do` failures).
- Replaced unconditional Anthropic debug `log.Printf` calls with
`logutil.DevPrintf`.
- **Targeted coverage additions**
- Added Anthropic tests for:
- function-call lookup by tool call id
- tool-use data update + removal
- `data-tooluse` UI conversion behavior
```go
// usechat-backend.go
func (b *anthropicBackend) RunChatStep(...) (..., []uctypes.GenAIMessage, ...) {
stopReason, msg, rateLimitInfo, err := anthropic.RunAnthropicChatStep(ctx, sseHandler, chatOpts, cont)
if msg == nil {
return stopReason, nil, rateLimitInfo, err
}
return stopReason, []uctypes.GenAIMessage{msg}, rateLimitInfo, err
}
```
<!-- START COPILOT CODING AGENT TIPS -->
---
✨ Let Copilot coding agent [set things up for
you](https://github.com/wavetermdev/waveterm/issues/new?title=✨+Set+up+Copilot+instructions&body=Configure%20instructions%20for%20this%20repository%20as%20documented%20in%20%5BBest%20practices%20for%20Copilot%20coding%20agent%20in%20your%20repository%5D%28https://gh.io/copilot-coding-agent-tips%29%2E%0A%0A%3COnboard%20this%20repo%3E&assignees=copilot)
— coding agent works faster and does higher quality work when set up for
your repo.
---------
Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>
Co-authored-by: sawka <2722291+sawka@users.noreply.github.com>
Co-authored-by: sawka <mike@commandline.dev>
The issue called out that the OSC52 unit tests were mostly validating mock setup rather than meaningful behavior. This PR trims that low-signal coverage by removing the Vitest suite for OSC52. - **Scope** - Deleted `frontend/app/view/term/osc-handlers.test.ts`. - No production/runtime code changes. - **Rationale reflected in changes** - Removes brittle, mock-dominant tests for logic considered too simple for this unit-test shape. - Keeps the codebase focused on higher-value test coverage. ```diff - frontend/app/view/term/osc-handlers.test.ts ``` <!-- START COPILOT CODING AGENT TIPS --> --- ✨ Let Copilot coding agent [set things up for you](https://github.com/wavetermdev/waveterm/issues/new?title=✨+Set+up+Copilot+instructions&body=Configure%20instructions%20for%20this%20repository%20as%20documented%20in%20%5BBest%20practices%20for%20Copilot%20coding%20agent%20in%20your%20repository%5D%28https://gh.io/copilot-coding-agent-tips%29%2E%0A%0A%3COnboard%20this%20repo%3E&assignees=copilot) — coding agent works faster and does higher quality work when set up for your repo. --------- Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com> Co-authored-by: sawka <2722291+sawka@users.noreply.github.com>
`mousedown` activity signaling was structured such that async telemetry
concerns leaked into event handling. This change moves fire-and-forget
behavior to the model boundary and keeps telemetry failures non-fatal.
- **`mousedown` handler path**
- `AppKeyHandlers` now calls `GlobalModel.getInstance().setIsActive()`
directly (no async wrapper in the handler).
- **`GlobalModel.setIsActive` structure**
- `setIsActive()` is now synchronous (`void`).
- Throttle logic remains unchanged.
- Electron telemetry call is executed via `util.fireAndForget(...)`
inside `setIsActive()`.
- **Telemetry error containment**
- `getApi().setIsActive()` is wrapped in `try/catch` inside the
fire-and-forget callback.
- Errors are logged with `console.log("setIsActive error", e)` and do
not bubble.
- **Focused coverage**
- Added `frontend/app/store/global-model.test.ts` for:
- fire-and-forget invocation + throttling behavior
- error logging/swallowing on rejected telemetry call
```ts
setIsActive(): void {
const now = Date.now();
if (now - this.lastSetIsActiveTs < GlobalModel.IsActiveThrottleMs) {
return;
}
this.lastSetIsActiveTs = now;
util.fireAndForget(async () => {
try {
await getApi().setIsActive();
} catch (e) {
console.log("setIsActive error", e);
}
});
}
```
<!-- START COPILOT CODING AGENT TIPS -->
---
🔒 GitHub Advanced Security automatically protects Copilot coding agent
pull requests. You can protect all pull requests by enabling Advanced
Security for your repositories. [Learn more about Advanced
Security.](https://gh.io/cca-advanced-security)
---------
Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>
Co-authored-by: sawka <2722291+sawka@users.noreply.github.com>
Co-authored-by: sawka <mike@commandline.dev>
Bumps [electron](https://github.com/electron/electron) from 40.4.1 to 41.0.2. <details> <summary>Release notes</summary> <p><em>Sourced from <a href="https://github.com/electron/electron/releases">electron's releases</a>.</em></p> <blockquote> <h2>electron v41.0.2</h2> <h1>Release Notes for v41.0.2</h1> <h2>Other Changes</h2> <ul> <li>Backported fix for b/491421267. <a href="https://redirect.github.com/electron/electron/pull/50234">#50234</a></li> </ul> <h2>electron v41.0.1</h2> <h1>Release Notes for v41.0.1</h1> <h2>Fixes</h2> <ul> <li>Fixed an issue on macOS where calling <code>autoUpdater.quitAndInstall()</code> could fail if <code>checkForUpdates()</code> was called again after an update was already downloaded. <a href="https://redirect.github.com/electron/electron/pull/50217">#50217</a> <!-- raw HTML omitted -->(Also in <a href="https://redirect.github.com/electron/electron/pull/50215">39</a>, <a href="https://redirect.github.com/electron/electron/pull/50216">40</a>)<!-- raw HTML omitted --></li> <li>Fixed an issue where traffic light buttons would flash at position (0,0) when restoring a window with a custom <code>trafficLightPosition</code> from minimization on macOS. <a href="https://redirect.github.com/electron/electron/pull/50209">#50209</a> <!-- raw HTML omitted -->(Also in <a href="https://redirect.github.com/electron/electron/pull/50208">39</a>, <a href="https://redirect.github.com/electron/electron/pull/50207">40</a>)<!-- raw HTML omitted --></li> <li>Fixed bug where opening a message box immediately upon closing a child window may cause the parent window to freeze on Windows. <a href="https://redirect.github.com/electron/electron/pull/50191">#50191</a> <!-- raw HTML omitted -->(Also in <a href="https://redirect.github.com/electron/electron/pull/50190">39</a>, <a href="https://redirect.github.com/electron/electron/pull/50189">40</a>)<!-- raw HTML omitted --></li> </ul> <h2>Other Changes</h2> <ul> <li>Updated Chromium to 146.0.7680.72. <a href="https://redirect.github.com/electron/electron/pull/50196">#50196</a></li> </ul> <h2>electron v41.0.0</h2> <h1>Release Notes for v41.0.0</h1> <h2>Stack Upgrades</h2> <ul> <li>Chromium <code>146.0.7680.65</code> <ul> <li><a href="https://developer.chrome.com/blog/new-in-chrome-146/">New in 146</a></li> <li><a href="https://developer.chrome.com/blog/new-in-chrome-145/">New in 145</a></li> </ul> </li> <li>Node <code>v24.14.0</code> <ul> <li><a href="https://nodejs.org/en/blog/release/v24.14.0/">Node 24.14.0 blog post</a></li> </ul> </li> <li>V8 <code>14.6</code></li> </ul> <h2>Breaking Changes</h2> <ul> <li>Fixed an issue where cookie changed events weren't properly emitted in all cases. <a href="https://redirect.github.com/electron/electron/pull/49631">#49631</a></li> </ul> <p><em>For breaking changes inherited via Chromium, see blog post</em></p> <h2>Features</h2> <h3>Additions</h3> <ul> <li>Added --disable-geolocation command-line flag for macOS apps to disable location services. <a href="https://redirect.github.com/electron/electron/pull/45934">#45934</a></li> <li>Added NV12 support for import shared texture. <a href="https://redirect.github.com/electron/electron/pull/48922">#48922</a> <!-- raw HTML omitted -->(Also in <a href="https://redirect.github.com/electron/electron/pull/49040">40</a>)<!-- raw HTML omitted --></li> <li>Added <code>webContents.getOrCreateDevToolsTargetId()</code>. <a href="https://redirect.github.com/electron/electron/pull/50176">#50176</a></li> <li>Added a <code>disclaim</code> option to the UtilityProcess API to allow for TCC disclaiming on macOS. <a href="https://redirect.github.com/electron/electron/pull/49693">#49693</a> <!-- raw HTML omitted -->(Also in <a href="https://redirect.github.com/electron/electron/pull/49696">39</a>, <a href="https://redirect.github.com/electron/electron/pull/49695">40</a>)<!-- raw HTML omitted --></li> <li>Added a <code>reason</code> property to the Notification 'closed' event on Windows to allow developers to know the reason the Notification was dismissed. <a href="https://redirect.github.com/electron/electron/pull/50029">#50029</a> <!-- raw HTML omitted -->(Also in <a href="https://redirect.github.com/electron/electron/pull/50030">40</a>)<!-- raw HTML omitted --></li> <li>Added additional defence against privileged user modifications to ASAR Integrity protected applications on macOS. <a href="https://redirect.github.com/electron/electron/pull/48587">#48587</a></li> <li>Added an <code>usePrinterDefaultPageSize</code> option to <code>webContents.print()</code> to allow using the printer's default page size. <a href="https://redirect.github.com/electron/electron/pull/49812">#49812</a></li> <li>Added bypassCustomProtocolHandlers option to net.request. <a href="https://redirect.github.com/electron/electron/pull/47331">#47331</a> <!-- raw HTML omitted -->(Also in <a href="https://redirect.github.com/electron/electron/pull/48881">38</a>, <a href="https://redirect.github.com/electron/electron/pull/48882">39</a>, <a href="https://redirect.github.com/electron/electron/pull/48883">40</a>)<!-- raw HTML omitted --></li> <li>Added support for MSIX auto-updating. <a href="https://redirect.github.com/electron/electron/pull/49586">#49586</a> <!-- raw HTML omitted -->(Also in <a href="https://redirect.github.com/electron/electron/pull/49585">39</a>, <a href="https://redirect.github.com/electron/electron/pull/49587">40</a>)<!-- raw HTML omitted --></li> <li>Added support for WebSocket authentication through the <code>login</code> event on <code>webContents</code>. <a href="https://redirect.github.com/electron/electron/pull/48512">#48512</a> <!-- raw HTML omitted -->(Also in <a href="https://redirect.github.com/electron/electron/pull/49065">39</a>, <a href="https://redirect.github.com/electron/electron/pull/49064">40</a>)<!-- raw HTML omitted --></li> <li>Added support for <code>--experimental-transform-types</code>. <a href="https://redirect.github.com/electron/electron/pull/49882">#49882</a> <!-- raw HTML omitted -->(Also in <a href="https://redirect.github.com/electron/electron/pull/49881">39</a>, <a href="https://redirect.github.com/electron/electron/pull/49883">40</a>)<!-- raw HTML omitted --></li> <li>Added support for <code>long-animation-frame</code> script attribution (via <code>--enable-features=AlwaysLogLOAFURL</code>). <a href="https://redirect.github.com/electron/electron/pull/49773">#49773</a> <!-- raw HTML omitted -->(Also in <a href="https://redirect.github.com/electron/electron/pull/49771">39</a>, <a href="https://redirect.github.com/electron/electron/pull/49772">40</a>)<!-- raw HTML omitted --></li> </ul> <!-- raw HTML omitted --> </blockquote> <p>... (truncated)</p> </details> <details> <summary>Commits</summary> <ul> <li><a href="https://github.com/electron/electron/commit/42d7f2783b9fed44d8a2b0ed8eaf850991c3417f"><code>42d7f27</code></a> chore: cherry-pick d5b0cb2acffe from v8 (<a href="https://redirect.github.com/electron/electron/issues/50233">#50233</a>)</li> <li><a href="https://github.com/electron/electron/commit/61b4c6b93e4d60c1784f9e5c1d5ea614c74e505c"><code>61b4c6b</code></a> chore: cherry-pick 248acd90d9a3 from skia (<a href="https://redirect.github.com/electron/electron/issues/50234">#50234</a>)</li> <li><a href="https://github.com/electron/electron/commit/b9ca21156b6f1a51caccd5e82a13877271a64b2d"><code>b9ca211</code></a> ci: add timeout to test step (<a href="https://redirect.github.com/electron/electron/issues/50206">#50206</a>)</li> <li><a href="https://github.com/electron/electron/commit/23960241f903a917c059cc8fa3bf9e7d185c3661"><code>2396024</code></a> fix: preserve staged update dir when pruning orphaned updates on macOS (<a href="https://redirect.github.com/electron/electron/issues/50217">#50217</a>)</li> <li><a href="https://github.com/electron/electron/commit/6d2986302c6e1dbab6e5982f0ab679c165c62d52"><code>6d29863</code></a> fix: prevent traffic light buttons flashing on deminiaturize (<a href="https://redirect.github.com/electron/electron/issues/50209">#50209</a>)</li> <li><a href="https://github.com/electron/electron/commit/01b99cd9a9a2ec3002f6e7c237161bf5168264f3"><code>01b99cd</code></a> docs: document Wayland frameless window shadow behaviour (<a href="https://redirect.github.com/electron/electron/issues/50195">#50195</a>)</li> <li><a href="https://github.com/electron/electron/commit/a8f64f684fade4170e04c1df608beab98a3c9200"><code>a8f64f6</code></a> chore: bump chromium to 146.0.7680.72 (41-x-y) (<a href="https://redirect.github.com/electron/electron/issues/50196">#50196</a>)</li> <li><a href="https://github.com/electron/electron/commit/ca1b77d9b777469e533edea7ea37684049d8ced1"><code>ca1b77d</code></a> fix: don't call <code>TaskDialogIndirect</code> with disabled parent windows (<a href="https://redirect.github.com/electron/electron/issues/50191">#50191</a>)</li> <li><a href="https://github.com/electron/electron/commit/3678edfa37648d832078c9430275e96f8b3afde1"><code>3678edf</code></a> feat: <code>WebContents.getOrCreateDevToolsTargetId()</code> (<a href="https://redirect.github.com/electron/electron/issues/50176">#50176</a>)</li> <li><a href="https://github.com/electron/electron/commit/cb4d31ae6128fd642c904ec69b85fd8688c1659b"><code>cb4d31a</code></a> fix: bind offscreen paint callback to child <code>WebContents</code> (<a href="https://redirect.github.com/electron/electron/issues/50152">#50152</a>)</li> <li>Additional commits viewable in <a href="https://github.com/electron/electron/compare/v40.4.1...v41.0.2">compare view</a></li> </ul> </details> <br /> [](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores) Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`. [//]: # (dependabot-automerge-start) [//]: # (dependabot-automerge-end) --- <details> <summary>Dependabot commands and options</summary> <br /> You can trigger Dependabot actions by commenting on this PR: - `@dependabot rebase` will rebase this PR - `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it - `@dependabot show <dependency name> ignore conditions` will show all of the ignore conditions of the specified dependency - `@dependabot ignore this major version` will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this minor version` will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this dependency` will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself) </details> Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Bumps [golang.org/x/term](https://github.com/golang/term) from 0.40.0 to 0.41.0. <details> <summary>Commits</summary> <ul> <li><a href="https://github.com/golang/term/commit/9d2dc074d2bdcb2229cbbaa0a252eace245a6489"><code>9d2dc07</code></a> go.mod: update golang.org/x dependencies</li> <li><a href="https://github.com/golang/term/commit/d954e03213327a5b6380b6c2aec621192ee56007"><code>d954e03</code></a> all: upgrade go directive to at least 1.25.0 [generated]</li> <li>See full diff in <a href="https://github.com/golang/term/compare/v0.40.0...v0.41.0">compare view</a></li> </ul> </details> <br /> [](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores) Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`. [//]: # (dependabot-automerge-start) [//]: # (dependabot-automerge-end) --- <details> <summary>Dependabot commands and options</summary> <br /> You can trigger Dependabot actions by commenting on this PR: - `@dependabot rebase` will rebase this PR - `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it - `@dependabot show <dependency name> ignore conditions` will show all of the ignore conditions of the specified dependency - `@dependabot ignore this major version` will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this minor version` will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this dependency` will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself) </details> Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
… (#3057) also adds a bit more defensiveness around using webContents.id.
Bumps [golang.org/x/crypto](https://github.com/golang/crypto) from 0.48.0 to 0.49.0. <details> <summary>Commits</summary> <ul> <li><a href="https://github.com/golang/crypto/commit/982eaa62dfb7273603b97fc1835561450096f3bd"><code>982eaa6</code></a> go.mod: update golang.org/x dependencies</li> <li><a href="https://github.com/golang/crypto/commit/159944f128e9b3fdeb5a5b9b102a961904601a87"><code>159944f</code></a> ssh,acme: clean up tautological/impossible nil conditions</li> <li><a href="https://github.com/golang/crypto/commit/a408498e55412f2ae2a058336f78889fb1ba6115"><code>a408498</code></a> acme: only require prompt if server has terms of service</li> <li><a href="https://github.com/golang/crypto/commit/cab0f718548e8a858701b7b48161f44748532f58"><code>cab0f71</code></a> all: upgrade go directive to at least 1.25.0 [generated]</li> <li><a href="https://github.com/golang/crypto/commit/2f26647a795e74e712b3aebc2655bca60b2686f9"><code>2f26647</code></a> x509roots/fallback: update bundle</li> <li>See full diff in <a href="https://github.com/golang/crypto/compare/v0.48.0...v0.49.0">compare view</a></li> </ul> </details> <br /> [](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores) Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`. [//]: # (dependabot-automerge-start) [//]: # (dependabot-automerge-end) --- <details> <summary>Dependabot commands and options</summary> <br /> You can trigger Dependabot actions by commenting on this PR: - `@dependabot rebase` will rebase this PR - `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it - `@dependabot show <dependency name> ignore conditions` will show all of the ignore conditions of the specified dependency - `@dependabot ignore this major version` will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this minor version` will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this dependency` will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself) </details> Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Lots of work on the vtabbar UI / UX to make it work and integrate into the Wave UI Lots of work on the workspace-layout-model to handle *two* resizable panels.
The preview server already had a `sysinfo` example, but the `web` widget
could not be previewed because it relies on Electron’s `<webview>` tag.
This change adds a standalone `web` preview and replaces the
Electron-only renderer with a preview-safe mock placeholder that
surfaces the target URL.
- **Preview server**
- Added `frontend/preview/previews/web.preview.tsx`
- Reuses the existing full-block preview pattern (`Block` + mock
workspace/tab/block setup)
- Seeds the preview mock object store so `WebViewModel` sees the same
block metadata it expects in the app
- **Web widget fallback in preview**
- Wrapped the shared web view renderer with `MockBoundary`
- In preview windows, renders a lightweight placeholder instead of
`<webview>`
- Placeholder shows the resolved URL that would be loaded by the real
widget
- **WebView model hardening**
- Made block metadata reads tolerant of preview initialization timing
- Normalized preview URL handling so empty/null values fall back to
`about:blank`
- Ensured header input state remains string-backed during preview
rendering
- **Focused coverage**
- Added a small unit test for preview fallback URL rendering and
blank/null URL normalization
```tsx
<MockBoundary fallback={<WebViewPreviewFallback url={metaUrl} />}>
<webview
id="webview"
className="webview"
ref={model.webviewRef}
src={metaUrlInitial}
preload={getWebviewPreloadUrl()}
allowpopups="true"
partition={webPartition}
useragent={userAgent}
/>
</MockBoundary>
```
- **<screenshot>**
- Preview UI:
https://github.com/user-attachments/assets/ac2be6f3-f56f-431e-a4b6-e25d2a270cf2
<!-- START COPILOT CODING AGENT SUFFIX -->
<!-- START COPILOT ORIGINAL PROMPT -->
<details>
<summary>Original prompt</summary>
> checkout sysinfo.preview.tsx... i'd like to try creating a preview for
another simple view. this time the web widget.
>
> note that it uses the electron webview tag which obviously won't work.
so we'll just mock that up using hmm it is in the preview mock directory
i think like a mock boundary... the fallback can just be a div showing
the URL that is supposed to be rendered.
</details>
<!-- START COPILOT CODING AGENT TIPS -->
---
🔒 GitHub Advanced Security automatically protects Copilot coding agent
pull requests. You can protect all pull requests by enabling Advanced
Security for your repositories. [Learn more about Advanced
Security.](https://gh.io/cca-advanced-security)
---------
Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>
Co-authored-by: sawka <2722291+sawka@users.noreply.github.com>
This adds a `frontend/preview` entry for `aifilediff.tsx`, following the
same full-block preview pattern used by `sysinfo`. The preview renders
the real block/view stack with mock Wave objects and a mocked diff RPC
response so the file diff UI can be exercised in isolation.
- **Preview wiring**
- Added `frontend/preview/previews/aifilediff.preview.tsx`
- Creates a mock workspace/tab/block for an `aifilediff` block
- Renders the real `Block` component so header, sizing, and Monaco diff
layout behave like an actual block view
- **Mock diff data**
- Added `frontend/preview/previews/aifilediff.preview-util.ts`
- Provides default original/modified file contents and a helper to build
the mock `WaveAIGetToolDiffCommand` response
- Uses a realistic file path and code sample so the diff viewer is
immediately useful in preview mode
- **View integration cleanup**
- Updated `frontend/app/view/aifilediff/aifilediff.tsx` to read RPC/WOS
from the injected `waveEnv`
- This keeps the view compatible with the preview server’s mock
environment instead of depending on the global runtime path
- **Focused preview coverage**
- Added `frontend/preview/previews/aifilediff.preview.test.ts`
- Covers the helper that encodes mock diff payloads consumed by the
preview
- **Example**
```tsx
rpc: {
WaveAIGetToolDiffCommand: async (_client, data) => {
if (
data.chatid !== DefaultAiFileDiffChatId ||
data.toolcallid !== DefaultAiFileDiffToolCallId
) {
return null;
}
return makeMockAiFileDiffResponse();
},
}
```
- **screenshot**

<!-- START COPILOT CODING AGENT TIPS -->
---
🔒 GitHub Advanced Security automatically protects Copilot coding agent
pull requests. You can protect all pull requests by enabling Advanced
Security for your repositories. [Learn more about Advanced
Security.](https://gh.io/cca-advanced-security)
---------
Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>
Co-authored-by: sawka <2722291+sawka@users.noreply.github.com>
This starts the WaveEnv narrowing work for the preview widget, focused
on wiring the preview view tree to the environment surface it already
uses today. The change intentionally avoids adding new mock behavior and
instead codifies the existing preview dependencies so the widget can
move toward the same env-contract pattern used elsewhere.
- **Preview env contract**
- Adds `PreviewEnv` in `frontend/app/view/preview/previewenv.ts`
- Narrows the preview widget to the specific env surface currently
exercised by the preview stack:
- file RPCs
- suggestion RPCs
- config/meta RPCs
- `ObjectService`
- `fullConfigAtom`
- settings and connection atom helpers
- preview-only electron quicklook hook
- **Preview model wiring**
- Updates `PreviewModel` to retain and use the injected `waveEnv`
instead of reaching directly for global RPC/service helpers where the
env already provides equivalents
- Moves existing preview operations onto `env.rpc`, `env.services`,
`env.wos`, and env-provided atom helpers without changing behavior
- **Preview component adoption**
- Switches the top-level preview view to `useWaveEnv<PreviewEnv>()` for
suggestion fetch/dispose calls
- Switches directory preview code to the narrowed env for:
- config reads
- directory file reads
- copy/create/mkdir actions
- quicklook dispatch
- **Preview-server compatibility**
- Adds a small type-level/runtime check that the existing mock wave env
satisfies `PreviewEnv`
- Keeps the change scoped to the functionality already present in the
preview server
Example of the new pattern:
```tsx
const env = useWaveEnv<PreviewEnv>();
const defaultSort = useAtomValue(env.getSettingsKeyAtom("preview:defaultsort")) ?? "name";
await env.rpc.FileReadCommand(TabRpcClient, {
info: { path: await model.formatRemoteUri(dirPath, globalStore.get) },
});
```
- **Screenshot**
- Existing preview-server UI used for manual verification:
<screenshot>

</screenshot>
<!-- START COPILOT CODING AGENT TIPS -->
---
✨ Let Copilot coding agent [set things up for
you](https://github.com/wavetermdev/waveterm/issues/new?title=✨+Set+up+Copilot+instructions&body=Configure%20instructions%20for%20this%20repository%20as%20documented%20in%20%5BBest%20practices%20for%20Copilot%20coding%20agent%20in%20your%20repository%5D%28https://gh.io/copilot-coding-agent-tips%29%2E%0A%0A%3COnboard%20this%20repo%3E&assignees=copilot)
— coding agent works faster and does higher quality work when set up for
your repo.
---------
Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>
Co-authored-by: sawka <2722291+sawka@users.noreply.github.com>
Co-authored-by: sawka <mike@commandline.dev>
Implement Mosh (Mobile Shell) integration as a wrapper around the mosh-client binary. SSH connection remains alive for wsh features while terminal I/O switches to Mosh's UDP-based SSP protocol. - Add MoshShellClient implementing ShellClient interface - Add MoshProcessController with full process lifecycle management - Integrate mosh into ConnUnion and shell controller with SSH fallback - Add conn:moshenabled configuration key (per-connection toggle) - Add MoshEnabled/MoshActive fields to ConnStatus RPC types - Add frontend status detection and disable-mosh UI handler - Add comprehensive unit tests (24 test cases) Closes wavetermdev/waveterm#1166
When conn:moshenabled is not explicitly configured, WaveTerm now probes for local mosh-client and remote mosh-server automatically. Result is cached per SSHConn so the probe runs only once per connection. - Export FindMoshClientBinary() and CheckRemoteMoshServer() for probing - Add MoshAutoDetected/MoshAutoAvailable atomics to SSHConn - Tri-state config: explicit true/false overrides, nil = auto-detect
Sort directory entries by mtime descending before truncation so the most recent files always appear when a directory exceeds the limit. Bumped MaxDirSize from 1024 to 5000. Uses DirEntry.Info() instead of os.Stat() to avoid extra syscalls. Fixes #2830
Adds a new global setting `term:closeonlasttermclose` that automatically closes the window when the last shell/terminal block exits. When enabled, typing `exit` in the last remaining terminal closes the window immediately (no delay), while non-last terminals are unaffected. Closes #3026 Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Fail closed on DB errors instead of skipping blocks with continue, which could undercount shell blocks and incorrectly trigger window close. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Fixes issue where TUI applications (vim, htop, opencode, etc.) would lose terminal state when switching between workspaces. This caused inability to scroll and display corruption. Root cause: Workspace switching was destroying all tab views including terminals, then recreating them from cache. This destroyed xterm.js instances and lost their state. Solution: Cache tab views across workspace switches instead of destroying them. Tab views are positioned off-screen but kept alive, preserving: - Terminal buffer state (normal and alternate screen modes) - Scrollback history and scrolling capability - Running processes and their output - Cursor position and all terminal modes Memory management: Cached views kept alive until tab closed or window closed. Note: This PR includes the StreamCancelFn type fix from #2716 to ensure the branch builds correctly.
Cached tab views were left as children of contentView (positioned off-screen), causing multiple terminals to render on top of each other. Changes: - Remove cached views from contentView during workspace switch - Re-add when reusing from cache - Simplify removal logic (cached vs loaded)
When cached tabs send IPC events, lookup was failing because getWaveWindowByTabId only searched allLoadedTabViews. Now also checks allTabViewsCache to handle cached tabs.
Each terminal block now maintains its own independent zsh command history via a dedicated HISTFILE under ~/.waveterm/shell/zsh/history/<blockId>/. - Set per-block HISTFILE in zsh_zshrc.sh based on WAVETERM_BLOCKID - Add GetBlockZshHistoryDir and CleanupBlockZshHistory utilities - Clean up per-block history directory on block deletion - Merge all per-block history files into ~/.zsh_history on shutdown - Collect per-block history files via getPerBlockHistoryFiles helper
Co-authored-by: sawka <2722291+sawka@users.noreply.github.com>
Co-authored-by: sawka <2722291+sawka@users.noreply.github.com>
Custom FilePathLinkProvider registered via xterm.js registerLinkProvider API. Detects file paths in terminal output and opens them in Wave's preview block on cmd+click (ctrl+click on Linux/Windows). Patterns matched: - Absolute paths: /path/to/file.ts - Home paths: ~/path/to/file - Relative paths: ./path/to/file - file:line:col: /path/file.ts:42:10 Builds on the hyperlink support from #1357.
Track the IDisposable returned by registerLinkProvider in toDispose to prevent resource leaks on terminal disposal. Move Makefile/Dockerfile out of KNOWN_EXTENSIONS (which requires a leading dot) into a separate KNOWN_FILENAMES regex that matches by exact basename. Add other common extensionless files (Rakefile, Gemfile, Justfile, Vagrantfile, Procfile, Brewfile).
Co-authored-by: kilo-code-bot[bot] <240665456+kilo-code-bot[bot]@users.noreply.github.com>
Required by sixel rendering support (PR #2940).
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
Integrates our custom features + cherry-picked MVP PRs from upstream into a single working branch.
Custom Features (Ours)
Cherry-picked from upstream (MVP PRs)
term:closeonlasttermclose)TUI Enhancements
Verification
tsc --noEmit): cleanTest plan
img2sixelor similar