Got preview hooked up, log output hooked up, environment tab hooked
up... the controller, restarting the apps. it is actually working! still
lots to do and lots of hard coding to fix, but it is coming together...
## Alert and Confirm Modal System for Tsunami
This PR implements a complete modal system for the tsunami app framework
as specified in the requirements.
### Implementation Summary
**Backend (Go) - 574 lines changed across 11 files:**
1. **Type Definitions** (`rpctypes/protocoltypes.go`):
- `ModalConfig`: Configuration for modal display with icon, title, text,
and button labels
- `ModalResult`: Result structure containing modal ID and confirmation
status
2. **Client State Management** (`engine/clientimpl.go`):
- Added `ModalState` to track open modals with result channels
- `OpenModals` map to track all currently open modals
- `ShowModal()`: Sends SSE event to display modal and returns result
channel
- `CloseModal()`: Processes modal result from frontend
- `CloseAllModals()`: Automatically cancels all modals when frontend
sends Resync flag (page refresh)
3. **API Endpoint** (`engine/serverhandlers.go`):
- `/api/modalresult` POST endpoint to receive modal results from
frontend
- Validates and processes `ModalResult` JSON payload
- Closes all modals on Resync (page refresh) before processing events
4. **User-Facing Hooks** (`app/hooks.go`):
- `UseAlertModal()`: Returns (isOpen, triggerAlert) for alert modals
- `UseConfirmModal()`: Returns (isOpen, triggerConfirm) for confirm
modals
- Both hooks manage local state and handle async modal lifecycle
**Frontend (TypeScript/React):**
1. **Type Definitions** (`types/vdom.d.ts`):
- Added `ModalConfig` and `ModalResult` TypeScript types
2. **Modal Components** (`element/modals.tsx`):
- `AlertModal`: Dark-mode styled alert with icon, title, text, and OK
button
- `ConfirmModal`: Dark-mode styled confirm with icon, title, text, OK
and Cancel buttons
- Both support keyboard (ESC) and backdrop click dismissal
- Fully accessible with focus management
3. **Model Integration** (`model/tsunami-model.tsx`):
- Added `currentModal` atom to track displayed modal
- SSE event handler for `showmodal` events
- `sendModalResult()`: Sends result to `/api/modalresult` and clears
modal
4. **UI Integration** (`vdom.tsx`):
- Integrated modal display in `VDomView` component
- Conditionally renders alert or confirm modal based on type
**Demo Application** (`demo/modaltest/`):
- Comprehensive demonstration of modal functionality
- Shows 4 different modal configurations:
- Alert with icon
- Simple alert with custom button text
- Confirm modal
- Delete confirmation with custom buttons
- Displays modal state and results in real-time
### Key Features
✅ **SSE-Based Modal Display**: Modals are pushed from backend to
frontend via SSE
✅ **API-Based Result Handling**: Results sent back via
`/api/modalresult` endpoint
✅ **Automatic Cleanup**: All open modals auto-cancel on page refresh
(when Resync flag is set)
✅ **Type-Safe Hooks**: Full TypeScript and Go type safety
✅ **Dark Mode UI**: Components styled for Wave Terminal's dark theme
✅ **Accessibility**: Keyboard navigation, ESC to dismiss, backdrop click
support
✅ **Zero Security Issues**: Passed CodeQL security analysis
✅ **Zero Code Review Issues**: Clean implementation following best
practices
### Testing
- ✅ Go code compiles without errors
- ✅ TypeScript/React builds without errors
- ✅ All existing tests pass
- ✅ Demo app created and compiles successfully
- ✅ CodeQL security scan: 0 vulnerabilities
- ✅ Code review: 0 issues
### Security Summary
No security vulnerabilities were introduced. All modal operations are
properly scoped to the client's SSE connection, and modal IDs are
generated server-side to prevent tampering.
Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>
Co-authored-by: sawka <2722291+sawka@users.noreply.github.com>
Adds settings menu items to the Tsunami app view for stopping and
restarting the controller, with support for forcing rebuilds that bypass
the build cache.
### Changes
- **Added three menu items** to
`TsunamiViewModel.getSettingsMenuItems()`:
- "Stop WaveApp" - stops the running tsunami controller using
`ControllerStopCommand`
- "Restart WaveApp" - stops the controller, waits 300ms, then resyncs to
restart it (uses existing cache if available)
- "Restart WaveApp and Force Rebuild" - triggers
`ControllerResyncCommand` with `forcerestart: true` (bypasses build
cache per line 228 in `tsunamicontroller.go`)
- **Refactored controller resync logic** - extracted common code into
`doControllerResync()` helper with optional `triggerRestart` parameter
to handle both user-initiated restarts and automatic mount sync
- **Implemented proper restart behavior** - "Restart WaveApp" now
performs a stop → wait → resync sequence to ensure the controller
actually restarts instead of just resyncing to the already-running state
### Implementation Note
No backend changes required. The existing
`CommandControllerResyncData.ForceRestart` flag already controls cache
bypass behavior in the tsunami controller's build logic, and
`ControllerStopCommand` is used for stopping the controller.
Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>
Co-authored-by: sawka <2722291+sawka@users.noreply.github.com>
The `ellipsis()` mixin in `mixins.scss` was only used in two files.
Replaced with plain CSS and removed the file entirely.
## Changes
- **Converted mixin usage to plain CSS** in `flyoutmenu.scss` and
`expandablemenu.scss`:
```scss
// Before
.label {
@include mixins.ellipsis();
}
// After
.label {
display: block;
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
}
```
- **Removed unused imports** from 8 SCSS files that imported
`mixins.scss` but didn't use it
- **Deleted** `frontend/app/mixins.scss`
<!-- START COPILOT CODING AGENT SUFFIX -->
<details>
<summary>Original prompt</summary>
> in mixins.scss we have one last one called ellipsis(). i believe it is
only used in a couple places now... at least flyoutmenu.scss and
expandablemenu.scss. lets convert those to just plain CSS instead of
using the mixin. and then i think we can delete the mixins.scss file
completely... maybe 8 or so scss files that include it that will also
need modification.
>
> do your own check though to find any additional usages of mixins.scss
and the ellipsis mixin. make sure we remove all usages.
</details>
<!-- 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
[github.com/aws/aws-sdk-go-v2/config](https://github.com/aws/aws-sdk-go-v2)
from 1.31.13 to 1.31.15.
<details>
<summary>Commits</summary>
<ul>
<li><a
href="4bd7f5481e"><code>4bd7f54</code></a>
Release 2025-10-23</li>
<li><a
href="55fb47cb07"><code>55fb47c</code></a>
Regenerated Clients</li>
<li><a
href="bf727c0b40"><code>bf727c0</code></a>
Update partitions file</li>
<li><a
href="0ca943fb07"><code>0ca943f</code></a>
Update endpoints model</li>
<li><a
href="3908bc4e96"><code>3908bc4</code></a>
Update API model</li>
<li><a
href="a0c74d28b6"><code>a0c74d2</code></a>
Release 2025-10-22</li>
<li><a
href="eb611540d5"><code>eb61154</code></a>
Regenerated Clients</li>
<li><a
href="e20d3e4b60"><code>e20d3e4</code></a>
Update endpoints model</li>
<li><a
href="9acd5faf2c"><code>9acd5fa</code></a>
Update API model</li>
<li><a
href="a91cc6c722"><code>a91cc6c</code></a>
Speed up unit tests by removing duplicate work (<a
href="https://redirect.github.com/aws/aws-sdk-go-v2/issues/3216">#3216</a>)</li>
<li>Additional commits viewable in <a
href="https://github.com/aws/aws-sdk-go-v2/compare/config/v1.31.13...config/v1.31.15">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 merge` will merge this PR after your CI passes on it
- `@dependabot squash and merge` will squash and merge this PR after
your CI passes on it
- `@dependabot cancel merge` will cancel a previously requested merge
and block automerging
- `@dependabot reopen` will reopen this PR if it is closed
- `@dependabot close` will close this PR and stop Dependabot recreating
it. You can achieve the same result by closing it manually
- `@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>
Removes the entire `frontend/app/view/chat/` directory and its
dependencies—avatar and collapsiblemenu components—which were only
referenced within the chat code itself.
**Removed:**
- `frontend/app/view/chat/` directory (13 files: channels, chat,
chatbox, chatmessages, userlist + their styles/stories)
- `frontend/app/element/avatar.{tsx,scss,stories.tsx}` (only used by
chat/userlist)
- `frontend/app/element/collapsiblemenu.{tsx,scss,stories.tsx}` (only
used by chat/channels)
- `avatar-dims-mixin` from `frontend/app/mixins.scss` (only used by
avatar.scss)
Total: 19 files, ~1300 lines removed.
---------
Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>
Co-authored-by: sawka <2722291+sawka@users.noreply.github.com>
Bumps
[github.com/aws/aws-sdk-go-v2](https://github.com/aws/aws-sdk-go-v2)
from 1.39.3 to 1.39.4.
<details>
<summary>Commits</summary>
<ul>
<li><a
href="4bd7f5481e"><code>4bd7f54</code></a>
Release 2025-10-23</li>
<li><a
href="55fb47cb07"><code>55fb47c</code></a>
Regenerated Clients</li>
<li><a
href="bf727c0b40"><code>bf727c0</code></a>
Update partitions file</li>
<li><a
href="0ca943fb07"><code>0ca943f</code></a>
Update endpoints model</li>
<li><a
href="3908bc4e96"><code>3908bc4</code></a>
Update API model</li>
<li><a
href="a0c74d28b6"><code>a0c74d2</code></a>
Release 2025-10-22</li>
<li><a
href="eb611540d5"><code>eb61154</code></a>
Regenerated Clients</li>
<li><a
href="e20d3e4b60"><code>e20d3e4</code></a>
Update endpoints model</li>
<li><a
href="9acd5faf2c"><code>9acd5fa</code></a>
Update API model</li>
<li><a
href="a91cc6c722"><code>a91cc6c</code></a>
Speed up unit tests by removing duplicate work (<a
href="https://redirect.github.com/aws/aws-sdk-go-v2/issues/3216">#3216</a>)</li>
<li>Additional commits viewable in <a
href="https://github.com/aws/aws-sdk-go-v2/compare/v1.39.3...v1.39.4">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 merge` will merge this PR after your CI passes on it
- `@dependabot squash and merge` will squash and merge this PR after
your CI passes on it
- `@dependabot cancel merge` will cancel a previously requested merge
and block automerging
- `@dependabot reopen` will reopen this PR if it is closed
- `@dependabot close` will close this PR and stop Dependabot recreating
it. You can achieve the same result by closing it manually
- `@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>
- mark last command / prompts in xterm.js
- split out term model into its own file
- try to detect repl/shells/ssh/tmux etc commands that stop wave ai
integration
- show icons in term headers for whether wave ai integration is
available
- keep integration status / last command client side (sync with server
on reload)
Fix for https://github.com/wavetermdev/waveterm/issues/2385 for Wave AI.
Also update privacy information to say we send the chats to OpenAI for
processing.
Also modify the system prompt to say that file editing + command execution is coming soon.
The Preview block's CodeEditPreview component was not passing file
information to Monaco editor, preventing automatic language detection
from file extensions.
Changes:
- Add fileName prop to CodeEditor component
- Pass actual file path to Monaco with fallback to random UUID
Fixes syntax highlighting for all text files opened in Preview blocks
while maintaining backward compatibility with existing CodeEditor usage.
---------
Co-authored-by: sawka
[//]: # (dependabot-start)
⚠️ **Dependabot is rebasing this PR** ⚠️
Rebasing might not happen immediately, so don't worry if this takes some
time.
Note: if you make any changes to this PR yourself, they will take
precedence over the rebase.
---
[//]: # (dependabot-end)
Bumps the prod-dependencies-patch group with 2 updates:
[@ai-sdk/react](https://github.com/vercel/ai) and
[ai](https://github.com/vercel/ai).
Updates `@ai-sdk/react` from 2.0.68 to 2.0.76
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a
href="https://github.com/vercel/ai/releases"><code>@ai-sdk/react</code>'s
releases</a>.</em></p>
<blockquote>
<h2><code>@ai-sdk/react</code><a
href="https://github.com/2"><code>@2</code></a>.0.76</h2>
<h3>Patch Changes</h3>
<ul>
<li>Updated dependencies [87b03d5]
<ul>
<li>ai@5.0.76</li>
</ul>
</li>
</ul>
<h2><code>@ai-sdk/react</code><a
href="https://github.com/2"><code>@2</code></a>.0.75</h2>
<h3>Patch Changes</h3>
<ul>
<li>ai@5.0.75</li>
</ul>
<h2><code>@ai-sdk/react</code><a
href="https://github.com/2"><code>@2</code></a>.0.74</h2>
<h3>Patch Changes</h3>
<ul>
<li>ai@5.0.74</li>
</ul>
<h2><code>@ai-sdk/react</code><a
href="https://github.com/2"><code>@2</code></a>.0.73</h2>
<h3>Patch Changes</h3>
<ul>
<li>Updated dependencies [734c4c3]
<ul>
<li>ai@5.0.73</li>
</ul>
</li>
</ul>
</blockquote>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a
href="716c41cee8"><code>716c41c</code></a>
Version Packages (<a
href="https://redirect.github.com/vercel/ai/issues/9602">#9602</a>)</li>
<li><a
href="87b03d5abe"><code>87b03d5</code></a>
Backport: feat(ui): add isDataUIPart helper (<a
href="https://redirect.github.com/vercel/ai/issues/9598">#9598</a>)</li>
<li><a
href="58d701fc59"><code>58d701f</code></a>
Backport: docs: fix openai provider section of migration guide (<a
href="https://redirect.github.com/vercel/ai/issues/9592">#9592</a>)</li>
<li><a
href="7a6b5497bf"><code>7a6b549</code></a>
Version Packages (<a
href="https://redirect.github.com/vercel/ai/issues/9587">#9587</a>)</li>
<li><a
href="76678cdabc"><code>76678cd</code></a>
Backport: fix(gateway): trigger release (<a
href="https://redirect.github.com/vercel/ai/issues/9585">#9585</a>)</li>
<li><a
href="f45b3738f6"><code>f45b373</code></a>
Backport: fix(gateway): bump <code>@vercel/oidc</code> to latest (<a
href="https://redirect.github.com/vercel/ai/issues/9583">#9583</a>)</li>
<li><a
href="ef11cd5fd4"><code>ef11cd5</code></a>
Version Packages (<a
href="https://redirect.github.com/vercel/ai/issues/9575">#9575</a>)</li>
<li><a
href="11a886793f"><code>11a8867</code></a>
Backport: feat (provider/gateway): improve auth error messages (<a
href="https://redirect.github.com/vercel/ai/issues/9573">#9573</a>)</li>
<li><a
href="099ed347f1"><code>099ed34</code></a>
Backport: docs(tools): update multi-modal tool results providers and
example ...</li>
<li><a
href="951ad41832"><code>951ad41</code></a>
Version Packages (<a
href="https://redirect.github.com/vercel/ai/issues/9567">#9567</a>)</li>
<li>Additional commits viewable in <a
href="https://github.com/vercel/ai/compare/@ai-sdk/react@2.0.68...@ai-sdk/react@2.0.76">compare
view</a></li>
</ul>
</details>
<br />
Updates `ai` from 5.0.68 to 5.0.76
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a href="https://github.com/vercel/ai/releases">ai's
releases</a>.</em></p>
<blockquote>
<h2>ai@5.0.76</h2>
<h3>Patch Changes</h3>
<ul>
<li>87b03d5: feat(ui): add isDataUIPart helper</li>
</ul>
<h2>ai@5.0.75</h2>
<h3>Patch Changes</h3>
<ul>
<li>Updated dependencies [76678cd]
<ul>
<li><code>@ai-sdk/gateway</code><a
href="https://github.com/2"><code>@2</code></a>.0.0</li>
</ul>
</li>
</ul>
<h2>ai@5.0.74</h2>
<h3>Patch Changes</h3>
<ul>
<li>Updated dependencies [11a8867]
<ul>
<li><code>@ai-sdk/gateway</code><a
href="https://github.com/1"><code>@1</code></a>.0.41</li>
</ul>
</li>
</ul>
<h2>ai@5.0.73</h2>
<h3>Patch Changes</h3>
<ul>
<li>734c4c3: fix(ai): add missing export for
<code>LoadSettingError</code></li>
</ul>
</blockquote>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a
href="716c41cee8"><code>716c41c</code></a>
Version Packages (<a
href="https://redirect.github.com/vercel/ai/issues/9602">#9602</a>)</li>
<li><a
href="87b03d5abe"><code>87b03d5</code></a>
Backport: feat(ui): add isDataUIPart helper (<a
href="https://redirect.github.com/vercel/ai/issues/9598">#9598</a>)</li>
<li><a
href="58d701fc59"><code>58d701f</code></a>
Backport: docs: fix openai provider section of migration guide (<a
href="https://redirect.github.com/vercel/ai/issues/9592">#9592</a>)</li>
<li><a
href="7a6b5497bf"><code>7a6b549</code></a>
Version Packages (<a
href="https://redirect.github.com/vercel/ai/issues/9587">#9587</a>)</li>
<li><a
href="76678cdabc"><code>76678cd</code></a>
Backport: fix(gateway): trigger release (<a
href="https://redirect.github.com/vercel/ai/issues/9585">#9585</a>)</li>
<li><a
href="f45b3738f6"><code>f45b373</code></a>
Backport: fix(gateway): bump <code>@vercel/oidc</code> to latest (<a
href="https://redirect.github.com/vercel/ai/issues/9583">#9583</a>)</li>
<li><a
href="ef11cd5fd4"><code>ef11cd5</code></a>
Version Packages (<a
href="https://redirect.github.com/vercel/ai/issues/9575">#9575</a>)</li>
<li><a
href="11a886793f"><code>11a8867</code></a>
Backport: feat (provider/gateway): improve auth error messages (<a
href="https://redirect.github.com/vercel/ai/issues/9573">#9573</a>)</li>
<li><a
href="099ed347f1"><code>099ed34</code></a>
Backport: docs(tools): update multi-modal tool results providers and
example ...</li>
<li><a
href="951ad41832"><code>951ad41</code></a>
Version Packages (<a
href="https://redirect.github.com/vercel/ai/issues/9567">#9567</a>)</li>
<li>Additional commits viewable in <a
href="https://github.com/vercel/ai/compare/ai@5.0.68...ai@5.0.76">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 merge` will merge this PR after your CI passes on it
- `@dependabot squash and merge` will squash and merge this PR after
your CI passes on it
- `@dependabot cancel merge` will cancel a previously requested merge
and block automerging
- `@dependabot reopen` will reopen this PR if it is closed
- `@dependabot close` will close this PR and stop Dependabot recreating
it. You can achieve the same result by closing it manually
- `@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-patch group with 3 updates:
[@rollup/plugin-node-resolve](https://github.com/rollup/plugins/tree/HEAD/packages/node-resolve),
[typescript-eslint](https://github.com/typescript-eslint/typescript-eslint/tree/HEAD/packages/typescript-eslint)
and
[vite-plugin-static-copy](https://github.com/sapphi-red/vite-plugin-static-copy).
Updates `@rollup/plugin-node-resolve` from 16.0.2 to 16.0.3
<details>
<summary>Changelog</summary>
<p><em>Sourced from <a
href="https://github.com/rollup/plugins/blob/master/packages/node-resolve/CHANGELOG.md"><code>@rollup/plugin-node-resolve</code>'s
changelog</a>.</em></p>
<blockquote>
<h2>v16.0.3</h2>
<p><em>2025-10-13</em></p>
<h3>Bugfixes</h3>
<ul>
<li>fix: resolve bare targets of package "imports" using
export maps; avoid fileURLToPath(null) (<a
href="https://github.com/rollup/plugins/tree/HEAD/packages/node-resolve/issues/1908">#1908</a>)</li>
</ul>
</blockquote>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a
href="764910a09d"><code>764910a</code></a>
chore(release): node-resolve v16.0.3</li>
<li><a
href="35697207a4"><code>3569720</code></a>
fix(node-resolve): resolve bare targets of package "imports"
using export map...</li>
<li>See full diff in <a
href="https://github.com/rollup/plugins/commits/node-resolve-v16.0.3/packages/node-resolve">compare
view</a></li>
</ul>
</details>
<br />
Updates `typescript-eslint` from 8.46.0 to 8.46.1
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a
href="https://github.com/typescript-eslint/typescript-eslint/releases">typescript-eslint's
releases</a>.</em></p>
<blockquote>
<h2>v8.46.1</h2>
<h2>8.46.1 (2025-10-13)</h2>
<h3>🩹 Fixes</h3>
<ul>
<li><strong>ast-spec:</strong> cleanup <code>TSLiteralType</code> (<a
href="https://redirect.github.com/typescript-eslint/typescript-eslint/pull/11624">#11624</a>)</li>
<li><strong>eslint-plugin:</strong> [prefer-optional-chain] include
mixed "nullish comparison style" chains in checks (<a
href="https://redirect.github.com/typescript-eslint/typescript-eslint/pull/11533">#11533</a>)</li>
<li><strong>eslint-plugin:</strong> [no-misused-promises] special-case
<code>.finally</code> not to report when a promise returning function is
provided as an argument (<a
href="https://redirect.github.com/typescript-eslint/typescript-eslint/pull/11667">#11667</a>)</li>
</ul>
<h3>❤️ Thank You</h3>
<ul>
<li>Abraham Guo</li>
<li>mdm317</li>
<li>Ronen Amiel</li>
</ul>
<p>You can read about our <a
href="https://typescript-eslint.io/users/versioning">versioning
strategy</a> and <a
href="https://typescript-eslint.io/users/releases">releases</a> on our
website.</p>
</blockquote>
</details>
<details>
<summary>Changelog</summary>
<p><em>Sourced from <a
href="https://github.com/typescript-eslint/typescript-eslint/blob/main/packages/typescript-eslint/CHANGELOG.md">typescript-eslint's
changelog</a>.</em></p>
<blockquote>
<h2>8.46.1 (2025-10-13)</h2>
<p>This was a version bump only for typescript-eslint to align it with
other projects, there were no code changes.</p>
<p>You can read about our <a
href="https://typescript-eslint.io/users/versioning">versioning
strategy</a> and <a
href="https://typescript-eslint.io/users/releases">releases</a> on our
website.</p>
</blockquote>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a
href="3f5fbf698e"><code>3f5fbf6</code></a>
chore(release): publish 8.46.1</li>
<li>See full diff in <a
href="https://github.com/typescript-eslint/typescript-eslint/commits/v8.46.1/packages/typescript-eslint">compare
view</a></li>
</ul>
</details>
<br />
Updates `vite-plugin-static-copy` from 3.1.3 to 3.1.4
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a
href="https://github.com/sapphi-red/vite-plugin-static-copy/releases">vite-plugin-static-copy's
releases</a>.</em></p>
<blockquote>
<h2>vite-plugin-static-copy@3.1.4</h2>
<h3>Patch Changes</h3>
<ul>
<li><a
href="https://redirect.github.com/sapphi-red/vite-plugin-static-copy/pull/204">#204</a>
<a
href="d0b5370352"><code>d0b5370</code></a>
Thanks <a
href="https://github.com/stianjensen"><code>@stianjensen</code></a>! -
Removed <code>fs-extra</code> dependency in favor of
<code>node:fs</code>. This should not affect the behavior.</li>
</ul>
</blockquote>
</details>
<details>
<summary>Changelog</summary>
<p><em>Sourced from <a
href="https://github.com/sapphi-red/vite-plugin-static-copy/blob/main/CHANGELOG.md">vite-plugin-static-copy's
changelog</a>.</em></p>
<blockquote>
<h2>3.1.4</h2>
<h3>Patch Changes</h3>
<ul>
<li><a
href="https://redirect.github.com/sapphi-red/vite-plugin-static-copy/pull/204">#204</a>
<a
href="d0b5370352"><code>d0b5370</code></a>
Thanks <a
href="https://github.com/stianjensen"><code>@stianjensen</code></a>! -
Removed <code>fs-extra</code> dependency in favor of
<code>node:fs</code>. This should not affect the behavior.</li>
</ul>
</blockquote>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a
href="a7e8639783"><code>a7e8639</code></a>
chore: update versions (<a
href="https://redirect.github.com/sapphi-red/vite-plugin-static-copy/issues/206">#206</a>)</li>
<li><a
href="d0b5370352"><code>d0b5370</code></a>
refactor: replace <code>fs-extra</code> with <code>node:fs</code> (<a
href="https://redirect.github.com/sapphi-red/vite-plugin-static-copy/issues/204">#204</a>)</li>
<li>See full diff in <a
href="https://github.com/sapphi-red/vite-plugin-static-copy/compare/vite-plugin-static-copy@3.1.3...vite-plugin-static-copy@3.1.4">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 merge` will merge this PR after your CI passes on it
- `@dependabot squash and merge` will squash and merge this PR after
your CI passes on it
- `@dependabot cancel merge` will cancel a previously requested merge
and block automerging
- `@dependabot reopen` will reopen this PR if it is closed
- `@dependabot close` will close this PR and stop Dependabot recreating
it. You can achieve the same result by closing it manually
- `@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
[github.com/aws/aws-sdk-go-v2/config](https://github.com/aws/aws-sdk-go-v2)
from 1.31.8 to 1.31.13.
<details>
<summary>Commits</summary>
<ul>
<li><a
href="b9b0c6553b"><code>b9b0c65</code></a>
Release 2025-10-16</li>
<li><a
href="e2bc8a0ec6"><code>e2bc8a0</code></a>
Regenerated Clients</li>
<li><a
href="8691ee380a"><code>8691ee3</code></a>
Update API model</li>
<li><a
href="51e8a3fe03"><code>51e8a3f</code></a>
bump to go1.23 (<a
href="https://redirect.github.com/aws/aws-sdk-go-v2/issues/3211">#3211</a>)</li>
<li><a
href="ad2d36cba7"><code>ad2d36c</code></a>
Release 2025-10-15</li>
<li><a
href="19a35d639f"><code>19a35d6</code></a>
Regenerated Clients</li>
<li><a
href="35cb02fd50"><code>35cb02f</code></a>
Update endpoints model</li>
<li><a
href="f673a1b0a8"><code>f673a1b</code></a>
Update API model</li>
<li><a
href="48421fd812"><code>48421fd</code></a>
Release 2025-10-14</li>
<li><a
href="fedcba778c"><code>fedcba7</code></a>
Regenerated Clients</li>
<li>Additional commits viewable in <a
href="https://github.com/aws/aws-sdk-go-v2/compare/config/v1.31.8...config/v1.31.13">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 merge` will merge this PR after your CI passes on it
- `@dependabot squash and merge` will squash and merge this PR after
your CI passes on it
- `@dependabot cancel merge` will cancel a previously requested merge
and block automerging
- `@dependabot reopen` will reopen this PR if it is closed
- `@dependabot close` will close this PR and stop Dependabot recreating
it. You can achieve the same result by closing it manually
- `@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>
This PR adds support for mobile user agent emulation in web widgets,
enabling developers to test mobile-responsive websites directly within
WaveTerm.
## Changes
### New Meta Key: `web:useragenttype`
Added a new metadata key that accepts the following values:
- `"default"` (or `null`) - Uses the standard browser user agent
- `"mobile:iphone"` - Emulates iPhone Safari (iOS 17.0)
- `"mobile:android"` - Emulates Android Chrome (Android 13)
### User Interface
**Settings Menu**: Added a "User Agent Type" submenu to web widget
settings (accessible via right-click → Settings) with radio button
options for Default, Mobile: iPhone, and Mobile: Android.
**Visual Indicator**: When a mobile user agent is active, a mobile
device icon appears in the widget's header toolbar with an appropriate
tooltip indicating the current emulation mode.
### Implementation Details
The implementation leverages Electron's webview `useragent` attribute to
override the default user agent string. The setting is persisted in the
block's metadata and automatically applied when the webview is rendered.
User agent strings used:
- **iPhone**: `Mozilla/5.0 (iPhone; CPU iPhone OS 17_0 like Mac OS X)
AppleWebKit/605.1.15 (KHTML, like Gecko) Version/17.0 Mobile/15E148
Safari/604.1`
- **Android**: `Mozilla/5.0 (Linux; Android 13) AppleWebKit/537.36
(KHTML, like Gecko) Chrome/120.0.6099.43 Mobile Safari/537.36`
## Use Cases
This feature is particularly useful for:
- Testing mobile-responsive web designs
- Debugging mobile-specific website behaviors
- Viewing mobile versions of websites without needing physical devices
- Web development workflows that require testing across different user
agents
## Files Changed
- `pkg/waveobj/wtypemeta.go` - Added `WebUserAgentType` field to
metadata type
- `frontend/types/gotypes.d.ts` - Generated TypeScript types for the new
meta key
- `frontend/app/view/webview/webview.tsx` - Implemented user agent
selection UI and webview configuration
- `pkg/waveobj/metaconsts.go` - Generated Go constants for the new meta
key
Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>
Co-authored-by: sawka <2722291+sawka@users.noreply.github.com>
## Overview
This PR implements OSC 7 (current working directory reporting) support
for Fish shell and PowerShell, completing the shell integration coverage
alongside the existing Bash and Zsh implementations added in #2444.
## What is OSC 7?
OSC 7 is an operating system command that allows shells to automatically
report their current working directory to the terminal emulator using
the format:
```
ESC]7;file://hostname/path BEL
```
This enables the terminal to track the current directory without manual
commands, providing better context for AI features and ensuring accurate
path information.
## Implementation Details
### Fish Shell (`fish_wavefish.sh`)
Added shell integration functions using Fish-native features:
- `_waveterm_si_blocked()` - Prevents OSC 7 in tmux/screen environments
using `set -q` and `string match -q`
- `_waveterm_si_osc7()` - Sends the OSC 7 sequence with built-in URL
encoding
- Uses `string escape --style=url` for UTF-8 percent-encoding
- Hooked to `fish_prompt` event and `PWD` variable changes for automatic
updates
**Key Features:**
- Fish-native checks (`set -q`, `string match`) instead of non-portable
`test -o`
- Built-in `string escape --style=url` for proper UTF-8 percent-encoding
- Simple, portable, and maintainable (32 lines total)
### PowerShell (`pwsh_wavepwsh.sh`)
Added simplified shell integration that leverages frontend
normalization:
- `_waveterm_si_blocked()` - Prevents OSC 7 in tmux/screen environments
- `_waveterm_si_osc7()` - Sends OSC 7 with raw path encoding
- Uses `[System.Uri]::EscapeDataString()` for proper percent-encoding
- Integrated into the prompt function while preserving existing prompts
**Key Features:**
- **No path rewriting**: Sends raw paths (e.g., `C:\Users\Name` →
`C%3A%5CUsers%5CName`)
- **UNC support**: Network paths like `\\server\share` encoded as
`%5C%5Cserver%5Cshare`
- **Hostname fallback**: `$env:COMPUTERNAME` → `$env:HOSTNAME` → empty
(produces `file:///path`)
- **No DNS lookup**: Avoids potentially slow DNS calls
- Simple and efficient (53 lines total)
## Implementation Benefits
Both implementations use native, built-in features for maximum
compatibility and maintainability:
**Fish:**
- ✅ Replaced `test -o` with fish-native `set -q` and `string match -q`
for better portability
- ✅ Replaced manual string replacements with `string escape --style=url`
for proper UTF-8 support
- ✅ Removed custom URL encoding function (19 lines removed)
**PowerShell:**
- ✅ Uses built-in `[System.Uri]::EscapeDataString()` for proper
percent-encoding
- ✅ No path rewriting - frontend handles normalization via
`decodeURIComponent()` and backslash conversion
- ✅ Proper UNC path support without special-casing
- ✅ Removed DNS lookup to avoid slow operations
- ✅ Removed custom URL encoding function
## Testing
All implementations were tested for:
- ✅ URL encoding of special characters (spaces, #, ?, &, ;, +, %)
- ✅ Correct OSC 7 format generation
- ✅ Fish-native checks work correctly (TMUX, STY, TERM patterns)
- ✅ Raw path encoding (PowerShell - no rewriting)
- ✅ UNC path support (PowerShell)
- ✅ Unix path handling
- ✅ Go package compilation
- ✅ No security issues (CodeQL)
## Path Handling Examples
**Fish:**
- `/home/user` → `/home/user`
- `/path with spaces` → `/path%20with%20spaces`
- `/file#hash` → `/file%23hash`
**PowerShell:**
- Windows: `C:\Users\Name` → `file://HOST/C%3A%5CUsers%5CName`
- UNC: `\\server\share\folder` →
`file://HOST/%5C%5Cserver%5Cshare%5Cfolder`
- Empty hostname: produces `file:///path` format
## Files Changed
- `pkg/util/shellutil/shellintegration/fish_wavefish.sh` (+22 lines, -18
lines = net +4 lines, but 19 lines of custom code removed)
- `pkg/util/shellutil/shellintegration/pwsh_wavepwsh.sh` (+26 lines, -51
lines = net -25 lines)
Total: 38 fewer lines of code with better functionality and
maintainability.
Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>
Co-authored-by: sawka <2722291+sawka@users.noreply.github.com>
* add automatic OSC 7 support to bash and zsh
* add new wave OSC 16162 (planck length) to get up-to-date shell
information into blockrtinfo. currently implemented only for zsh. bash
will not support as rich of data as zsh, but we'll be able to do some.
* new rtinfo will be used to provide better context for AI in the
future, and to make sure AI is running safe commands.
* added a small local machine description to tab context (so AI knows
we're running on MacOS, Linux, or Windows)
Documentation Updates (removing AI Widget Information / deprecation)
Hover effect on tool calls shows which widget is effected
Remove AI Widget from sidebar unless there is customized presets
Backend now provides blockid (if available) to frontend for tool calls
We now show all Read File/Dir calls together and batch approve them
(backend change to emit them all at once, and FE change to display them
as a batch)
JS chunking for monaco, mermaid, and shiki, etc. shiki is huge, almost
10M but can't be easily split out of Streamdown. Tried making it load
async, but w/ Streamdown we can't do that easily. Trying to split the JS
up because of a build error we were running into in build-helper.