Commit graph

2226 commits

Author SHA1 Message Date
Mike Sawka
7ac2f25b04
big improvements to waveapp builder (#2550)
* build manifest
* working on secrets injection (secretstore + secret-bindings.json)
* tool progress indicators
* build output and errors injected as the result of the edit calls so AI
gets instant feedback on edits
* change edits to not be atomic (allows AI to make better progress)
* updated binary location for waveapps
* publish button
* new partial json parser (for sending incremental tool progress
indication)
* updated tsunami view to use new embedded scaffold + config vars
* lots of work on cleaning up the output so it is more useful to users +
AI agents
* fix builder init flow
2025-11-13 17:54:17 -08:00
Mike Sawka
48c6b95790
remove unused shadcn elements and radix-ui deps. also remove unused donutchart/chart class (#2547) 2025-11-11 19:57:12 -08:00
Mike Sawka
4da6a39303
New AI Thinking Control (#2543)
Create an AI Thinking Dropdown in Wave AI.
Quick, Balanced, or Deep which map to gpt-5-mini, gpt-5 (low thinking),
or gpt-5 (medium thinking). Also default down to Quick when no premium
requests.
2025-11-11 19:46:10 -08:00
Mike Sawka
0da0a6421e
when the AI edits a file it now triggers a rebuild and the AI gets the tool output (#2546) 2025-11-11 18:08:56 -08:00
Mike Sawka
eb3ba64121
cleaned up build output w/ "debug" lines and filtering (#2545) 2025-11-11 11:53:57 -08:00
Mike Sawka
3a08c5518d
add a 'check go version' command to RPC (#2542) 2025-11-10 22:46:56 -08:00
Mike Sawka
7955bf6279
tsunami -- handle onSubmit and onChange for file inputs (#2541)
new VDomFormData and VDomFileData (and an async path for event handling on the FE)
2025-11-10 20:00:18 -08:00
Mike Sawka
34062ad226
capture go build / go mod tidy output to outputcapture (#2540) 2025-11-10 19:55:46 -08:00
Copilot
f12ae1ee78
Add RenameLocalApp function to waveappstore (#2536)
## Plan: Add RenameLocalApp function to waveappstore

- [x] Analyze existing code patterns in waveappstore.go
- [x] Implement RenameLocalApp(appName string, newAppName string) error
function
  - Validate newAppName using existing validation
- Check if local/[appname] exists and rename to local/[newAppName] if it
does
- Check if draft/[appname] exists and rename to draft/[newAppName] if it
does
  - Handle errors appropriately including rollback on partial failure
- [x] Add documentation comments
- [x] Run security checks (CodeQL - no issues found)

## Summary

Successfully implemented `RenameLocalApp(appName string, newAppName
string) error` function that:
- Renames local apps in both `local/` and `draft/` namespaces
- Validates app names and checks for conflicts
- Implements proper error handling with rollback on partial failure
- Passes all security checks with zero vulnerabilities



Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>
Co-authored-by: sawka <2722291+sawka@users.noreply.github.com>
2025-11-10 16:46:52 -08:00
Mike Sawka
8c50f7b0b3
revert file telemetry (#2538) 2025-11-10 16:34:35 -08:00
dependabot[bot]
0f36b1ca92
Bump github.com/aws/aws-sdk-go-v2/config from 1.31.15 to 1.31.17 (#2531)
Bumps
[github.com/aws/aws-sdk-go-v2/config](https://github.com/aws/aws-sdk-go-v2)
from 1.31.15 to 1.31.17.
<details>
<summary>Commits</summary>
<ul>
<li><a
href="aacca0a210"><code>aacca0a</code></a>
Release 2025-11-04</li>
<li><a
href="f2f7085b91"><code>f2f7085</code></a>
Regenerated Clients</li>
<li><a
href="98ac357edf"><code>98ac357</code></a>
Update endpoints model</li>
<li><a
href="545573ffc3"><code>545573f</code></a>
Update API model</li>
<li><a
href="0c4b1ae238"><code>0c4b1ae</code></a>
upgrade to smithy-go v1.23.2 to track allocation improvements (<a
href="https://redirect.github.com/aws/aws-sdk-go-v2/issues/3222">#3222</a>)</li>
<li><a
href="bae1d689b9"><code>bae1d68</code></a>
Release 2025-11-03</li>
<li><a
href="67d7b9cb02"><code>67d7b9c</code></a>
Regenerated Clients</li>
<li><a
href="74be9b92bd"><code>74be9b9</code></a>
Update API model</li>
<li><a
href="3242971cac"><code>3242971</code></a>
Release 2025-10-31</li>
<li><a
href="2db47dca34"><code>2db47dc</code></a>
Regenerated Clients</li>
<li>Additional commits viewable in <a
href="https://github.com/aws/aws-sdk-go-v2/compare/config/v1.31.15...config/v1.31.17">compare
view</a></li>
</ul>
</details>
<br />


[![Dependabot compatibility
score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=github.com/aws/aws-sdk-go-v2/config&package-manager=go_modules&previous-version=1.31.15&new-version=1.31.17)](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>
2025-11-07 18:21:24 -08:00
dependabot[bot]
aa2cfd59bb
Bump the dev-dependencies-patch group with 6 updates (#2532)
Bumps the dev-dependencies-patch group with 6 updates:

| Package | From | To |
| --- | --- | --- |
|
[@tailwindcss/vite](https://github.com/tailwindlabs/tailwindcss/tree/HEAD/packages/@tailwindcss-vite)
| `4.1.16` | `4.1.17` |
|
[@vitejs/plugin-react-swc](https://github.com/vitejs/vite-plugin-react/tree/HEAD/packages/plugin-react-swc)
| `4.2.0` | `4.2.1` |
|
[tailwindcss](https://github.com/tailwindlabs/tailwindcss/tree/HEAD/packages/tailwindcss)
| `4.1.16` | `4.1.17` |
|
[typescript-eslint](https://github.com/typescript-eslint/typescript-eslint/tree/HEAD/packages/typescript-eslint)
| `8.46.2` | `8.46.3` |
|
[vite-plugin-image-optimizer](https://github.com/FatehAK/vite-plugin-image-optimizer)
| `2.0.2` | `2.0.3` |
|
[@tailwindcss/cli](https://github.com/tailwindlabs/tailwindcss/tree/HEAD/packages/@tailwindcss-cli)
| `4.1.16` | `4.1.17` |

Updates `@tailwindcss/vite` from 4.1.16 to 4.1.17
<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.1.17</h2>
<h3>Fixed</h3>
<ul>
<li>Substitute <code>@variant</code> inside legacy JS APIs (<a
href="https://redirect.github.com/tailwindlabs/tailwindcss/pull/19263">#19263</a>)</li>
<li>Prevent occasional crash on Windows when loaded into a worker thread
(<a
href="https://redirect.github.com/tailwindlabs/tailwindcss/pull/19242">#19242</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.1.17] - 2025-11-06</h2>
<h3>Fixed</h3>
<ul>
<li>Substitute <code>@variant</code> inside legacy JS APIs (<a
href="https://redirect.github.com/tailwindlabs/tailwindcss/pull/19263">#19263</a>)</li>
<li>Prevent occasional crash on Windows when loaded into a worker thread
(<a
href="https://redirect.github.com/tailwindlabs/tailwindcss/pull/19242">#19242</a>)</li>
</ul>
</blockquote>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a
href="e9c9c4f79d"><code>e9c9c4f</code></a>
Release v4.1.17 (<a
href="https://github.com/tailwindlabs/tailwindcss/tree/HEAD/packages/@tailwindcss-vite/issues/19272">#19272</a>)</li>
<li>See full diff in <a
href="https://github.com/tailwindlabs/tailwindcss/commits/v4.1.17/packages/@tailwindcss-vite">compare
view</a></li>
</ul>
</details>
<br />

Updates `@vitejs/plugin-react-swc` from 4.2.0 to 4.2.1
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a
href="https://github.com/vitejs/vite-plugin-react/releases"><code>@​vitejs/plugin-react-swc</code>'s
releases</a>.</em></p>
<blockquote>
<h2>plugin-react@4.2.1</h2>
<p>Remove generic parameter on <code>Plugin</code> to avoid type error
with Rollup 4/Vite 5 and <code>skipLibCheck: false</code>.</p>
<p>I expect very few people to currently use this feature, but if you
are extending the React plugin via <code>api</code> object, you can get
back the typing of the hook by importing
<code>ViteReactPluginApi</code>:</p>
<pre lang="ts"><code>import type { Plugin } from 'vite'
import type { ViteReactPluginApi } from '@vitejs/plugin-react'
<p>export const somePlugin: Plugin = {<br />
name: 'some-plugin',<br />
api: {<br />
reactBabel: (babelConfig) =&gt; {<br />
babelConfig.plugins.push('some-babel-plugin')<br />
},<br />
} satisfies ViteReactPluginApi,<br />
}<br />
</code></pre></p>
<h2>plugin-react-swc@4.2.1</h2>
<h3>Fix <code>@vitejs/plugin-react-swc/preamble</code> on build (<a
href="https://redirect.github.com/vitejs/vite-plugin-react/pull/962">#962</a>)</h3>
</blockquote>
</details>
<details>
<summary>Changelog</summary>
<p><em>Sourced from <a
href="https://github.com/vitejs/vite-plugin-react/blob/main/packages/plugin-react-swc/CHANGELOG.md"><code>@​vitejs/plugin-react-swc</code>'s
changelog</a>.</em></p>
<blockquote>
<h2>4.2.1 (2025-11-05)</h2>
<h3>Fix <code>@vitejs/plugin-react-swc/preamble</code> on build (<a
href="https://redirect.github.com/vitejs/vite-plugin-react/pull/962">#962</a>)</h3>
</blockquote>
</details>
<details>
<summary>Commits</summary>
<ul>
<li>See full diff in <a
href="https://github.com/vitejs/vite-plugin-react/commits/v4.2.1/packages/plugin-react-swc">compare
view</a></li>
</ul>
</details>
<br />

Updates `tailwindcss` from 4.1.16 to 4.1.17
<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.1.17</h2>
<h3>Fixed</h3>
<ul>
<li>Substitute <code>@variant</code> inside legacy JS APIs (<a
href="https://redirect.github.com/tailwindlabs/tailwindcss/pull/19263">#19263</a>)</li>
<li>Prevent occasional crash on Windows when loaded into a worker thread
(<a
href="https://redirect.github.com/tailwindlabs/tailwindcss/pull/19242">#19242</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.1.17] - 2025-11-06</h2>
<h3>Fixed</h3>
<ul>
<li>Substitute <code>@variant</code> inside legacy JS APIs (<a
href="https://redirect.github.com/tailwindlabs/tailwindcss/pull/19263">#19263</a>)</li>
<li>Prevent occasional crash on Windows when loaded into a worker thread
(<a
href="https://redirect.github.com/tailwindlabs/tailwindcss/pull/19242">#19242</a>)</li>
</ul>
</blockquote>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a
href="e9c9c4f79d"><code>e9c9c4f</code></a>
Release v4.1.17 (<a
href="https://github.com/tailwindlabs/tailwindcss/tree/HEAD/packages/tailwindcss/issues/19272">#19272</a>)</li>
<li><a
href="dc6a3ce349"><code>dc6a3ce</code></a>
Substitute <code>@variant</code> inside utilities (<a
href="https://github.com/tailwindlabs/tailwindcss/tree/HEAD/packages/tailwindcss/issues/19263">#19263</a>)</li>
<li><a
href="e71e70eda9"><code>e71e70e</code></a>
Update magic-string 0.30.19 → 0.30.21 (minor) (<a
href="https://github.com/tailwindlabs/tailwindcss/tree/HEAD/packages/tailwindcss/issues/19238">#19238</a>)</li>
<li>See full diff in <a
href="https://github.com/tailwindlabs/tailwindcss/commits/v4.1.17/packages/tailwindcss">compare
view</a></li>
</ul>
</details>
<br />

Updates `typescript-eslint` from 8.46.2 to 8.46.3
<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.3</h2>
<h2>8.46.3 (2025-11-03)</h2>
<h3>🩹 Fixes</h3>
<ul>
<li><strong>eslint-plugin:</strong> [no-misused-promises] expand union
type to retrieve target property (<a
href="https://redirect.github.com/typescript-eslint/typescript-eslint/pull/11706">#11706</a>)</li>
<li><strong>eslint-plugin:</strong> [no-duplicate-enum-values] support
signed numbers (<a
href="https://redirect.github.com/typescript-eslint/typescript-eslint/pull/11722">#11722</a>,
<a
href="https://redirect.github.com/typescript-eslint/typescript-eslint/pull/11723">#11723</a>)</li>
</ul>
<h3>❤️ Thank You</h3>
<ul>
<li>Evgeny Stepanovych <a
href="https://github.com/undsoft"><code>@​undsoft</code></a></li>
<li>tao</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.3 (2025-11-03)</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="d9f3497dfb"><code>d9f3497</code></a>
chore(release): publish 8.46.3</li>
<li>See full diff in <a
href="https://github.com/typescript-eslint/typescript-eslint/commits/v8.46.3/packages/typescript-eslint">compare
view</a></li>
</ul>
</details>
<br />

Updates `vite-plugin-image-optimizer` from 2.0.2 to 2.0.3
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a
href="https://github.com/FatehAK/vite-plugin-image-optimizer/releases">vite-plugin-image-optimizer's
releases</a>.</em></p>
<blockquote>
<h2> v2.0.3</h2>
<ul>
<li>fix: allow regex to match a folder for exclude and include options
(<a
href="https://redirect.github.com/FatehAK/vite-plugin-image-optimizer/issues/55">#55</a>)
(e68c9b4)</li>
<li>Renovate: lockfile and non-major updates
<ul>
<li>Multiple Lock file maintenance and non-major dependency updates
across versions for stability and security.</li>
<li><code>@​typescript-eslint/parser</code> - Upgraded sequentially from
^8.35.1 → ^8.46.2</li>
<li>eslint - Incremental updates from ^9.30.1 → ^9.38.0</li>
<li>vite - Updated to v6.4.1 (security patch)</li>
<li><code>@​types/node</code> - Upgraded to ^24.3.0</li>
<li>pnpm - Updated to v10.15.0</li>
</ul>
</li>
</ul>
</blockquote>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a
href="a738e4c4bd"><code>a738e4c</code></a>
chore: Release v2.0.3</li>
<li><a
href="e68c9b40be"><code>e68c9b4</code></a>
fix: allow regex to match a folder for exclude and include options (<a
href="https://redirect.github.com/FatehAK/vite-plugin-image-optimizer/issues/55">#55</a>)</li>
<li><a
href="07aa35e580"><code>07aa35e</code></a>
chore(deps): Lock file maintenance</li>
<li><a
href="13e2b45b92"><code>13e2b45</code></a>
chore(deps): Update non-major dependencies</li>
<li><a
href="4302c3a8f9"><code>4302c3a</code></a>
chore(deps): Update dependency <code>@​typescript-eslint/parser</code>
to ^8.46.2</li>
<li><a
href="a72dcfe32e"><code>a72dcfe</code></a>
chore(deps): Update dependency vite to v6.4.1 [SECURITY]</li>
<li><a
href="0eebdadd60"><code>0eebdad</code></a>
chore(deps): Lock file maintenance</li>
<li><a
href="b0c50dd93f"><code>b0c50dd</code></a>
chore(deps): Update non-major dependencies</li>
<li><a
href="00d6afa6e7"><code>00d6afa</code></a>
chore(deps): Update eslint monorepo to ^9.38.0</li>
<li><a
href="08a481ab8b"><code>08a481a</code></a>
chore(deps): Update dependency <code>@​typescript-eslint/parser</code>
to ^8.46.1</li>
<li>Additional commits viewable in <a
href="https://github.com/FatehAK/vite-plugin-image-optimizer/compare/v2.0.2...v2.0.3">compare
view</a></li>
</ul>
</details>
<br />

Updates `@tailwindcss/cli` from 4.1.16 to 4.1.17
<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.1.17</h2>
<h3>Fixed</h3>
<ul>
<li>Substitute <code>@variant</code> inside legacy JS APIs (<a
href="https://redirect.github.com/tailwindlabs/tailwindcss/pull/19263">#19263</a>)</li>
<li>Prevent occasional crash on Windows when loaded into a worker thread
(<a
href="https://redirect.github.com/tailwindlabs/tailwindcss/pull/19242">#19242</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.1.17] - 2025-11-06</h2>
<h3>Fixed</h3>
<ul>
<li>Substitute <code>@variant</code> inside legacy JS APIs (<a
href="https://redirect.github.com/tailwindlabs/tailwindcss/pull/19263">#19263</a>)</li>
<li>Prevent occasional crash on Windows when loaded into a worker thread
(<a
href="https://redirect.github.com/tailwindlabs/tailwindcss/pull/19242">#19242</a>)</li>
</ul>
</blockquote>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a
href="e9c9c4f79d"><code>e9c9c4f</code></a>
Release v4.1.17 (<a
href="https://github.com/tailwindlabs/tailwindcss/tree/HEAD/packages/@tailwindcss-cli/issues/19272">#19272</a>)</li>
<li>See full diff in <a
href="https://github.com/tailwindlabs/tailwindcss/commits/v4.1.17/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 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>
2025-11-07 18:20:59 -08:00
Mike Sawka
e9bc34a03a
more work on tsunami builder (#2534) 2025-11-07 18:19:52 -08:00
Mike Sawka
a9db209218
Big Paste Handler Cleanup (#2535)
Handle both types of paste data. Write utility functions to normalize
paste events to {text; image}[]. Fix duplication issue (call
preventDefault() early). Handle multiple image pasting (by adding a
slight delay). Convert Ctrl:Shift:v to use a *native paste* which allows
capturing of images!
2025-11-07 18:15:49 -08:00
Mike Sawka
4b6a3ed330
secrets view (UI to manage wave secrets) (#2526) 2025-11-07 13:59:09 -08:00
togo01
8435958e32
feat(terminal): improve input handling for interactive CLI tools (#2523)
## Summary

This PR includes three terminal input improvements that enhance the
experience when using interactive CLI tools and IME input:

1. **Shift+Enter newline support**: Enable Shift+Enter to insert
newlines by default
2. **Image paste support**: Allow pasting images by saving them as
temporary files and pasting the file path
3. **IME duplicate input fix**: Fix duplicate text when switching input
methods during composition

## Motivation

### Shift+Enter for newlines
Currently, pressing Shift+Enter in the terminal behaves the same as
Enter, making it difficult to input multi-line commands or text in
interactive CLI tools. This change enables Shift+Enter to insert
newlines by default, matching common terminal emulator behavior.

### Image paste support
Interactive AI tools like Claude Code support receiving images through
file paths, but Wave Terminal currently doesn't support pasting images.
This change implements image paste functionality similar to iTerm2's
behavior: when an image is pasted, it's saved to a temporary file and
the path is pasted into the terminal.

### IME duplicate input fix
When using Chinese/Japanese/Korean IME in the terminal, switching input
methods with Capslock during composition causes the composed text to be
sent twice, resulting in duplicate output (e.g., "你好" becomes "你好你好").
This issue severely impacts users who frequently switch between
languages.

## Changes

### Shift+Enter newline (`frontend/app/view/term/term-model.ts`)
- Change default `shiftenternewline` config from `false` to `true`
- Send standard newline character (`\n`) instead of escape sequence
(`\^[\n`)

### Image paste (`frontend/app/view/term/term-model.ts`,
`frontend/app/view/term/termwrap.ts`)
- Add `handlePaste()` method to intercept Cmd+Shift+V paste events
- Add `handleImagePasteBlob()` to save images to `/tmp` and paste the
file path
- Detect image data in clipboard using both
`ClipboardEvent.clipboardData` and Clipboard API
- Support both screenshot paste and file copy scenarios
- Add 5MB size limit for pasted images
- Temporary files are created with format:
`waveterm_paste_[timestamp].[ext]`

### IME duplicate input fix (`frontend/app/view/term/termwrap.ts`,
`frontend/app/view/term/term-model.ts`)

**IME Composition Handling:**
- Track composition state (isComposing, composingData, etc.) in TermWrap
- Register compositionstart/update/end event listeners on xterm.js
textarea
- Block all data sends during composition, only allow after
compositionend
- Prevents xterm.js from sending intermediate data during
compositionupdate phase

**Deduplication Logic:**
- Implement 50ms time window deduplication for both IME and paste
operations
- Track first send after composition, block duplicate sends from
Capslock switching
- Ensure Ctrl+Space and Fn switching work correctly (single send only)

**Edge Case Handling:**
- Add blur event handler to reset composition state on focus loss
- Add Escape key handling to cancel composition in progress

## Testing

### Shift+Enter
1. Open a terminal in Wave
2. Press Shift+Enter
3. Verify that a newline is inserted instead of executing the command

### Image paste
1. Take a screenshot and copy it to clipboard (or copy an image file in
Finder)
2. In a terminal running Claude Code, paste the image (Cmd+V or
Cmd+Shift+V)
3. Verify that the image path appears and Claude Code recognizes it

### IME Input Testing

**IME Input:**
- [x] macOS Zhuyin IME + Capslock switching - no duplicate output 
- [x] macOS Zhuyin IME + Ctrl+Space switching - normal single input 
- [x] macOS Zhuyin IME + Fn switching - normal single input 

**Regression Testing:**
- [x] English keyboard input - normal operation 
- [x] Shift+Enter multiline input - works correctly 
- [x] Text paste (Cmd+Shift+V) - no duplicates 
- [x] Image paste - works correctly 
- [x] Basic command execution (ls, echo, etc.) - normal 
- [x] Cmd+K clear terminal - works correctly 
- [x] Copy selected text (Cmd+Shift+C) - works correctly 

## Demo


https://github.com/user-attachments/assets/8341cdf9-6c57-413e-b940-89e50cc79ff0


https://github.com/user-attachments/assets/d3a6e72a-f488-45c1-ab58-88391639455a


https://github.com/user-attachments/assets/ac178abd-caf3-40bf-9ef7-7cc0567a32c3




All features have been tested successfully on macOS with Claude Code in
Wave Terminal.
2025-11-07 13:56:06 -08:00
dependabot[bot]
a2f982509e
Bump google.golang.org/api from 0.254.0 to 0.255.0 (#2530)
Bumps
[google.golang.org/api](https://github.com/googleapis/google-api-go-client)
from 0.254.0 to 0.255.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.255.0</h2>
<h2><a
href="https://github.com/googleapis/google-api-go-client/compare/v0.254.0...v0.255.0">0.255.0</a>
(2025-11-04)</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/3357">#3357</a>)
(<a
href="430bc4639d">430bc46</a>)</li>
<li><strong>all:</strong> Auto-regenerate discovery clients (<a
href="https://redirect.github.com/googleapis/google-api-go-client/issues/3359">#3359</a>)
(<a
href="0bcacee13f">0bcacee</a>)</li>
<li><strong>all:</strong> Auto-regenerate discovery clients (<a
href="https://redirect.github.com/googleapis/google-api-go-client/issues/3360">#3360</a>)
(<a
href="c9cdcadebd">c9cdcad</a>)</li>
<li><strong>all:</strong> Auto-regenerate discovery clients (<a
href="https://redirect.github.com/googleapis/google-api-go-client/issues/3361">#3361</a>)
(<a
href="acdddcdc89">acdddcd</a>)</li>
<li><strong>all:</strong> Auto-regenerate discovery clients (<a
href="https://redirect.github.com/googleapis/google-api-go-client/issues/3362">#3362</a>)
(<a
href="040f8aaade">040f8aa</a>)</li>
<li><strong>all:</strong> Auto-regenerate discovery clients (<a
href="https://redirect.github.com/googleapis/google-api-go-client/issues/3364">#3364</a>)
(<a
href="8f13004c10">8f13004</a>)</li>
<li><strong>all:</strong> Auto-regenerate discovery clients (<a
href="https://redirect.github.com/googleapis/google-api-go-client/issues/3365">#3365</a>)
(<a
href="4ea8be06ce">4ea8be0</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.254.0...v0.255.0">0.255.0</a>
(2025-11-04)</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/3357">#3357</a>)
(<a
href="430bc4639d">430bc46</a>)</li>
<li><strong>all:</strong> Auto-regenerate discovery clients (<a
href="https://redirect.github.com/googleapis/google-api-go-client/issues/3359">#3359</a>)
(<a
href="0bcacee13f">0bcacee</a>)</li>
<li><strong>all:</strong> Auto-regenerate discovery clients (<a
href="https://redirect.github.com/googleapis/google-api-go-client/issues/3360">#3360</a>)
(<a
href="c9cdcadebd">c9cdcad</a>)</li>
<li><strong>all:</strong> Auto-regenerate discovery clients (<a
href="https://redirect.github.com/googleapis/google-api-go-client/issues/3361">#3361</a>)
(<a
href="acdddcdc89">acdddcd</a>)</li>
<li><strong>all:</strong> Auto-regenerate discovery clients (<a
href="https://redirect.github.com/googleapis/google-api-go-client/issues/3362">#3362</a>)
(<a
href="040f8aaade">040f8aa</a>)</li>
<li><strong>all:</strong> Auto-regenerate discovery clients (<a
href="https://redirect.github.com/googleapis/google-api-go-client/issues/3364">#3364</a>)
(<a
href="8f13004c10">8f13004</a>)</li>
<li><strong>all:</strong> Auto-regenerate discovery clients (<a
href="https://redirect.github.com/googleapis/google-api-go-client/issues/3365">#3365</a>)
(<a
href="4ea8be06ce">4ea8be0</a>)</li>
</ul>
</blockquote>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a
href="d7491ba219"><code>d7491ba</code></a>
chore(main): release 0.255.0 (<a
href="https://redirect.github.com/googleapis/google-api-go-client/issues/3358">#3358</a>)</li>
<li><a
href="4ea8be06ce"><code>4ea8be0</code></a>
feat(all): auto-regenerate discovery clients (<a
href="https://redirect.github.com/googleapis/google-api-go-client/issues/3365">#3365</a>)</li>
<li><a
href="5d5029ab3b"><code>5d5029a</code></a>
chore(all): update all to ab9386a (<a
href="https://redirect.github.com/googleapis/google-api-go-client/issues/3363">#3363</a>)</li>
<li><a
href="8f13004c10"><code>8f13004</code></a>
feat(all): auto-regenerate discovery clients (<a
href="https://redirect.github.com/googleapis/google-api-go-client/issues/3364">#3364</a>)</li>
<li><a
href="040f8aaade"><code>040f8aa</code></a>
feat(all): auto-regenerate discovery clients (<a
href="https://redirect.github.com/googleapis/google-api-go-client/issues/3362">#3362</a>)</li>
<li><a
href="acdddcdc89"><code>acdddcd</code></a>
feat(all): auto-regenerate discovery clients (<a
href="https://redirect.github.com/googleapis/google-api-go-client/issues/3361">#3361</a>)</li>
<li><a
href="c9cdcadebd"><code>c9cdcad</code></a>
feat(all): auto-regenerate discovery clients (<a
href="https://redirect.github.com/googleapis/google-api-go-client/issues/3360">#3360</a>)</li>
<li><a
href="0bcacee13f"><code>0bcacee</code></a>
feat(all): auto-regenerate discovery clients (<a
href="https://redirect.github.com/googleapis/google-api-go-client/issues/3359">#3359</a>)</li>
<li><a
href="430bc4639d"><code>430bc46</code></a>
feat(all): auto-regenerate discovery clients (<a
href="https://redirect.github.com/googleapis/google-api-go-client/issues/3357">#3357</a>)</li>
<li>See full diff in <a
href="https://github.com/googleapis/google-api-go-client/compare/v0.254.0...v0.255.0">compare
view</a></li>
</ul>
</details>
<br />


[![Dependabot compatibility
score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=google.golang.org/api&package-manager=go_modules&previous-version=0.254.0&new-version=0.255.0)](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>
2025-11-07 13:10:22 -08:00
dependabot[bot]
a13c9f7080
Bump github.com/aws/aws-sdk-go-v2/service/s3 from 1.89.1 to 1.90.0 (#2529)
Bumps
[github.com/aws/aws-sdk-go-v2/service/s3](https://github.com/aws/aws-sdk-go-v2)
from 1.89.1 to 1.90.0.
<details>
<summary>Commits</summary>
<ul>
<li><a
href="f4b6813928"><code>f4b6813</code></a>
Release 2025-11-05</li>
<li><a
href="2d7b311712"><code>2d7b311</code></a>
Regenerated Clients</li>
<li><a
href="9e31119128"><code>9e31119</code></a>
Update API model</li>
<li><a
href="aacca0a210"><code>aacca0a</code></a>
Release 2025-11-04</li>
<li><a
href="f2f7085b91"><code>f2f7085</code></a>
Regenerated Clients</li>
<li><a
href="98ac357edf"><code>98ac357</code></a>
Update endpoints model</li>
<li><a
href="545573ffc3"><code>545573f</code></a>
Update API model</li>
<li><a
href="0c4b1ae238"><code>0c4b1ae</code></a>
upgrade to smithy-go v1.23.2 to track allocation improvements (<a
href="https://redirect.github.com/aws/aws-sdk-go-v2/issues/3222">#3222</a>)</li>
<li><a
href="bae1d689b9"><code>bae1d68</code></a>
Release 2025-11-03</li>
<li><a
href="67d7b9cb02"><code>67d7b9c</code></a>
Regenerated Clients</li>
<li>Additional commits viewable in <a
href="https://github.com/aws/aws-sdk-go-v2/compare/service/s3/v1.89.1...service/s3/v1.90.0">compare
view</a></li>
</ul>
</details>
<br />


[![Dependabot compatibility
score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=github.com/aws/aws-sdk-go-v2/service/s3&package-manager=go_modules&previous-version=1.89.1&new-version=1.90.0)](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>
2025-11-07 13:10:00 -08:00
Mike Sawka
46218827c1
fix path mismatch issue, always expand path (#2527) 2025-11-07 13:09:38 -08:00
Mike Sawka
58392f7601
new secret store impl (#2525)
adds a new secret store protected by electron's safeStorage API.
currently just hooked up to the CLI via a new wsh command: `wsh secret`.

will be used to power secrets in tsunami later (and for config +
connections)
2025-11-05 15:40:54 -08:00
Mike Sawka
8ab15ef653
better panic debug strs (#2524) 2025-11-05 14:57:10 -08:00
wave-builder[bot]
6c5c82f64c
chore: bump package version to 0.12.2 2025-11-05 01:04:21 +00:00
Mike Sawka
03f776a301
remove the redundant term_command_output tool (#2522) 2025-11-04 16:39:19 -08:00
wave-builder[bot]
013e433f12
chore: bump package version to 0.12.2-beta.4 2025-11-04 22:42:26 +00:00
Mike Sawka
d82672c919
track number of terminal commands run (#2519) 2025-11-04 14:41:27 -08:00
Mike Sawka
5edb6f34ca
small changes to wave ai error handling (#2520) 2025-11-04 14:40:41 -08:00
Copilot
a23bbc00dc
Remove embedded docsite, always use live docs.waveterm.dev (#2503)
Removes the embedded Docusaurus build from the application. The help
view now always loads from https://docs.waveterm.dev/ instead of serving
a locally bundled copy. This eliminates package size constraints on
documentation content (e.g., videos) and removes unnecessary
build/packaging overhead.

**Backend changes:**
- Deleted `pkg/docsite` package entirely
- Removed docsite handler from `pkg/web/web.go`
- Simplified `emain/docsite.ts` to return constant URL instead of
probing for embedded docs

**Frontend changes:**
- Removed embedded URL translation logic from `helpview.tsx`
- Homepage URL now uses constant instead of IPC call

**Build configuration:**
- Removed `docsite:build:embedded` task and all references
- Removed `dist/docsite/**/*` from electron-builder asarUnpack
- Removed `build-embedded` script from docs package.json

Net result: -141 lines, +9 lines across 8 files.

<!-- START COPILOT CODING AGENT SUFFIX -->



<details>

<summary>Original prompt</summary>

> right now we build a docusaurus project to run both the online docs at
docs.waveterm.dev AND to embed into the application. but this limits
what we can show in the docs (especially large things like videos etc.)
> 
> the internal docs already fall back to the website when it cannot find
the embedded docs.
> 
> i'd like to update the build and packaging etc to no longer build the
embedded doc site. i'd also like to have the "help" view always render
the live doc site at https://docs.waveterm.dev.


</details>



<!-- 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>
2025-11-04 14:09:08 -08:00
Mike Sawka
2bf1bccd79
v0.12.2 release notes, onboarding flow (#2518) 2025-11-04 14:02:35 -08:00
Mike Sawka
2c53393cda
Make WaveAI context menu consistent with kebab menu (#2517) 2025-11-04 13:56:42 -08:00
Mike Sawka
a5fb38e640
upgrade to electron v38.5.0 (#2516) 2025-11-04 10:01:05 -08:00
wave-builder[bot]
e59a304bc4
chore: bump package version to 0.12.2-beta.3 2025-11-04 05:58:48 +00:00
Mike Sawka
dfa34c1e1b
assorted bugs: tool timeouts, schema files, and verifyinput callbacks (#2511) 2025-11-03 21:57:48 -08:00
wave-builder[bot]
523cea10c9
chore: bump package version to 0.12.2-beta.2 2025-11-04 02:20:23 +00:00
Mike Sawka
e359c766b0
fix huge memory leak in RPC system (#2510)
always remove from reqmap in Finalize even if done flag is already set.
2025-11-03 16:54:01 -08:00
wave-builder[bot]
984ed46a7a
chore: bump package version to 0.12.2-beta.1 2025-11-03 22:57:25 +00:00
Mike Sawka
956bf9587c
improve prompt caching by computing a deterministic hash (+ other bug fixes) (#2509) 2025-11-03 14:56:19 -08:00
wave-builder[bot]
8768269e2f
chore: bump package version to 0.12.2-beta.0 2025-11-03 21:00:55 +00:00
Mike Sawka
49c9d70601
various fixes and enhancements for v0.12.2 (#2508) 2025-11-03 12:31:18 -08:00
Mike Sawka
b442b91ee2
better tool input descriptions (#2507)
better tool input descriptions, also fixes a bug with utf-8/base64 in
the diff viewer.
2025-11-02 12:33:59 -08:00
Mike Sawka
a7d76d3dae
add ability to change thinking/maxtokens from waveai context menu (#2504) 2025-10-31 17:58:07 -07:00
Mostafa Khairy
bb12ed6ac0
feat: Add fullscreen launch setting (#1933) (#2490)
New UI Setting: Launch On Fullscreen

A new option has been added to the view menu allowing users to
enable fullscreen mode automatically when Wave launches. This setting is
persistent and can be toggled on a per-user basis.
2025-10-31 16:34:32 -07:00
Mostafa Khairy
be1dc2797d
remove unused imports and empty files (#2491)
- Cleaned up unused imports across the project to improve code
readability and maintainability.
- Deleted empty or obsolete files that are no longer in use.
- No functional changes introduced.
2025-10-31 16:31:51 -07:00
dependabot[bot]
6b75d46364
Bump google.golang.org/api from 0.253.0 to 0.254.0 (#2494)
Bumps
[google.golang.org/api](https://github.com/googleapis/google-api-go-client)
from 0.253.0 to 0.254.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.254.0</h2>
<h2><a
href="https://github.com/googleapis/google-api-go-client/compare/v0.253.0...v0.254.0">0.254.0</a>
(2025-10-28)</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/3348">#3348</a>)
(<a
href="8e2becc10c">8e2becc</a>)</li>
<li><strong>all:</strong> Auto-regenerate discovery clients (<a
href="https://redirect.github.com/googleapis/google-api-go-client/issues/3350">#3350</a>)
(<a
href="9e07cd04a1">9e07cd0</a>)</li>
<li><strong>all:</strong> Auto-regenerate discovery clients (<a
href="https://redirect.github.com/googleapis/google-api-go-client/issues/3351">#3351</a>)
(<a
href="470f33c232">470f33c</a>)</li>
<li><strong>all:</strong> Auto-regenerate discovery clients (<a
href="https://redirect.github.com/googleapis/google-api-go-client/issues/3352">#3352</a>)
(<a
href="cff2ae692e">cff2ae6</a>)</li>
<li><strong>all:</strong> Auto-regenerate discovery clients (<a
href="https://redirect.github.com/googleapis/google-api-go-client/issues/3354">#3354</a>)
(<a
href="6b3a07f3cd">6b3a07f</a>)</li>
<li><strong>all:</strong> Auto-regenerate discovery clients (<a
href="https://redirect.github.com/googleapis/google-api-go-client/issues/3355">#3355</a>)
(<a
href="4c613b616c">4c613b6</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.253.0...v0.254.0">0.254.0</a>
(2025-10-28)</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/3348">#3348</a>)
(<a
href="8e2becc10c">8e2becc</a>)</li>
<li><strong>all:</strong> Auto-regenerate discovery clients (<a
href="https://redirect.github.com/googleapis/google-api-go-client/issues/3350">#3350</a>)
(<a
href="9e07cd04a1">9e07cd0</a>)</li>
<li><strong>all:</strong> Auto-regenerate discovery clients (<a
href="https://redirect.github.com/googleapis/google-api-go-client/issues/3351">#3351</a>)
(<a
href="470f33c232">470f33c</a>)</li>
<li><strong>all:</strong> Auto-regenerate discovery clients (<a
href="https://redirect.github.com/googleapis/google-api-go-client/issues/3352">#3352</a>)
(<a
href="cff2ae692e">cff2ae6</a>)</li>
<li><strong>all:</strong> Auto-regenerate discovery clients (<a
href="https://redirect.github.com/googleapis/google-api-go-client/issues/3354">#3354</a>)
(<a
href="6b3a07f3cd">6b3a07f</a>)</li>
<li><strong>all:</strong> Auto-regenerate discovery clients (<a
href="https://redirect.github.com/googleapis/google-api-go-client/issues/3355">#3355</a>)
(<a
href="4c613b616c">4c613b6</a>)</li>
</ul>
</blockquote>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a
href="476426f2d0"><code>476426f</code></a>
chore(main): release 0.254.0 (<a
href="https://redirect.github.com/googleapis/google-api-go-client/issues/3349">#3349</a>)</li>
<li><a
href="4c613b616c"><code>4c613b6</code></a>
feat(all): auto-regenerate discovery clients (<a
href="https://redirect.github.com/googleapis/google-api-go-client/issues/3355">#3355</a>)</li>
<li><a
href="33b87ade12"><code>33b87ad</code></a>
chore(all): update all to 3a174f9 (<a
href="https://redirect.github.com/googleapis/google-api-go-client/issues/3353">#3353</a>)</li>
<li><a
href="6b3a07f3cd"><code>6b3a07f</code></a>
feat(all): auto-regenerate discovery clients (<a
href="https://redirect.github.com/googleapis/google-api-go-client/issues/3354">#3354</a>)</li>
<li><a
href="cff2ae692e"><code>cff2ae6</code></a>
feat(all): auto-regenerate discovery clients (<a
href="https://redirect.github.com/googleapis/google-api-go-client/issues/3352">#3352</a>)</li>
<li><a
href="470f33c232"><code>470f33c</code></a>
feat(all): auto-regenerate discovery clients (<a
href="https://redirect.github.com/googleapis/google-api-go-client/issues/3351">#3351</a>)</li>
<li><a
href="9e07cd04a1"><code>9e07cd0</code></a>
feat(all): auto-regenerate discovery clients (<a
href="https://redirect.github.com/googleapis/google-api-go-client/issues/3350">#3350</a>)</li>
<li><a
href="8e2becc10c"><code>8e2becc</code></a>
feat(all): auto-regenerate discovery clients (<a
href="https://redirect.github.com/googleapis/google-api-go-client/issues/3348">#3348</a>)</li>
<li>See full diff in <a
href="https://github.com/googleapis/google-api-go-client/compare/v0.253.0...v0.254.0">compare
view</a></li>
</ul>
</details>
<br />


[![Dependabot compatibility
score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=google.golang.org/api&package-manager=go_modules&previous-version=0.253.0&new-version=0.254.0)](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>
2025-10-31 16:30:37 -07:00
dependabot[bot]
cd5bc16cb3
Bump the dev-dependencies-minor group across 1 directory with 3 updates (#2499)
Bumps the dev-dependencies-minor group with 3 updates in the /
directory:
[@vitejs/plugin-react-swc](https://github.com/vitejs/vite-plugin-react/tree/HEAD/packages/plugin-react-swc),
[node-abi](https://github.com/electron/node-abi) and
[prettier-plugin-jsdoc](https://github.com/hosseinmd/prettier-plugin-jsdoc).

Updates `@vitejs/plugin-react-swc` from 4.1.0 to 4.2.0
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a
href="https://github.com/vitejs/vite-plugin-react/releases"><code>@​vitejs/plugin-react-swc</code>'s
releases</a>.</em></p>
<blockquote>
<h2>plugin-react@4.2.0</h2>
<h3>Update peer dependency range to target Vite 5</h3>
<p>There were no breaking change that impacted this plugin, so any
combination of React plugins and Vite core version will work.</p>
<h3>Align jsx runtime for optimized dependencies</h3>
<p>This will only affect people using internal libraries that contains
untranspiled JSX. This change aligns the optimizer with the source code
and avoid issues when the published source don't have <code>React</code>
in the scope.</p>
<p>Reminder: While being partially supported in Vite, publishing TS
&amp; JSX outside of internal libraries is highly discouraged.</p>
<h2>plugin-react-swc@4.2.0</h2>
<h3>Add <code>@vitejs/plugin-react-swc/preamble</code> virtual module
for SSR HMR (<a
href="https://redirect.github.com/vitejs/vite-plugin-react/pull/890">#890</a>)</h3>
<p>SSR applications can now initialize HMR runtime by importing
<code>@vitejs/plugin-react-swc/preamble</code> at the top of their
client entry instead of manually calling
<code>transformIndexHtml</code>. This simplifies SSR setup for
applications that don't use the <code>transformIndexHtml</code> API.</p>
<h3>Use SWC when useAtYourOwnRisk_mutateSwcOptions is provided (<a
href="https://redirect.github.com/vitejs/vite-plugin-react/pull/951">#951</a>)</h3>
<p>Previously, this plugin did not use SWC if plugins were not provided
even if <code>useAtYourOwnRisk_mutateSwcOptions</code> was provided.
This is now fixed.</p>
<h2>plugin-react@4.1.1</h2>
<ul>
<li>Enable retainLines to get correct line numbers for jsxDev (fix <a
href="https://redirect.github.com/vitejs/vite-plugin-react/issues/235">#235</a>)</li>
</ul>
</blockquote>
</details>
<details>
<summary>Changelog</summary>
<p><em>Sourced from <a
href="https://github.com/vitejs/vite-plugin-react/blob/main/packages/plugin-react-swc/CHANGELOG.md"><code>@​vitejs/plugin-react-swc</code>'s
changelog</a>.</em></p>
<blockquote>
<h2>4.2.0 (2025-10-24)</h2>
<h3>Add <code>@vitejs/plugin-react-swc/preamble</code> virtual module
for SSR HMR (<a
href="https://redirect.github.com/vitejs/vite-plugin-react/pull/890">#890</a>)</h3>
<p>SSR applications can now initialize HMR runtime by importing
<code>@vitejs/plugin-react-swc/preamble</code> at the top of their
client entry instead of manually calling
<code>transformIndexHtml</code>. This simplifies SSR setup for
applications that don't use the <code>transformIndexHtml</code> API.</p>
<h3>Use SWC when useAtYourOwnRisk_mutateSwcOptions is provided (<a
href="https://redirect.github.com/vitejs/vite-plugin-react/pull/951">#951</a>)</h3>
<p>Previously, this plugin did not use SWC if plugins were not provided
even if <code>useAtYourOwnRisk_mutateSwcOptions</code> was provided.
This is now fixed.</p>
</blockquote>
</details>
<details>
<summary>Commits</summary>
<ul>
<li>See full diff in <a
href="https://github.com/vitejs/vite-plugin-react/commits/v4.2.0/packages/plugin-react-swc">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 <code>@​vitejs/plugin-react-swc</code>
since your current version.</p>
</details>
<br />

Updates `node-abi` from 4.14.0 to 4.17.0
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a
href="https://github.com/electron/node-abi/releases">node-abi's
releases</a>.</em></p>
<blockquote>
<h2>v4.17.0</h2>
<h1><a
href="https://github.com/electron/node-abi/compare/v4.16.0...v4.17.0">4.17.0</a>
(2025-10-30)</h1>
<h3>Features</h3>
<ul>
<li>update ABI registry (<a
href="https://redirect.github.com/electron/node-abi/issues/243">#243</a>)
(<a
href="e1fbdddb1c">e1fbddd</a>)</li>
</ul>
<h2>v4.16.0</h2>
<h1><a
href="https://github.com/electron/node-abi/compare/v4.15.0...v4.16.0">4.16.0</a>
(2025-10-28)</h1>
<h3>Features</h3>
<ul>
<li>update ABI registry (<a
href="https://redirect.github.com/electron/node-abi/issues/233">#233</a>)
(<a
href="4614b6b467">4614b6b</a>)</li>
</ul>
<h2>v4.15.0</h2>
<h1><a
href="https://github.com/electron/node-abi/compare/v4.14.0...v4.15.0">4.15.0</a>
(2025-10-23)</h1>
<h3>Features</h3>
<ul>
<li>update ABI registry (<a
href="https://redirect.github.com/electron/node-abi/issues/227">#227</a>)
(<a
href="a0b95e07af">a0b95e0</a>)</li>
</ul>
</blockquote>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a
href="e1fbdddb1c"><code>e1fbddd</code></a>
feat: update ABI registry (<a
href="https://redirect.github.com/electron/node-abi/issues/243">#243</a>)</li>
<li><a
href="5e7b041ed8"><code>5e7b041</code></a>
ci: quick sleep before waiting on automated PR checks (<a
href="https://redirect.github.com/electron/node-abi/issues/240">#240</a>)</li>
<li><a
href="a0eb6a1b64"><code>a0eb6a1</code></a>
ci: tweak automated docs PR merging (<a
href="https://redirect.github.com/electron/node-abi/issues/239">#239</a>)</li>
<li><a
href="4614b6b467"><code>4614b6b</code></a>
feat: update ABI registry (<a
href="https://redirect.github.com/electron/node-abi/issues/233">#233</a>)</li>
<li><a
href="91c9478e5c"><code>91c9478</code></a>
ci: fix outputs syntax in release workflow (<a
href="https://redirect.github.com/electron/node-abi/issues/237">#237</a>)</li>
<li><a
href="7b12648e7c"><code>7b12648</code></a>
ci: update release environment name (<a
href="https://redirect.github.com/electron/node-abi/issues/236">#236</a>)</li>
<li><a
href="2e36924728"><code>2e36924</code></a>
ci: use new electron/secret-service-action (<a
href="https://redirect.github.com/electron/node-abi/issues/235">#235</a>)</li>
<li><a
href="e0c3ff071d"><code>e0c3ff0</code></a>
ci: use electron/secret-service action (<a
href="https://redirect.github.com/electron/node-abi/issues/234">#234</a>)</li>
<li><a
href="a0b95e07af"><code>a0b95e0</code></a>
feat: update ABI registry (<a
href="https://redirect.github.com/electron/node-abi/issues/227">#227</a>)</li>
<li><a
href="0683be1d61"><code>0683be1</code></a>
ci: bump electron/semantic-trusted-release to v1.0.1 (<a
href="https://redirect.github.com/electron/node-abi/issues/230">#230</a>)</li>
<li>Additional commits viewable in <a
href="https://github.com/electron/node-abi/compare/v4.14.0...v4.17.0">compare
view</a></li>
</ul>
</details>
<br />

Updates `prettier-plugin-jsdoc` from 1.3.3 to 1.5.0
<details>
<summary>Changelog</summary>
<p><em>Sourced from <a
href="https://github.com/hosseinmd/prettier-plugin-jsdoc/blob/master/CHANGELOG.md">prettier-plugin-jsdoc's
changelog</a>.</em></p>
<blockquote>
<h1>Changelog</h1>
<p>All notable changes to this project will be documented in this file.
See <a
href="https://github.com/conventional-changelog/standard-version">standard-version</a>
for commit guidelines.</p>
<h2><a
href="https://github.com/hosseinmd/prettier-plugin-jsdoc/compare/v1.3.3...v1.4.0">1.4.0</a>
(2025-10-29)</h2>
<h3>Features</h3>
<ul>
<li>add support for import tags (<a
href="https://redirect.github.com/hosseinmd/prettier-plugin-jsdoc/issues/252">#252</a>)
(<a
href="ab5c488b2d">ab5c488</a>)</li>
</ul>
</blockquote>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a
href="0260abfd71"><code>0260abf</code></a>
v1.5.0</li>
<li><a
href="4887997f86"><code>4887997</code></a>
chore(release): 1.4.0</li>
<li><a
href="ab5c488b2d"><code>ab5c488</code></a>
feat: add support for import tags (<a
href="https://redirect.github.com/hosseinmd/prettier-plugin-jsdoc/issues/252">#252</a>)</li>
<li><a
href="2c6d363f7f"><code>2c6d363</code></a>
test: prettier version bump into 3.6 (<a
href="https://redirect.github.com/hosseinmd/prettier-plugin-jsdoc/issues/248">#248</a>)</li>
<li>See full diff in <a
href="https://github.com/hosseinmd/prettier-plugin-jsdoc/compare/v1.3.3...v1.5.0">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>
2025-10-31 16:30:08 -07:00
dependabot[bot]
88d6772f17
Bump github.com/aws/aws-sdk-go-v2/service/s3 from 1.88.4 to 1.89.1 (#2497)
Bumps
[github.com/aws/aws-sdk-go-v2/service/s3](https://github.com/aws/aws-sdk-go-v2)
from 1.88.4 to 1.89.1.
<details>
<summary>Commits</summary>
<ul>
<li><a
href="d8ed081e9b"><code>d8ed081</code></a>
Release 2025-10-30</li>
<li><a
href="a2c9cb4705"><code>a2c9cb4</code></a>
Regenerated Clients</li>
<li><a
href="7af054b46f"><code>7af054b</code></a>
Update endpoints model</li>
<li><a
href="2e5ed49bd2"><code>2e5ed49</code></a>
Update API model</li>
<li><a
href="f3a3b6c778"><code>f3a3b6c</code></a>
remove arbitrary response read timeout in kinesis GetRecords (<a
href="https://redirect.github.com/aws/aws-sdk-go-v2/issues/3221">#3221</a>)</li>
<li><a
href="56af155211"><code>56af155</code></a>
Release 2025-10-29</li>
<li><a
href="b23832ac9b"><code>b23832a</code></a>
Regenerated Clients</li>
<li><a
href="33ea965f3e"><code>33ea965</code></a>
Update API model</li>
<li><a
href="f70c7889fa"><code>f70c788</code></a>
Release 2025-10-28</li>
<li><a
href="f8aa1f373d"><code>f8aa1f3</code></a>
Regenerated Clients</li>
<li>Additional commits viewable in <a
href="https://github.com/aws/aws-sdk-go-v2/compare/service/s3/v1.88.4...service/s3/v1.89.1">compare
view</a></li>
</ul>
</details>
<br />


[![Dependabot compatibility
score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=github.com/aws/aws-sdk-go-v2/service/s3&package-manager=go_modules&previous-version=1.88.4&new-version=1.89.1)](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>
2025-10-31 16:29:11 -07:00
Copilot
bf0312f69d
Add drag-and-drop from preview directory to WaveAI panel (#2502)
Enables dragging files from preview directory listings directly into the
WaveAI panel for analysis.

## Changes

**Modified `frontend/app/aipanel/aipanel.tsx`:**

- Added `useDrop` hook to accept `FILE_ITEM` drag type from preview
directory
- Implemented `handleFileItemDrop` to:
  - Read file content via `RpcApi.FileReadCommand` using the remote URI
  - Convert base64 data to browser `File` object with proper MIME type
  - Validate and add to panel using existing `model.addFile()` flow
- Integrated with existing drag overlay for visual feedback
- Rejects directories with appropriate error messaging

## Implementation

```typescript
const handleFileItemDrop = useCallback(
    async (draggedFile: DraggedFile) => {
        if (draggedFile.isDir) {
            model.setError("Cannot add directories to Wave AI. Please select a file.");
            return;
        }
        
        const fileData = await RpcApi.FileReadCommand(TabRpcClient, {
            info: { path: draggedFile.uri }
        }, null);
        
        const bytes = new Uint8Array(atob(fileData.data64).split('').map(c => c.charCodeAt(0)));
        const file = new File([bytes], draggedFile.relName, { 
            type: fileData.info?.mimetype || "application/octet-stream" 
        });
        
        // Existing validation and addFile flow
        await model.addFile(file);
    },
    [model]
);

const [{ isOver, canDrop }, drop] = useDrop(() => ({
    accept: "FILE_ITEM",
    drop: handleFileItemDrop,
    collect: (monitor) => ({ isOver: monitor.isOver(), canDrop: monitor.canDrop() })
}), [handleFileItemDrop]);
```

No changes required to preview directory—it already exports `FILE_ITEM`
drag items. Works independently from native file system drag-and-drop.

Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>
Co-authored-by: sawka <2722291+sawka@users.noreply.github.com>
2025-10-31 16:28:51 -07:00
Mike Sawka
a19cb6f300
Add Write File Tools to WaveAI (#2492)
also updates ROADMAP.md, and fixes a node pruning bug on the FE, and
adds a new diff viewer that we can view the write_text_file and
edit_text_file diffs in. adds a backup file system that can be used to restore AI edited files back to their original states.
2025-10-31 14:40:03 -07:00
Mike Sawka
5d4fa5ba4d
add env var to start pprof server (#2488) 2025-10-28 14:23:50 -07:00
Mike Sawka
ba573c4bcb
tsunami builder 3 (checkpoint) (#2487)
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...
2025-10-28 13:59:02 -07:00
Copilot
58e000bf12
Add alert and confirm modal system for tsunami apps (#2484)
## 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>
2025-10-27 18:11:19 -07:00