`frontend/preview` was still routing context menus through the
Electron-backed production path, so preview menus did not behave
correctly. This change adds a preview-native menu renderer, then
tightens its sizing and fixes submenu clipping so nested menus are fully
visible and usable.
- **Preview-native context menu host**
- Adds `frontend/preview/preview-contextmenu.tsx`
- Renders context menus directly in the preview app via
`@floating-ui/react`
- Supports existing `ContextMenuItem` features already used by previews:
- nested submenus
- checkbox/radio states
- separators / headers
- click handlers
- outside-click / escape dismissal
- **Mock env integration**
- Wires the mock `WaveEnv.showContextMenu` path to the preview renderer
- Keeps existing preview callers unchanged (`env.showContextMenu(menu,
e)`)
- **Preview root mounting**
- Mounts a single shared context menu host in
`frontend/preview/preview.tsx`
- Makes tabbar/widgets previews work without any Electron dependency
- **Menu sizing + submenu visibility**
- Reduces menu width, font size, and row padding for a denser menu
- Switches the menu panel to `overflow-visible` so submenu panels are
not clipped by the parent container
```tsx
// frontend/preview/mock/mockwaveenv.ts
showContextMenu: overrides.showContextMenu ?? showPreviewContextMenu,
```
<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>
Lots of small updates:
* Fix modtime format to show time not just "today". Make fixed font.
* Zebra stripe rows
* Fix .yml files to be detected as yaml
* Add a new config option for changing the default sort (Name vs Mod
Time)
* Add ability to change the defaults using the context menu
* Make Size column fixed font
* Add vertical bars between header columns (more visual resize handles)
This adds a standalone preview for `sysinfo` using the newer WaveEnv
mock pattern, but renders the full block instead of the bare view. The
preview seeds a mock block in WOS (`meta.view = "sysinfo"`), provides
history via mock RPC, and drives live updates through frontend-only WPS
event dispatch.
- **What changed**
- Added `frontend/preview/previews/sysinfo.preview.tsx` to render a full
`Block` with sysinfo block chrome, tab/workspace context, and mock WOS
objects.
- Added `frontend/preview/previews/sysinfo.preview-util.ts` to generate
deterministic sysinfo history + live events for preview use.
- Added `frontend/preview/previews/sysinfo.preview.test.ts` to lock down
the mock event/history shape used by the preview.
- **Preview wiring**
- Seeds mock `workspace`, `tab`, and `block` objects so the preview
exercises the real block path rather than a component-only render.
- Configures the mock block metadata with:
- `view: "sysinfo"`
- `connection: "local"`
- `sysinfo:type: "CPU + Mem"`
- `graph:numpoints`
- Overrides `EventReadHistoryCommand` in the preview env so
`SysinfoViewModel` can load initial history normally.
- **Live FE-only event flow**
- Uses `handleWaveEvent()` directly in the preview to simulate incoming
`sysinfo` events without touching backend transport.
- Keeps the preview aligned with the real WPS subscription path already
used by `sysinfo.tsx`.
```tsx
const env = applyMockEnvOverrides(baseEnv, {
mockWaveObjs: {
[`block:${PreviewBlockId}`]: {
otype: "block",
oid: PreviewBlockId,
version: 1,
meta: {
view: "sysinfo",
connection: "local",
"sysinfo:type": "CPU + Mem",
"graph:numpoints": 90,
},
} as Block,
},
rpc: {
EventReadHistoryCommand: async (_client, data) => {
if (data.event !== "sysinfo" || data.scope !== "local") {
return [];
}
return historyRef.current.slice(-(data.maxitems ?? historyRef.current.length));
},
},
});
```
- **Result**
- The preview now exercises the real sysinfo block path: block
frame/header, model initialization, history load, and ongoing chart
updates.
- **Screenshot**
-
<screenshot>https://github.com/user-attachments/assets/dc2ed145-9ec8-4fde-adb0-79adc62c3071</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>
Vertical tabs were still using the older single-badge path and did not
honor the newer `tab:flagcolor` metadata. This updates `vtab` to use the
same badge rendering model as `tab`, including validated flag-color
badges.
- **Shared badge renderer**
- Extract `TabBadges` from `tab.tsx` into a shared
`frontend/app/tab/tabbadges.tsx` component.
- Keep the existing horizontal tab behavior unchanged while making the
badge stack reusable by `vtab`.
- **Vertical tab badge parity**
- Replace the legacy `badge` icon rendering in `vtab.tsx` with
`TabBadges`.
- Support both existing `badge` callers and the newer `badges` array
shape.
- Add `flagColor` support in `vtab` using the same
`validateCssColor(...)` guard as `tab.tsx`, so invalid colors are
ignored rather than rendered.
- **Preview / regression coverage**
- Update the `vtabbar` preview to show:
- multiple badges
- flag-only tabs
- mixed badge + flag tabs
- Add focused `vtab` coverage for valid and invalid `flagColor`
handling.
- **Example**
```tsx
const rawFlagColor = tab.flagColor;
let flagColor: string | null = null;
if (rawFlagColor) {
try {
validateCssColor(rawFlagColor);
flagColor = rawFlagColor;
} catch {
flagColor = null;
}
}
<TabBadges badges={badges} flagColor={flagColor} />
```
- **Screenshot**
- Updated vertical tab preview:
https://github.com/user-attachments/assets/7d79930f-00cc-49a7-a0ec-d5554fb9e166
<!-- 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>
Large PR that extends WaveEnv mocking to fully cover the (complicated) TabBar implementation. Also includes a full preview of the tab bar in the preview server with lots of controls to simulate different scenarios.
As a result of this mocking, also fixed a bunch of dependencies, and layout errors, random bugs, and visual UX bugs in the tab bar, making it more robust.
---------
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>
* lots of updates to WaveEnv to make it cover more functionality
* Create BlockEnv as a narrowing of WaveEnv that covers all of
frontend/app/block functionality
* Fixed a lot of dependencies in the block components that caused
unnecessarily re-renders
* Added atom caching to WOS
Two small fixes to the in-app search feature:
- **Skip copy-on-select during search navigation** — when iterating
through
search results in the terminal, the clipboard kept getting overwritten
with
the matched text on every step. This was annoying on its own, but also
polluted paste history managers. The root cause was
that xterm.js updates the terminal selection programmatically to
highlight
each match, which triggered the copy-on-select handler. The fix skips
the
clipboard write whenever an element inside `.search-container` is the
active
element.
- **Refocus search input on repeated Cmd+F** — pressing Cmd+F while the
search
bar was already open was a no-op (setting the `isOpen` atom to `true`
again
has no effect). The fix detects the already-open case and directly calls
`focus()` + `select()` on the input, so the user can immediately type a
new
query.
WaveEnv did not surface platform information, so platform-aware behavior
could not be added through the shared environment contract. This updates
the contract, production implementation, and preview mock to carry
platform state without wiring it into any consumers yet.
- **WaveEnv contract**
- Add `platform: NodeJS.Platform`
- Add `isWindows()` and `isMacOS()` helpers
- **Production implementation**
- Populate `platform` from `PLATFORM` in `frontend/util/platformutil.ts`
- Forward `isWindows` / `isMacOS` from the same utility into
`makeWaveEnvImpl()`
- **Preview mock**
- Add optional `platform` override to `MockEnv`
- Default mock platform to macOS
- Expose `platform`, `isWindows()`, and `isMacOS()` on the mock env
- Preserve platform overrides through `applyMockEnvOverrides()`
Example:
```ts
const env = useWaveEnv();
env.platform; // "darwin" | "win32" | ...
env.isMacOS(); // boolean
env.isWindows(); // boolean
```
<!-- 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>
Wave was emitting React’s `forwardRef render functions accept exactly
two parameters` warning on startup with no useful stack trace. The
warning came from the preview directory row component being wrapped in
`React.forwardRef` even though it neither accepted nor used a forwarded
ref.
- **Root cause**
- `frontend/app/view/preview/preview-directory.tsx` defined `TableRow`
with `React.forwardRef(...)`, but the render function was effectively a
plain props-only component.
- **Change**
- Removed the unnecessary `forwardRef` wrapper from `TableRow`.
- Kept the component behavior unchanged; it still uses its internal drag
ref wiring for DnD.
- **Impact**
- Eliminates the startup warning.
- Aligns the component definition with its actual usage: callers render
`TableRow` as a normal component and do not pass refs.
```tsx
// before
const TableRow = React.forwardRef(function ({ row, idx, ...props }: TableRowProps) {
return <div ref={dragRef}>...</div>;
});
// after
function TableRow({ row, idx, ...props }: TableRowProps) {
return <div ref={dragRef}>...</div>;
}
```
<!-- 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>
`pkg/remote/connparse` was failing on shorthand WSH inputs that omit the
`wsh://` scheme, including remote hosts, WSL targets, and Windows local
paths. The parser was splitting on `://` too early and misclassifying
leading `//` inputs before WSH shorthand handling ran.
- **What changed**
- Detect scheme-less WSH shorthand up front with `strings.HasPrefix(uri,
"//")`
- Route those inputs through the existing WSH path parsing flow instead
of the generic `://` split path
- Reuse the same shorthand flag when deciding whether to parse as
remote/local WSH vs current-path shorthand
- **Behavioral impact**
- `//conn/path/to/file` now parses as host `conn` with path
`path/to/file`
- `//wsl://Ubuntu/path/to/file` now preserves the WSL host and absolute
path shape
- `//local/C:\path\to\file` now parses as local Windows shorthand
instead of being treated as a current-path string
- **Scope**
- Keeps the existing test expectations intact
- Limits the change to `pkg/remote/connparse/connparse.go`
```go
isWshShorthand := strings.HasPrefix(uri, "//")
if isWshShorthand {
rest = strings.TrimPrefix(uri, "//")
} else if len(split) > 1 {
scheme = split[0]
rest = strings.TrimPrefix(split[1], "//")
}
```
<!-- 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>
This adds a **Release Notes** action to `SettingsFloatingWindow` in the
requested position: after **Secrets** and before **Help**. It also wires
that action to open the existing `onboarding-upgrade-patch.tsx` UI as a
standalone modal, so release notes remain accessible even when automatic
upgrade onboarding would not render for up-to-date clients.
- **Settings menu**
- Adds a new **Release Notes** item to
`frontend/app/workspace/widgets.tsx`
- Places it between **Secrets** and **Help**
- Uses the existing modal system rather than creating a new view/block
path
- **Release notes launch path**
- Registers `UpgradeOnboardingPatch` in the modal registry
- Opens it from the settings menu via
`modalsModel.pushModal("UpgradeOnboardingPatch", { isReleaseNotes: true
})`
- **Standalone modal behavior**
- Extends `UpgradeOnboardingPatch` with a lightweight `isReleaseNotes`
mode
- In release-notes mode, closing the modal pops the stacked modal
instead of toggling `upgradeOnboardingOpen`
- Preserves the existing automatic upgrade-onboarding flow and version
metadata update behavior for the original path
```tsx
{
icon: "book-open",
label: "Release Notes",
onClick: () => {
modalsModel.pushModal("UpgradeOnboardingPatch", { isReleaseNotes: true });
onClose();
},
}
```
- **<screenshot>**
- Release notes modal content:

<!-- 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>
`pkg/aiusechat/tools_readdir_test.go` was still asserting the old
`entries` payload shape after `read_dir` moved to returning typed
directory entries. This caused the `pkg/aiusechat` test failures even
though the tool behavior itself was already correct.
- **Align test expectations with current callback output**
- Update `TestReadDirCallback` to treat `entries` as
`[]fileutil.DirEntryOut`
- Assert directory/file classification via the `Dir` field instead of
map lookups
- **Fix truncation/sorting coverage**
- Update `TestReadDirSortBeforeTruncate` to validate the typed slice
returned by `readDirCallback`
- Preserve the existing intent of the test: directories should still be
sorted ahead of files before truncation
- **Keep scope limited to stale tests**
- No changes to `read_dir` implementation or output contract
- Only the broken test assumptions were corrected
```go
entries, ok := resultMap["entries"].([]fileutil.DirEntryOut)
if !ok {
t.Fatalf("entries is not a slice of DirEntryOut")
}
for _, entry := range entries {
if entry.Dir {
// directory assertions
}
}
```
<!-- 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>
`WindowService.MoveBlockToNewWindow` appears to be unreferenced, and its
supporting path had become isolated. This change removes that dead RPC
surface and the backend/eventbus helpers that existed only for that
flow.
- **Window service cleanup (backend RPC)**
- Removed `MoveBlockToNewWindow_Meta` and `MoveBlockToNewWindow` from
`pkg/service/windowservice/windowservice.go`.
- Dropped now-unused imports tied to that method (`log`, `eventbus`).
- **Store cleanup**
- Removed `MoveBlockToTab` from `pkg/wstore/wstore.go`.
- Removed now-unused `utilfn` import from the same file.
- **Eventbus cleanup**
- Removed unused event constant `WSEvent_ElectronNewWindow`.
- Removed `getWindowWatchesForWindowId` and `BusyWaitForWindowId`, which
were only used by the deleted move-to-new-window path.
- Removed now-unused `time` import.
- **Generated frontend service surface**
- Regenerated service bindings and removed
`WindowServiceType.MoveBlockToNewWindow(...)` from
`frontend/app/store/services.ts`.
Example of removed RPC surface:
```ts
// removed from frontend/app/store/services.ts
MoveBlockToNewWindow(currentTabId: string, blockId: string): Promise<void> {
return WOS.callBackendService("window", "MoveBlockToNewWindow", Array.from(arguments))
}
```
<!-- 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>
Bumps [tar](https://github.com/isaacs/node-tar) from 7.5.9 to 7.5.10.
<details>
<summary>Commits</summary>
<ul>
<li><a
href="2b72abc1d4"><code>2b72abc</code></a>
7.5.10</li>
<li><a
href="7bc755dd85"><code>7bc755d</code></a>
parse root off paths before sanitizing .. parts</li>
<li><a
href="c8cb84629d"><code>c8cb846</code></a>
update deps</li>
<li>See full diff in <a
href="https://github.com/isaacs/node-tar/compare/v7.5.9...v7.5.10">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)
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>
Bumps the dev-dependencies-patch group with 1 update:
[postcss](https://github.com/postcss/postcss).
Updates `postcss` from 8.5.6 to 8.5.8
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a
href="https://github.com/postcss/postcss/releases">postcss's
releases</a>.</em></p>
<blockquote>
<h2>8.5.8</h2>
<ul>
<li>Fixed <code>Processor#version</code>.</li>
</ul>
<h2>8.5.7</h2>
<ul>
<li>Improved source map annotation cleaning performance (by CodeAnt
AI).</li>
</ul>
</blockquote>
</details>
<details>
<summary>Changelog</summary>
<p><em>Sourced from <a
href="https://github.com/postcss/postcss/blob/main/CHANGELOG.md">postcss's
changelog</a>.</em></p>
<blockquote>
<h2>8.5.8</h2>
<ul>
<li>Fixed <code>Processor#version</code>.</li>
</ul>
<h2>8.5.7</h2>
<ul>
<li>Improved source map annotation cleaning performance (by CodeAnt
AI).</li>
</ul>
</blockquote>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a
href="65de53745f"><code>65de537</code></a>
Release 8.5.8 version</li>
<li><a
href="b2c6d9786e"><code>b2c6d97</code></a>
Run git hook register</li>
<li><a
href="0ae0a492e9"><code>0ae0a49</code></a>
Update Processor#version</li>
<li><a
href="6ee9f14d3a"><code>6ee9f14</code></a>
Release 8.5.7 version</li>
<li><a
href="3fbc95172a"><code>3fbc951</code></a>
Fix uvu Node.js 25 support</li>
<li><a
href="52db53ea43"><code>52db53e</code></a>
Update dependencies</li>
<li><a
href="497daef797"><code>497daef</code></a>
Speed up source map annotation cleaning by moving from RegExp</li>
<li><a
href="41e739a940"><code>41e739a</code></a>
Remove banner</li>
<li><a
href="1329142fc7"><code>1329142</code></a>
chore: speed up space-only string check in lib/parser.js (<a
href="https://redirect.github.com/postcss/postcss/issues/2064">#2064</a>)</li>
<li><a
href="23beff9a7c"><code>23beff9</code></a>
Update dependencies</li>
<li>Additional commits viewable in <a
href="https://github.com/postcss/postcss/compare/8.5.6...8.5.8">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 the dev-dependencies-minor group with 1 update:
[globals](https://github.com/sindresorhus/globals).
Updates `globals` from 17.3.0 to 17.4.0
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a
href="https://github.com/sindresorhus/globals/releases">globals's
releases</a>.</em></p>
<blockquote>
<h2>v17.4.0</h2>
<ul>
<li>Update globals (2026-03-01) (<a
href="https://redirect.github.com/sindresorhus/globals/issues/338">#338</a>)
d43a051</li>
</ul>
<hr />
<p><a
href="https://github.com/sindresorhus/globals/compare/v17.3.0...v17.4.0">https://github.com/sindresorhus/globals/compare/v17.3.0...v17.4.0</a></p>
</blockquote>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a
href="a9cfd7493f"><code>a9cfd74</code></a>
17.4.0</li>
<li><a
href="d43a051c48"><code>d43a051</code></a>
Update globals (2026-03-01) (<a
href="https://redirect.github.com/sindresorhus/globals/issues/338">#338</a>)</li>
<li>See full diff in <a
href="https://github.com/sindresorhus/globals/compare/v17.3.0...v17.4.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 <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>
This PR introduces a standalone Tsunami terminal element (`wave:term`)
and routes terminal IO outside the normal render/event loop for
lower-latency streaming. It adds imperative terminal output
(`TermWrite`) over SSE and terminal input/resize delivery over a
dedicated `/api/terminput` endpoint.
- **Frontend: new `wave:term` element**
- Added `tsunami/frontend/src/element/tsunamiterm.tsx`.
- Uses `@xterm/xterm` with `@xterm/addon-fit`.
- Renders as an outer `<div>` (style/class/ref target), with xterm
auto-fit to that container.
- Supports ref passthrough on the outer element.
- **Frontend: terminal transport wiring**
- Registered `wave:term` in `tsunami/frontend/src/vdom.tsx`.
- Added SSE listener handling for `termwrite` in
`tsunami/frontend/src/model/tsunami-model.tsx`, dispatched to the
terminal component via a local custom event.
- `onData` and `onResize` now POST directly to `/api/terminput` as JSON
payloads:
- `id`
- `data64` (base64 terminal input)
- `termsize` (`rows`, `cols`) for resize updates
- **Backend: new terminal IO APIs**
- Added `/api/terminput` handler in `tsunami/engine/serverhandlers.go`.
- Added protocol types in `tsunami/rpctypes/protocoltypes.go`:
- `TermInputPacket`, `TermWritePacket`, `TermSize`
- Added engine/client support in `tsunami/engine/clientimpl.go`:
- `SendTermWrite(id, data64)` -> emits SSE event `termwrite`
- `SetTermInputHandler(...)` and `HandleTermInput(...)`
- Exposed app-level APIs in `tsunami/app/defaultclient.go`:
- `TermWrite(id, data64) error`
- `SetTermInputHandler(func(TermInputPacket))`
- **Example usage**
```go
app.SetTermInputHandler(func(input app.TermInputPacket) {
// input.Id, input.Data64, input.TermSize.Rows/Cols
})
_ = app.TermWrite("term1", "SGVsbG8gZnJvbSB0aGUgYmFja2VuZA0K")
```
- **<screenshot>**
- Provided screenshot URL:
https://github.com/user-attachments/assets/58c92ebb-0a52-43d2-b577-17c9cf92a19c
<!-- 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>
Co-authored-by: sawka <mike@commandline.dev>
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>