mirror of
https://github.com/wavetermdev/waveterm
synced 2026-04-21 14:37:16 +00:00
2620 commits
| Author | SHA1 | Message | Date | |
|---|---|---|---|---|
|
|
c411df40d5
|
chore: bump package version to 0.14.1-beta.1 | ||
|
|
e2b2498741
|
UI component for vertical tab bar
Dragging in the vertical tab bar had two UX artifacts: the drop marker
reserved layout space (leaving a visible accent gap above selected
tabs), and hover styling could remain on the old row after drop until
the mouse moved. This updates drag visuals to be overlay-based and
forces hover recalculation at drag end.
- **Drop marker moved out of flow (no selected-tab accent gap)**
- Replaced per-row in-flow divider placeholders with a single absolutely
positioned drop line in the scroll container.
- Drop line now aligns to actual tab boundaries (`offsetTop` /
`offsetHeight`) so it covers the divider location directly.
- **Drop target rendering simplified**
- Container is `relative`; marker is conditionally rendered only while
reordering.
- `dropLineTop` is tracked during drag events and used to position the
marker without affecting layout.
- **Stale hover state cleared after drop**
- Added a minimal drag-lifecycle reset mechanism (`hoverResetVersion`)
and used it in `VTab` keys.
- On drag end/drop, rows remount once, clearing browser-retained
`:hover` on the old index immediately.
```tsx
<VTab key={`${tab.id}:${hoverResetVersion}`} ... />
{dragTabId != null && dropIndex != null && dropLineTop != null && (
<div
className="pointer-events-none absolute left-0 right-0 border-t-2 border-accent/80"
style={{ top: dropLineTop, transform: "translateY(-1px)" }}
/>
)}
```
- **<screenshot>**
-
https://github.com/user-attachments/assets/8c25ef6f-c600-484e-a4fa-6ac83657b484
<!-- START COPILOT CODING AGENT TIPS -->
---
🔒 GitHub Advanced Security automatically protects Copilot coding agent
pull requests. You can protect all pull requests by enabling Advanced
Security for your repositories. [Learn more about Advanced
Security.](https://gh.io/cca-advanced-security)
---------
Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>
Co-authored-by: sawka <2722291+sawka@users.noreply.github.com>
|
||
|
|
b5d23e544e
|
v0.14.1 Release Notes and Onboarding (#2966) | ||
|
|
df24959e23
|
Add native 2+ arg RPC support and wire a concrete TestMultiArgCommand through server, generated clients, and CLI (#2963)
This PR extends WSH RPC command signatures to support `ctx + 2+ typed
args` while preserving existing `ctx` and `ctx + 1 arg` behavior. It
also adds a concrete `TestMultiArgCommand` end-to-end so the generated
Go/TS client surfaces can be inspected and exercised from CLI.
- **RPC wire + dispatch model**
- Added `wshrpc.MultiArg` (`args []any`) as the over-the-wire envelope
for 2+ arg commands.
- Extended RPC metadata to track all command arg types
(`CommandDataTypes`) and exposed a helper for normalized access.
- Updated server adapter unmarshalling to:
- decode `MultiArg` for 2+ arg commands,
- validate arg count,
- re-unmarshal each arg into its declared type before invoking typed
handlers.
- Kept single-arg commands on the existing non-`MultiArg` path.
- **Code generation (Go + TS)**
- Go codegen now emits multi-parameter wrappers for 2+ arg methods and
packs payload as `wshrpc.MultiArg`.
- TS codegen now emits multi-parameter API methods and packs payload as
`{ args: [...] }`.
- 0/1-arg generation remains unchanged to avoid wire/API churn.
- **Concrete command added for validation**
- Added to `WshRpcInterface`:
- `TestMultiArgCommand(ctx context.Context, arg1 string, arg2 int, arg3
bool) (string, error)`
- Implemented in `wshserver` with deterministic formatted return output
including source + all args.
- Updated `wsh test` command to call `TestMultiArgCommand` and print the
returned string.
- **Focused coverage**
- Added/updated targeted tests around RPC metadata and Go/TS multi-arg
codegen behavior, including command declaration for `testmultiarg`.
Example generated call shape:
```go
func TestMultiArgCommand(w *wshutil.WshRpc, arg1 string, arg2 int, arg3 bool, opts *wshrpc.RpcOpts) (string, error) {
return sendRpcRequestCallHelper[string](
w,
"testmultiarg",
wshrpc.MultiArg{Args: []any{arg1, arg2, arg3}},
opts,
)
}
```
<!-- START COPILOT CODING AGENT TIPS -->
---
💡 You can make Copilot smarter by setting up custom instructions,
customizing its development environment and configuring Model Context
Protocol (MCP) servers. Learn more [Copilot coding agent
tips](https://gh.io/copilot-coding-agent-tips) in the docs.
---------
Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>
Co-authored-by: sawka <2722291+sawka@users.noreply.github.com>
Co-authored-by: sawka <mike@commandline.dev>
|
||
|
|
9d89f4372c
|
Complete onboarding preview coverage for init/telemetry-star flow and align preview state wiring (#2965)
The onboarding preview was missing the first two pages in the
new-install flow (`InitPage` and `NoTelemetryStarPage`). This update
adds those views to the preview and aligns state access with the current
store pattern so they render correctly in preview mode.
- **Preview coverage**
- Added `InitPage` and `NoTelemetryStarPage` to
`frontend/preview/previews/onboarding.preview.tsx` so the full early
onboarding path is visible in the preview server.
- **Settings access modernization**
- Replaced full `settingsAtom` usage in `InitPage` with targeted
`useSettingsKeyAtom("telemetry:enabled")`.
- Removes broad settings dependency and uses the existing preview-safe
settings path.
- **Preview bootstrap state init**
- Added `ClientModel.getInstance().initialize(null)` in
`frontend/preview/preview.tsx` to ensure `clientAtom` is initialized in
preview runtime without backend client data.
```tsx
// onboarding.tsx
const telemetrySetting = useSettingsKeyAtom("telemetry:enabled");
const clientData = useAtomValue(ClientModel.getInstance().clientAtom);
const [telemetryEnabled, setTelemetryEnabled] = useState<boolean>(!!telemetrySetting);
// preview.tsx
setWaveWindowType("preview");
ClientModel.getInstance().initialize(null);
```
- **<screenshot>**
- 
<!-- START COPILOT CODING AGENT TIPS -->
---
🔒 GitHub Advanced Security automatically protects Copilot coding agent
pull requests. You can protect all pull requests by enabling Advanced
Security for your repositories. [Learn more about Advanced
Security.](https://gh.io/cca-advanced-security)
---------
Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>
Co-authored-by: sawka <2722291+sawka@users.noreply.github.com>
|
||
|
|
4ec09cb611
|
Centralize proxy HTTP client creation in aiutil and remove redundant backend tests (#2961)
`makeHTTPClient(proxyURL)` had been duplicated across AI backends with
equivalent behavior. This change consolidates the logic into a single
helper in `aiutil` and updates backends to consume it, then removes
backend-local tests that only re-verified that shared utility behavior.
- **Shared client construction**
- Added `aiutil.MakeHTTPClient(proxyURL string) (*http.Client, error)`
in `pkg/aiusechat/aiutil/aiutil.go`.
- Standardizes proxy parsing and `http.Transport.Proxy` setup in one
place.
- Keeps streaming-safe client semantics (`Timeout: 0`) and existing
invalid proxy URL error behavior.
- **Backend refactor**
- Removed duplicated client/proxy setup blocks from:
- `pkg/aiusechat/openaichat/openaichat-backend.go`
- `pkg/aiusechat/gemini/gemini-backend.go`
- `pkg/aiusechat/openai/openai-backend.go`
- `pkg/aiusechat/anthropic/anthropic-backend.go`
- Replaced with direct calls to the shared helper.
- **Test cleanup**
- Deleted backend tests that only covered basic proxy client creation
and no backend-specific behavior:
- `pkg/aiusechat/openaichat/openaichat-backend_test.go`
- `pkg/aiusechat/gemini/gemini-backend_test.go`
```go
httpClient, err := aiutil.MakeHTTPClient(chatOpts.Config.ProxyURL)
if err != nil {
return nil, nil, nil, err
}
resp, err := httpClient.Do(req)
```
<!-- START COPILOT CODING AGENT TIPS -->
---
💬 We'd love your input! Share your thoughts on Copilot coding agent in
our [2 minute survey](https://gh.io/copilot-coding-agent-survey).
---------
Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>
Co-authored-by: sawka <2722291+sawka@users.noreply.github.com>
|
||
|
|
95a97ca932
|
Add Onboarding Flows to Preview Server (#2960)
`FilesPage` was previously previewed through a special path because
`EditBashrcCommand` (Monaco via `CodeEditor`) threw in preview mode.
With preview/global handling now fixed, preview can run the real Files
onboarding flow end-to-end without command overrides.
- **Files preview now uses the real FilesPage path**
- `OnboardingPreview` renders `FilesPage` directly.
- Removed preview-only command injection/override behavior for Files
onboarding.
- **Reverted FilesPage customization**
- Dropped optional command renderer plumbing added for preview.
- Restored FilesPage to its original internal command rotation:
`EditBashrcCommand -> ViewShortcutsCommand -> ViewLogoCommand`.
- **Result**
- No Files-specific preview fork remains.
- Preview and production use the same FilesPage command lifecycle.
```tsx
const commands = [
(onComplete: () => void) => <EditBashrcCommand onComplete={onComplete} />,
(onComplete: () => void) => <ViewShortcutsCommand isMac={isMac} onComplete={onComplete} />,
(onComplete: () => void) => <ViewLogoCommand onComplete={onComplete} />,
];
```
<screenshot>

</screenshot>
<!-- START COPILOT CODING AGENT TIPS -->
---
✨ Let Copilot coding agent [set things up for
you](https://github.com/wavetermdev/waveterm/issues/new?title=✨+Set+up+Copilot+instructions&body=Configure%20instructions%20for%20this%20repository%20as%20documented%20in%20%5BBest%20practices%20for%20Copilot%20coding%20agent%20in%20your%20repository%5D%28https://gh.io/copilot-coding-agent-tips%29%2E%0A%0A%3COnboard%20this%20repo%3E&assignees=copilot)
— coding agent works faster and does higher quality work when set up for
your repo.
---------
Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>
Co-authored-by: sawka <2722291+sawka@users.noreply.github.com>
Co-authored-by: sawka <mike@commandline.dev>
|
||
|
|
cff84773a6
|
minor changes (#2962) | ||
|
|
e8d6ff5b05
|
chore: bump package version to 0.14.1-beta.0 | ||
|
|
9c3cf984e8
|
Make frontend CSS color validation Chromium-only (remove DOM style fallback) (#2946)
The new color validator is used exclusively in the Electron/Chromium
frontend, so fallback parsing via temporary DOM elements is unnecessary.
This update tightens the implementation to rely on the browser-native
CSS capability check only.
- **Scope**
- Keep `validateCssColor(color: string): string` behavior unchanged
(returns normalized type for valid colors, throws on invalid).
- Remove non-Chromium fallback logic from validation path.
- **Implementation**
- **`frontend/util/color-validator.ts`**
- `isValidCssColor` now exclusively uses:
- `CSS.supports("color", color)`
- Removed fallback using `document.createElement(...).style.color`
assignment/parsing.
- **Behavioral contract (unchanged)**
- Valid values still return specific type strings (`hex`, `hex8`, `rgb`,
`rgba`, `hsl`, `keyword`, etc.).
- Invalid values still throw `Error("Invalid CSS color: ...")`.
```ts
function isValidCssColor(color: string): boolean {
if (typeof CSS == "undefined" || typeof CSS.supports != "function") {
return false;
}
return CSS.supports("color", color);
}
```
<!-- START COPILOT CODING AGENT TIPS -->
---
✨ Let Copilot coding agent [set things up for
you](https://github.com/wavetermdev/waveterm/issues/new?title=✨+Set+up+Copilot+instructions&body=Configure%20instructions%20for%20this%20repository%20as%20documented%20in%20%5BBest%20practices%20for%20Copilot%20coding%20agent%20in%20your%20repository%5D%28https://gh.io/copilot-coding-agent-tips%29%2E%0A%0A%3COnboard%20this%20repo%3E&assignees=copilot)
— coding agent works faster and does higher quality work when set up for
your repo.
---------
Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>
Co-authored-by: sawka <2722291+sawka@users.noreply.github.com>
Co-authored-by: sawka <mike@commandline.dev>
|
||
|
|
b1d11f72c4
|
add noprofile/noninteractive to all powershell commands (#2959) | ||
|
|
350242d7b3
|
Bump rollup from 4.50.1 to 4.59.0 (#2958)
Bumps [rollup](https://github.com/rollup/rollup) from 4.50.1 to 4.59.0. <details> <summary>Release notes</summary> <p><em>Sourced from <a href="https://github.com/rollup/rollup/releases">rollup's releases</a>.</em></p> <blockquote> <h2>v4.59.0</h2> <h2>4.59.0</h2> <p><em>2026-02-22</em></p> <h3>Features</h3> <ul> <li>Throw when the generated bundle contains paths that would leave the output directory (<a href="https://redirect.github.com/rollup/rollup/issues/6276">#6276</a>)</li> </ul> <h3>Pull Requests</h3> <ul> <li><a href="https://redirect.github.com/rollup/rollup/pull/6275">#6275</a>: Validate bundle stays within output dir (<a href="https://github.com/lukastaegert"><code>@lukastaegert</code></a>)</li> </ul> <h2>v4.58.0</h2> <h2>4.58.0</h2> <p><em>2026-02-20</em></p> <h3>Features</h3> <ul> <li>Also support <code>__NO_SIDE_EFFECTS__</code> annotation before variable declarations declaring function expressions (<a href="https://redirect.github.com/rollup/rollup/issues/6272">#6272</a>)</li> </ul> <h3>Pull Requests</h3> <ul> <li><a href="https://redirect.github.com/rollup/rollup/pull/6256">#6256</a>: docs: document PreRenderedChunk properties including isDynamicEntry and isImplicitEntry (<a href="https://github.com/njg7194"><code>@njg7194</code></a>, <a href="https://github.com/lukastaegert"><code>@lukastaegert</code></a>)</li> <li><a href="https://redirect.github.com/rollup/rollup/pull/6259">#6259</a>: docs: Correct typo and improve sentence structure in docs for <code>output.experimentalMinChunkSize</code> (<a href="https://github.com/millerick"><code>@millerick</code></a>, <a href="https://github.com/lukastaegert"><code>@lukastaegert</code></a>)</li> <li><a href="https://redirect.github.com/rollup/rollup/pull/6260">#6260</a>: fix(deps): update rust crate swc_compiler_base to v47 (<a href="https://github.com/renovate"><code>@renovate</code></a>[bot], <a href="https://github.com/lukastaegert"><code>@lukastaegert</code></a>)</li> <li><a href="https://redirect.github.com/rollup/rollup/pull/6261">#6261</a>: fix(deps): lock file maintenance minor/patch updates (<a href="https://github.com/renovate"><code>@renovate</code></a>[bot], <a href="https://github.com/lukastaegert"><code>@lukastaegert</code></a>)</li> <li><a href="https://redirect.github.com/rollup/rollup/pull/6262">#6262</a>: Avoid unnecessary cloning of the code string (<a href="https://github.com/lukastaegert"><code>@lukastaegert</code></a>)</li> <li><a href="https://redirect.github.com/rollup/rollup/pull/6263">#6263</a>: fix(deps): update minor/patch updates (<a href="https://github.com/renovate"><code>@renovate</code></a>[bot], <a href="https://github.com/lukastaegert"><code>@lukastaegert</code></a>)</li> <li><a href="https://redirect.github.com/rollup/rollup/pull/6265">#6265</a>: chore(deps): lock file maintenance (<a href="https://github.com/renovate"><code>@renovate</code></a>[bot])</li> <li><a href="https://redirect.github.com/rollup/rollup/pull/6267">#6267</a>: fix(deps): update minor/patch updates (<a href="https://github.com/renovate"><code>@renovate</code></a>[bot])</li> <li><a href="https://redirect.github.com/rollup/rollup/pull/6268">#6268</a>: chore(deps): update dependency eslint-plugin-unicorn to v63 (<a href="https://github.com/renovate"><code>@renovate</code></a>[bot], <a href="https://github.com/lukastaegert"><code>@lukastaegert</code></a>)</li> <li><a href="https://redirect.github.com/rollup/rollup/pull/6269">#6269</a>: chore(deps): update dependency lru-cache to v11 (<a href="https://github.com/renovate"><code>@renovate</code></a>[bot])</li> <li><a href="https://redirect.github.com/rollup/rollup/pull/6270">#6270</a>: chore(deps): lock file maintenance (<a href="https://github.com/renovate"><code>@renovate</code></a>[bot])</li> <li><a href="https://redirect.github.com/rollup/rollup/pull/6272">#6272</a>: forward NO_SIDE_EFFECTS annotations to function expressions in variable declarations (<a href="https://github.com/lukastaegert"><code>@lukastaegert</code></a>)</li> </ul> <h2>v4.57.1</h2> <h2>4.57.1</h2> <p><em>2026-01-30</em></p> <h3>Bug Fixes</h3> <ul> <li>Fix heap corruption issue in Windows (<a href="https://redirect.github.com/rollup/rollup/issues/6251">#6251</a>)</li> <li>Ensure exports of a dynamic import are fully included when called from a try...catch (<a href="https://redirect.github.com/rollup/rollup/issues/6254">#6254</a>)</li> </ul> <h3>Pull Requests</h3> <ul> <li><a href="https://redirect.github.com/rollup/rollup/pull/6251">#6251</a>: fix: Isolate and cache <code>process.report.getReport()</code> calls in a child process for robust environment detection (<a href="https://github.com/alan-agius4"><code>@alan-agius4</code></a>, <a href="https://github.com/lukastaegert"><code>@lukastaegert</code></a>)</li> </ul> <!-- raw HTML omitted --> </blockquote> <p>... (truncated)</p> </details> <details> <summary>Changelog</summary> <p><em>Sourced from <a href="https://github.com/rollup/rollup/blob/master/CHANGELOG.md">rollup's changelog</a>.</em></p> <blockquote> <h2>4.59.0</h2> <p><em>2026-02-22</em></p> <h3>Features</h3> <ul> <li>Throw when the generated bundle contains paths that would leave the output directory (<a href="https://redirect.github.com/rollup/rollup/issues/6276">#6276</a>)</li> </ul> <h3>Pull Requests</h3> <ul> <li><a href="https://redirect.github.com/rollup/rollup/pull/6275">#6275</a>: Validate bundle stays within output dir (<a href="https://github.com/lukastaegert"><code>@lukastaegert</code></a>)</li> </ul> <h2>4.58.0</h2> <p><em>2026-02-20</em></p> <h3>Features</h3> <ul> <li>Also support <code>__NO_SIDE_EFFECTS__</code> annotation before variable declarations declaring function expressions (<a href="https://redirect.github.com/rollup/rollup/issues/6272">#6272</a>)</li> </ul> <h3>Pull Requests</h3> <ul> <li><a href="https://redirect.github.com/rollup/rollup/pull/6256">#6256</a>: docs: document PreRenderedChunk properties including isDynamicEntry and isImplicitEntry (<a href="https://github.com/njg7194"><code>@njg7194</code></a>, <a href="https://github.com/lukastaegert"><code>@lukastaegert</code></a>)</li> <li><a href="https://redirect.github.com/rollup/rollup/pull/6259">#6259</a>: docs: Correct typo and improve sentence structure in docs for <code>output.experimentalMinChunkSize</code> (<a href="https://github.com/millerick"><code>@millerick</code></a>, <a href="https://github.com/lukastaegert"><code>@lukastaegert</code></a>)</li> <li><a href="https://redirect.github.com/rollup/rollup/pull/6260">#6260</a>: fix(deps): update rust crate swc_compiler_base to v47 (<a href="https://github.com/renovate"><code>@renovate</code></a>[bot], <a href="https://github.com/lukastaegert"><code>@lukastaegert</code></a>)</li> <li><a href="https://redirect.github.com/rollup/rollup/pull/6261">#6261</a>: fix(deps): lock file maintenance minor/patch updates (<a href="https://github.com/renovate"><code>@renovate</code></a>[bot], <a href="https://github.com/lukastaegert"><code>@lukastaegert</code></a>)</li> <li><a href="https://redirect.github.com/rollup/rollup/pull/6262">#6262</a>: Avoid unnecessary cloning of the code string (<a href="https://github.com/lukastaegert"><code>@lukastaegert</code></a>)</li> <li><a href="https://redirect.github.com/rollup/rollup/pull/6263">#6263</a>: fix(deps): update minor/patch updates (<a href="https://github.com/renovate"><code>@renovate</code></a>[bot], <a href="https://github.com/lukastaegert"><code>@lukastaegert</code></a>)</li> <li><a href="https://redirect.github.com/rollup/rollup/pull/6265">#6265</a>: chore(deps): lock file maintenance (<a href="https://github.com/renovate"><code>@renovate</code></a>[bot])</li> <li><a href="https://redirect.github.com/rollup/rollup/pull/6267">#6267</a>: fix(deps): update minor/patch updates (<a href="https://github.com/renovate"><code>@renovate</code></a>[bot])</li> <li><a href="https://redirect.github.com/rollup/rollup/pull/6268">#6268</a>: chore(deps): update dependency eslint-plugin-unicorn to v63 (<a href="https://github.com/renovate"><code>@renovate</code></a>[bot], <a href="https://github.com/lukastaegert"><code>@lukastaegert</code></a>)</li> <li><a href="https://redirect.github.com/rollup/rollup/pull/6269">#6269</a>: chore(deps): update dependency lru-cache to v11 (<a href="https://github.com/renovate"><code>@renovate</code></a>[bot])</li> <li><a href="https://redirect.github.com/rollup/rollup/pull/6270">#6270</a>: chore(deps): lock file maintenance (<a href="https://github.com/renovate"><code>@renovate</code></a>[bot])</li> <li><a href="https://redirect.github.com/rollup/rollup/pull/6272">#6272</a>: forward NO_SIDE_EFFECTS annotations to function expressions in variable declarations (<a href="https://github.com/lukastaegert"><code>@lukastaegert</code></a>)</li> </ul> <h2>4.57.1</h2> <p><em>2026-01-30</em></p> <h3>Bug Fixes</h3> <ul> <li>Fix heap corruption issue in Windows (<a href="https://redirect.github.com/rollup/rollup/issues/6251">#6251</a>)</li> <li>Ensure exports of a dynamic import are fully included when called from a try...catch (<a href="https://redirect.github.com/rollup/rollup/issues/6254">#6254</a>)</li> </ul> <h3>Pull Requests</h3> <ul> <li><a href="https://redirect.github.com/rollup/rollup/pull/6251">#6251</a>: fix: Isolate and cache <code>process.report.getReport()</code> calls in a child process for robust environment detection (<a href="https://github.com/alan-agius4"><code>@alan-agius4</code></a>, <a href="https://github.com/lukastaegert"><code>@lukastaegert</code></a>)</li> <li><a href="https://redirect.github.com/rollup/rollup/pull/6252">#6252</a>: chore(deps): update dependency lru-cache to v11 (<a href="https://github.com/renovate"><code>@renovate</code></a>[bot])</li> <li><a href="https://redirect.github.com/rollup/rollup/pull/6253">#6253</a>: chore(deps): lock file maintenance minor/patch updates (<a href="https://github.com/renovate"><code>@renovate</code></a>[bot], <a href="https://github.com/lukastaegert"><code>@lukastaegert</code></a>)</li> <li><a href="https://redirect.github.com/rollup/rollup/pull/6254">#6254</a>: Fully include dynamic imports in a try-catch (<a href="https://github.com/lukastaegert"><code>@lukastaegert</code></a>)</li> </ul> <!-- raw HTML omitted --> </blockquote> <p>... (truncated)</p> </details> <details> <summary>Commits</summary> <ul> <li><a href=" |
||
|
|
4956c92c55
|
Make Wave home config writes atomic and serialized to avoid watcher partial reads (#2945)
`WriteWaveHomeConfigFile()` previously used direct `os.WriteFile`, which
can expose truncation/partial-write states to the JSON file watcher.
This change switches config persistence to temp-file + rename semantics
and serializes writes through a single process-wide lock for config file
writes.
- **Atomic file write helper**
- Added `AtomicWriteFile()` in `pkg/util/fileutil/fileutil.go`.
- Writes to `<filename>.tmp` in the same directory, then renames to the
target path.
- Performs temp-file cleanup on error paths.
- Introduced a shared suffix constant (`TempFileSuffix`) used by
implementation/tests.
- **Config write path update**
- Updated `WriteWaveHomeConfigFile()` in `pkg/wconfig/settingsconfig.go`
to:
- Use a package-level mutex (`configWriteLock`) so only one config write
runs at a time (across all config files).
- Call `fileutil.AtomicWriteFile(...)` instead of direct
`os.WriteFile(...)`.
- **Focused coverage for atomic behavior**
- Added `pkg/util/fileutil/fileutil_test.go` with tests for:
- Successful atomic write (target file contains expected payload and no
leftover `.tmp` file).
- Rename-failure path cleanup (temp file is removed).
```go
func WriteWaveHomeConfigFile(fileName string, m waveobj.MetaMapType) error {
configWriteLock.Lock()
defer configWriteLock.Unlock()
fullFileName := filepath.Join(wavebase.GetWaveConfigDir(), fileName)
barr, err := jsonMarshalConfigInOrder(m)
if err != nil {
return err
}
return fileutil.AtomicWriteFile(fullFileName, barr, 0644)
}
```
<!-- START COPILOT CODING AGENT TIPS -->
---
🔒 GitHub Advanced Security automatically protects Copilot coding agent
pull requests. You can protect all pull requests by enabling Advanced
Security for your repositories. [Learn more about Advanced
Security.](https://gh.io/cca-advanced-security)
---------
Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>
Co-authored-by: sawka <2722291+sawka@users.noreply.github.com>
|
||
|
|
e8ebe88651
|
Fix for Claude Code Scroll to Top Bug (#2956)
There may be more cases here that I don't know about, but this fixes a good chunk of them. This catches the CC "repaint" transaction and forces a scrollToBottom. That should handle context repaints and resize repaints. Also adds a new (hidden) terminal escape sequence debugger, and (in dev mode) adds a last 50 writes cache that can be used to look at and debug output. |
||
|
|
1ab58ea98a
|
Fix bugs with connection switching (#2957)
* Add per blockId mutex to block controller resync * Pass initial termsize through to startJob |
||
|
|
27f77f23d6
|
Bump the dev-dependencies-minor group with 4 updates (#2953)
Bumps the dev-dependencies-minor group with 4 updates: [@tailwindcss/vite](https://github.com/tailwindlabs/tailwindcss/tree/HEAD/packages/@tailwindcss-vite), [tailwindcss](https://github.com/tailwindlabs/tailwindcss/tree/HEAD/packages/tailwindcss), [eslint-plugin-mdx](https://github.com/mdx-js/eslint-mdx) and [@tailwindcss/cli](https://github.com/tailwindlabs/tailwindcss/tree/HEAD/packages/@tailwindcss-cli). Updates `@tailwindcss/vite` from 4.1.18 to 4.2.1 <details> <summary>Release notes</summary> <p><em>Sourced from <a href="https://github.com/tailwindlabs/tailwindcss/releases"><code>@tailwindcss/vite</code>'s releases</a>.</em></p> <blockquote> <h2>v4.2.1</h2> <h3>Fixed</h3> <ul> <li>Allow trailing dash in functional utility names for backwards compatibility (<a href="https://redirect.github.com/tailwindlabs/tailwindcss/pull/19696">#19696</a>)</li> <li>Properly detect classes containing <code>.</code> characters within curly braces in MDX files (<a href="https://redirect.github.com/tailwindlabs/tailwindcss/pull/19711">#19711</a>)</li> </ul> <h2>v4.2.0</h2> <h3>Added</h3> <ul> <li>Add mauve, olive, mist, and taupe color palettes to the default theme (<a href="https://redirect.github.com/tailwindlabs/tailwindcss/pull/19627">#19627</a>)</li> <li>Add <code>@tailwindcss/webpack</code> package to run Tailwind CSS as a webpack plugin (<a href="https://redirect.github.com/tailwindlabs/tailwindcss/pull/19610">#19610</a>)</li> <li>Add <code>pbs-*</code> and <code>pbe-*</code> utilities for <code>padding-block-start</code> and <code>padding-block-end</code> (<a href="https://redirect.github.com/tailwindlabs/tailwindcss/pull/19601">#19601</a>)</li> <li>Add <code>mbs-*</code> and <code>mbe-*</code> utilities for <code>margin-block-start</code> and <code>margin-block-end</code> (<a href="https://redirect.github.com/tailwindlabs/tailwindcss/pull/19601">#19601</a>)</li> <li>Add <code>scroll-pbs-*</code> and <code>scroll-pbe-*</code> utilities for <code>scroll-padding-block-start</code> and <code>scroll-padding-block-end</code> (<a href="https://redirect.github.com/tailwindlabs/tailwindcss/pull/19601">#19601</a>)</li> <li>Add <code>scroll-mbs-*</code> and <code>scroll-mbe-*</code> utilities for <code>scroll-margin-block-start</code> and <code>scroll-margin-block-end</code> (<a href="https://redirect.github.com/tailwindlabs/tailwindcss/pull/19601">#19601</a>)</li> <li>Add <code>border-bs-*</code> and <code>border-be-*</code> utilities for <code>border-block-start</code> and <code>border-block-end</code> (<a href="https://redirect.github.com/tailwindlabs/tailwindcss/pull/19601">#19601</a>)</li> <li>Add <code>inline-*</code>, <code>min-inline-*</code>, <code>max-inline-*</code> utilities for <code>inline-size</code>, <code>min-inline-size</code>, and <code>max-inline-size</code> (<a href="https://redirect.github.com/tailwindlabs/tailwindcss/pull/19612">#19612</a>)</li> <li>Add <code>block-*</code>, <code>min-block-*</code>, <code>max-block-*</code> utilities for <code>block-size</code>, <code>min-block-size</code>, and <code>max-block-size</code> (<a href="https://redirect.github.com/tailwindlabs/tailwindcss/pull/19612">#19612</a>)</li> <li>Add <code>inset-s-*</code>, <code>inset-e-*</code>, <code>inset-bs-*</code>, <code>inset-be-*</code> utilities for <code>inset-inline-start</code>, <code>inset-inline-end</code>, <code>inset-block-start</code>, and <code>inset-block-end</code> (<a href="https://redirect.github.com/tailwindlabs/tailwindcss/pull/19613">#19613</a>)</li> <li>Add <code>font-features-*</code> utility for <code>font-feature-settings</code> (<a href="https://redirect.github.com/tailwindlabs/tailwindcss/pull/19623">#19623</a>)</li> </ul> <h3>Fixed</h3> <ul> <li>Prevent double <code>@supports</code> wrapper for <code>color-mix</code> values (<a href="https://redirect.github.com/tailwindlabs/tailwindcss/pull/19450">#19450</a>)</li> <li>Allow whitespace around <code>@source inline()</code> argument (<a href="https://redirect.github.com/tailwindlabs/tailwindcss/pull/19461">#19461</a>)</li> <li>Emit comment when source maps are saved to files when using <code>@tailwindcss/cli</code> (<a href="https://redirect.github.com/tailwindlabs/tailwindcss/pull/19447">#19447</a>)</li> <li>Detect utilities containing capital letters followed by numbers (<a href="https://redirect.github.com/tailwindlabs/tailwindcss/pull/19465">#19465</a>)</li> <li>Fix class extraction for Rails' strict locals (<a href="https://redirect.github.com/tailwindlabs/tailwindcss/pull/19525">#19525</a>)</li> <li>Align <code>@utility</code> name validation with Oxide scanner rules (<a href="https://redirect.github.com/tailwindlabs/tailwindcss/pull/19524">#19524</a>)</li> <li>Fix infinite loop when using <code>@variant</code> inside <code>@custom-variant</code> (<a href="https://redirect.github.com/tailwindlabs/tailwindcss/pull/19633">#19633</a>)</li> <li>Allow multiples of <code>.25</code> in <code>aspect-*</code> fractions (e.g. <code>aspect-8.5/11</code>) (<a href="https://redirect.github.com/tailwindlabs/tailwindcss/pull/19688">#19688</a>)</li> <li>Ensure changes to external files listed via <code>@source</code> trigger a full page reload when using <code>@tailwindcss/vite</code> (<a href="https://redirect.github.com/tailwindlabs/tailwindcss/pull/19670">#19670</a>)</li> <li>Improve performance of Oxide scanner in bigger projects by reducing file system walks (<a href="https://redirect.github.com/tailwindlabs/tailwindcss/pull/19632">#19632</a>)</li> <li>Ensure import aliases in Astro v5 work without crashing when using <code>@tailwindcss/vite</code> (<a href="https://redirect.github.com/tailwindlabs/tailwindcss/issues/19677">#19677</a>)</li> <li>Allow escape characters in <code>@utility</code> names to improve support with formatters such as Biome (<a href="https://redirect.github.com/tailwindlabs/tailwindcss/pull/19626">#19626</a>)</li> <li>Fix incorrect canonicalization results when canonicalizing multiple times (<a href="https://redirect.github.com/tailwindlabs/tailwindcss/pull/19675">#19675</a>)</li> <li>Add <code>.jj</code> to default ignored content directories (<a href="https://redirect.github.com/tailwindlabs/tailwindcss/pull/19687">#19687</a>)</li> </ul> <h3>Deprecated</h3> <ul> <li>Deprecate <code>start-*</code> and <code>end-*</code> utilities in favor of <code>inset-s-*</code> and <code>inset-e-*</code> utilities (<a href="https://redirect.github.com/tailwindlabs/tailwindcss/pull/19613">#19613</a>)</li> </ul> </blockquote> </details> <details> <summary>Changelog</summary> <p><em>Sourced from <a href="https://github.com/tailwindlabs/tailwindcss/blob/main/CHANGELOG.md"><code>@tailwindcss/vite</code>'s changelog</a>.</em></p> <blockquote> <h2>[4.2.1] - 2026-02-23</h2> <h3>Fixed</h3> <ul> <li>Allow trailing dash in functional utility names for backwards compatibility (<a href="https://redirect.github.com/tailwindlabs/tailwindcss/pull/19696">#19696</a>)</li> <li>Properly detect classes containing <code>.</code> characters within curly braces in MDX files (<a href="https://redirect.github.com/tailwindlabs/tailwindcss/pull/19711">#19711</a>)</li> </ul> <h2>[4.2.0] - 2026-02-18</h2> <h3>Added</h3> <ul> <li>Add mauve, olive, mist, and taupe color palettes to the default theme (<a href="https://redirect.github.com/tailwindlabs/tailwindcss/pull/19627">#19627</a>)</li> <li>Add <code>@tailwindcss/webpack</code> package to run Tailwind CSS as a webpack plugin (<a href="https://redirect.github.com/tailwindlabs/tailwindcss/pull/19610">#19610</a>)</li> <li>Add <code>pbs-*</code> and <code>pbe-*</code> utilities for <code>padding-block-start</code> and <code>padding-block-end</code> (<a href="https://redirect.github.com/tailwindlabs/tailwindcss/pull/19601">#19601</a>)</li> <li>Add <code>mbs-*</code> and <code>mbe-*</code> utilities for <code>margin-block-start</code> and <code>margin-block-end</code> (<a href="https://redirect.github.com/tailwindlabs/tailwindcss/pull/19601">#19601</a>)</li> <li>Add <code>scroll-pbs-*</code> and <code>scroll-pbe-*</code> utilities for <code>scroll-padding-block-start</code> and <code>scroll-padding-block-end</code> (<a href="https://redirect.github.com/tailwindlabs/tailwindcss/pull/19601">#19601</a>)</li> <li>Add <code>scroll-mbs-*</code> and <code>scroll-mbe-*</code> utilities for <code>scroll-margin-block-start</code> and <code>scroll-margin-block-end</code> (<a href="https://redirect.github.com/tailwindlabs/tailwindcss/pull/19601">#19601</a>)</li> <li>Add <code>border-bs-*</code> and <code>border-be-*</code> utilities for <code>border-block-start</code> and <code>border-block-end</code> (<a href="https://redirect.github.com/tailwindlabs/tailwindcss/pull/19601">#19601</a>)</li> <li>Add <code>inline-*</code>, <code>min-inline-*</code>, <code>max-inline-*</code> utilities for <code>inline-size</code>, <code>min-inline-size</code>, and <code>max-inline-size</code> (<a href="https://redirect.github.com/tailwindlabs/tailwindcss/pull/19612">#19612</a>)</li> <li>Add <code>block-*</code>, <code>min-block-*</code>, <code>max-block-*</code> utilities for <code>block-size</code>, <code>min-block-size</code>, and <code>max-block-size</code> (<a href="https://redirect.github.com/tailwindlabs/tailwindcss/pull/19612">#19612</a>)</li> <li>Add <code>inset-s-*</code>, <code>inset-e-*</code>, <code>inset-bs-*</code>, <code>inset-be-*</code> utilities for <code>inset-inline-start</code>, <code>inset-inline-end</code>, <code>inset-block-start</code>, and <code>inset-block-end</code> (<a href="https://redirect.github.com/tailwindlabs/tailwindcss/pull/19613">#19613</a>)</li> <li>Add <code>font-features-*</code> utility for <code>font-feature-settings</code> (<a href="https://redirect.github.com/tailwindlabs/tailwindcss/pull/19623">#19623</a>)</li> </ul> <h3>Fixed</h3> <ul> <li>Prevent double <code>@supports</code> wrapper for <code>color-mix</code> values (<a href="https://redirect.github.com/tailwindlabs/tailwindcss/pull/19450">#19450</a>)</li> <li>Allow whitespace around <code>@source inline()</code> argument (<a href="https://redirect.github.com/tailwindlabs/tailwindcss/pull/19461">#19461</a>)</li> <li>Emit comment when source maps are saved to files when using <code>@tailwindcss/cli</code> (<a href="https://redirect.github.com/tailwindlabs/tailwindcss/pull/19447">#19447</a>)</li> <li>Detect utilities containing capital letters followed by numbers (<a href="https://redirect.github.com/tailwindlabs/tailwindcss/pull/19465">#19465</a>)</li> <li>Fix class extraction for Rails' strict locals (<a href="https://redirect.github.com/tailwindlabs/tailwindcss/pull/19525">#19525</a>)</li> <li>Align <code>@utility</code> name validation with Oxide scanner rules (<a href="https://redirect.github.com/tailwindlabs/tailwindcss/pull/19524">#19524</a>)</li> <li>Fix infinite loop when using <code>@variant</code> inside <code>@custom-variant</code> (<a href="https://redirect.github.com/tailwindlabs/tailwindcss/pull/19633">#19633</a>)</li> <li>Allow multiples of <code>.25</code> in <code>aspect-*</code> fractions (e.g. <code>aspect-8.5/11</code>) (<a href="https://redirect.github.com/tailwindlabs/tailwindcss/pull/19688">#19688</a>)</li> <li>Ensure changes to external files listed via <code>@source</code> trigger a full page reload when using <code>@tailwindcss/vite</code> (<a href="https://redirect.github.com/tailwindlabs/tailwindcss/pull/19670">#19670</a>)</li> <li>Improve performance of Oxide scanner in bigger projects by reducing file system walks (<a href="https://redirect.github.com/tailwindlabs/tailwindcss/pull/19632">#19632</a>)</li> <li>Ensure import aliases in Astro v5 work without crashing when using <code>@tailwindcss/vite</code> (<a href="https://redirect.github.com/tailwindlabs/tailwindcss/issues/19677">#19677</a>)</li> <li>Allow escape characters in <code>@utility</code> names to improve support with formatters such as Biome (<a href="https://redirect.github.com/tailwindlabs/tailwindcss/pull/19626">#19626</a>)</li> <li>Fix incorrect canonicalization results when canonicalizing multiple times (<a href="https://redirect.github.com/tailwindlabs/tailwindcss/pull/19675">#19675</a>)</li> <li>Add <code>.jj</code> to default ignored content directories (<a href="https://redirect.github.com/tailwindlabs/tailwindcss/pull/19687">#19687</a>)</li> </ul> <h3>Deprecated</h3> <ul> <li>Deprecate <code>start-*</code> and <code>end-*</code> utilities in favor of <code>inset-s-*</code> and <code>inset-e-*</code> utilities (<a href="https://redirect.github.com/tailwindlabs/tailwindcss/pull/19613">#19613</a>)</li> </ul> </blockquote> </details> <details> <summary>Commits</summary> <ul> <li><a href=" |
||
|
|
237dfa71c7
|
Bump google.golang.org/api from 0.267.0 to 0.269.0 (#2951)
Bumps [google.golang.org/api](https://github.com/googleapis/google-api-go-client) from 0.267.0 to 0.269.0. <details> <summary>Release notes</summary> <p><em>Sourced from <a href="https://github.com/googleapis/google-api-go-client/releases">google.golang.org/api's releases</a>.</em></p> <blockquote> <h2>v0.269.0</h2> <h2><a href="https://github.com/googleapis/google-api-go-client/compare/v0.268.0...v0.269.0">0.269.0</a> (2026-02-24)</h2> <h3>Features</h3> <ul> <li><strong>all:</strong> Auto-regenerate discovery clients (<a href="https://redirect.github.com/googleapis/google-api-go-client/issues/3512">#3512</a>) (<a href=" |
||
|
|
aa7befb5f1
|
Bump electron-builder from 26.8.0 to 26.8.1 in the electron-patch group (#2954)
Bumps the electron-patch group with 1 update: [electron-builder](https://github.com/electron-userland/electron-builder/tree/HEAD/packages/electron-builder). Updates `electron-builder` from 26.8.0 to 26.8.1 <details> <summary>Release notes</summary> <p><em>Sourced from <a href="https://github.com/electron-userland/electron-builder/releases">electron-builder's releases</a>.</em></p> <blockquote> <h2>electron-builder@26.8.1</h2> <h2>What's Changed</h2> <ul> <li>fix: always use package key when reading from dependency list instead of package <code>name</code> by <a href="https://github.com/mmaietta"><code>@mmaietta</code></a> in <a href="https://redirect.github.com/electron-userland/electron-builder/pull/9583">electron-userland/electron-builder#9583</a></li> <li>chore: add logging summary to end of node collector to flag any special cases/alerts by <a href="https://github.com/mmaietta"><code>@mmaietta</code></a> in <a href="https://redirect.github.com/electron-userland/electron-builder/pull/9587">electron-userland/electron-builder#9587</a></li> <li>chore: adding tolerance threshold (within 10 bytes) to vitest snapshots to adjust for package manager instabilities by <a href="https://github.com/mmaietta"><code>@mmaietta</code></a> in <a href="https://redirect.github.com/electron-userland/electron-builder/pull/9591">electron-userland/electron-builder#9591</a></li> <li>chore: update node_modules snapshots due to transitive fixture dependency changed by <a href="https://github.com/mmaietta"><code>@mmaietta</code></a> in <a href="https://redirect.github.com/electron-userland/electron-builder/pull/9592">electron-userland/electron-builder#9592</a></li> <li>fix(appimage): fix mime type directory in AppDir by <a href="https://github.com/sabonerune"><code>@sabonerune</code></a> in <a href="https://redirect.github.com/electron-userland/electron-builder/pull/9589">electron-userland/electron-builder#9589</a></li> <li>chore(deploy): Release (next) by <a href="https://github.com/electron-builder-release-bot"><code>@electron-builder-release-bot</code></a>[bot] in <a href="https://redirect.github.com/electron-userland/electron-builder/pull/9585">electron-userland/electron-builder#9585</a></li> </ul> <p><strong>Full Changelog</strong>: <a href="https://github.com/electron-userland/electron-builder/compare/electron-builder@26.8.0...electron-builder@26.8.1">https://github.com/electron-userland/electron-builder/compare/electron-builder@26.8.0...electron-builder@26.8.1</a></p> </blockquote> </details> <details> <summary>Changelog</summary> <p><em>Sourced from <a href="https://github.com/electron-userland/electron-builder/blob/master/packages/electron-builder/CHANGELOG.md">electron-builder's changelog</a>.</em></p> <blockquote> <h2>26.8.1</h2> <h3>Patch Changes</h3> <!-- raw HTML omitted --> <!-- raw HTML omitted --> <p><a href=" |
||
|
|
b2f3129aa0
|
Add wsh debugterm (#2947)
`wsh debugterm` currently decodes terminal bytes sourced from backend
block files. This extends it with a stdin-driven path so FE-emitted
payloads like `["...", "..."]` can be decoded directly without requiring
block lookup/RPC in that mode.
- **CLI surface**
- Added new mode: `--mode stdin`
- Updated mode help text to: `hex`, `decode`, `stdin`
- Centralized mode validation via `getDebugTermMode()`
- **Execution path split**
- Added mode-aware pre-run (`debugTermPreRun`):
- `stdin` mode: skips RPC setup
- `hex`/`decode`: keeps existing RPC setup behavior
- `stdin` mode now:
- reads all stdin
- parses JSON as `[]string`
- concatenates entries and runs existing decode formatter
- **Parsing support**
- Added `parseDebugTermStdinData([]byte) ([]byte, error)`
- Error messaging explicitly requires a JSON array of strings
- **Tests**
- Added focused coverage for:
- valid stdin JSON array parsing + decoded output
- invalid stdin JSON input
```go
stdinData, _ := io.ReadAll(WrappedStdin)
termData, err := parseDebugTermStdinData(stdinData) // expects []string JSON
if err != nil { return err }
WriteStdout("%s", formatDebugTermDecode(termData))
```
<!-- START COPILOT CODING AGENT TIPS -->
---
✨ Let Copilot coding agent [set things up for
you](https://github.com/wavetermdev/waveterm/issues/new?title=✨+Set+up+Copilot+instructions&body=Configure%20instructions%20for%20this%20repository%20as%20documented%20in%20%5BBest%20practices%20for%20Copilot%20coding%20agent%20in%20your%20repository%5D%28https://gh.io/copilot-coding-agent-tips%29%2E%0A%0A%3COnboard%20this%20repo%3E&assignees=copilot)
— coding agent works faster and does higher quality work when set up for
your repo.
---------
Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>
Co-authored-by: sawka <2722291+sawka@users.noreply.github.com>
Co-authored-by: sawka <mike@commandline.dev>
|
||
|
|
c5afeb8747
|
simplify scrollbar code in terminal, simplify fit code (#2944) | ||
|
|
f1e06c7ef9
|
Add groq AI mode provider defaults and docs (#2942)
This change adds first-class `groq` provider support to Wave AI mode
resolution and documents it in the Wave AI modes guide. Users can now
configure Groq modes via `ai:provider` with provider defaults applied
automatically.
- **Provider support in backend config resolution**
- Added `groq` as a recognized AI provider constant.
- Added Groq provider defaults in mode resolution:
- `ai:apitype`: `openai-chat`
- `ai:endpoint`: `https://api.groq.com/openai/v1/chat/completions`
- `ai:apitokensecretname`: `GROQ_KEY`
- **Schema/config surface update**
- Extended `AIModeConfigType` provider enum to include `groq`, so
`ai:provider: "groq"` is valid in Wave AI config.
- **Documentation updates (`waveai-modes.mdx`)**
- Added `groq` to supported providers.
- Added a Groq-specific configuration example and default behavior
notes.
- Updated provider reference and capability guidance to include Groq.
- **Focused coverage**
- Added a targeted unit test for Groq provider default application in
`applyProviderDefaults`.
```json
{
"groq-kimi-k2": {
"display:name": "Groq - Kimi K2",
"ai:provider": "groq",
"ai:model": "moonshotai/kimi-k2-instruct"
}
}
```
<!-- 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>
|
||
|
|
46ab0ad1c8
|
docs: add Korean README translation (#2943)
## Summary - Add `README.ko.md` as a Korean translation of the root README. - Add a centered language switcher block to `README.md` and `README.ko.md`. - Keep the change small and docs-only (no code/runtime behavior changes). ## Motivation I am a Korean developer and a frequent Wave Terminal user. I read the README often, and noticed there was no Korean README available, so I prepared this translation to improve accessibility for Korean users. ## Ongoing Contribution Intent As an active Wave Terminal user, I can continue contributing incremental Korean localization updates after this PR is reviewed. ## Scope Notes - One logical change in a single PR. - Focused only on documentation, aligned with the contribution guide for small, obvious docs improvements. |
||
|
|
cfbdc2554c
|
keep the terminal scrolled to the bottom across resizes if it was at the bottom (#2941) | ||
|
|
296760d2cd
|
Fix IME issues (#2938) | ||
|
|
8306c6bbe7
|
remove orphaned style.scss, make windowtype.ts, small CSS cleanup (#2939)
also duplicates rules.md for kilocode which was not picking it up from the .roo directory |
||
|
|
ba7aea715e
|
Better integration for terminal links (better context-menu and add a tooltip) (#2934)
addresses issue #2901 |
||
|
|
ed7fa40300
|
Refine RemoteFileMultiInfoCommand semantics: dedup inputs, per-path stat errors, and cancellation (#2935)
This follow-up tightens the new multi-file remote stat RPC behavior to
match expected usage: duplicate input paths are skipped, per-path stat
failures no longer fail the entire call, and cancellation is respected
during iteration.
- **RPC response model**
- Added `staterror` to `FileInfo`:
- `StatError string \`json:"staterror,omitempty"\``
- Generated TS type now exposes `staterror?: string` on `FileInfo`.
- **`RemoteFileMultiInfoCommand` behavior updates**
- **Dedup:** if an input path key is already present in the result map,
the loop continues.
- **Non-fatal stat failures:** on `fileInfoInternal` error, the command
now emits a `FileInfo` entry for that input with:
- resolved `path`, `dir`, `name`
- `staterror` populated with `err.Error()`
- continues processing remaining paths.
- **Cancellation:** checks `ctx.Err()` at the top of each iteration and
returns immediately if canceled.
- **PR scope cleanup**
- Removed the previously added test file from this PR per request.
```go
if _, found := rtn[path]; found {
continue
}
if ctx.Err() != nil {
return nil, ctx.Err()
}
fileInfo, err := impl.fileInfoInternal(cleanedPath, false)
if err != nil {
rtn[path] = wshrpc.FileInfo{
Path: wavebase.ReplaceHomeDir(cleanedPath),
Dir: computeDirPart(cleanedPath),
Name: filepath.Base(cleanedPath),
StatError: err.Error(),
}
continue
}
```
<!-- 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>
|
||
|
|
624476fa33
|
Add terminal cursor style/blink config with block-level overrides (#2933)
Adds support for configuring terminal cursor style and blink behavior in
terminal blocks, with hierarchical resolution (block metadata →
connection overrides → global settings). New keys are `term:cursor`
(`block`/`underline`/`bar`, default `block`) and `term:cursorblink`
(`bool`, default `false`).
- **Config surface: new terminal keys**
- Added to global settings schema/types:
- `pkg/wconfig/settingsconfig.go`
- Added to block metadata typing:
- `pkg/waveobj/wtypemeta.go`
- Added default values:
- `pkg/wconfig/defaultconfig/settings.json`
- `"term:cursor": "block"`
- `"term:cursorblink": false`
- **Frontend terminal behavior (xterm options)**
- `frontend/app/view/term/termwrap.ts`
- Added `setCursorStyle()` with value normalization (`underline`/`bar`
else fallback `block`)
- Added `setCursorBlink()`
- Applies both options on terminal construction via
`getOverrideConfigAtom(...)`
- `frontend/app/view/term/term-model.ts`
- Subscribes to `term:cursor` and `term:cursorblink` override atoms
- Propagates live updates to `term.options.cursorStyle` /
`term.options.cursorBlink`
- Cleans up subscriptions in `dispose()`
- **Generated artifacts**
- Regenerated config/type outputs after Go type additions:
- `schema/settings.json`
- `pkg/wconfig/metaconsts.go`
- `pkg/waveobj/metaconsts.go`
- `frontend/types/gotypes.d.ts`
- **Docs**
- Updated config reference and default config example:
- `docs/docs/config.mdx`
```ts
// termwrap.ts
this.setCursorStyle(globalStore.get(getOverrideConfigAtom(this.blockId, "term:cursor")));
this.setCursorBlink(globalStore.get(getOverrideConfigAtom(this.blockId, "term:cursorblink")) ?? false);
// term-model.ts (live updates)
const termCursorAtom = getOverrideConfigAtom(blockId, "term:cursor");
this.termCursorUnsubFn = globalStore.sub(termCursorAtom, () => {
this.termRef.current?.setCursorStyle(globalStore.get(termCursorAtom));
});
```
<!-- START COPILOT CODING AGENT TIPS -->
---
🔒 GitHub Advanced Security automatically protects Copilot coding agent
pull requests. You can protect all pull requests by enabling Advanced
Security for your repositories. [Learn more about Advanced
Security.](https://gh.io/cca-advanced-security)
---------
Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>
Co-authored-by: sawka <2722291+sawka@users.noreply.github.com>
Co-authored-by: sawka <mike@commandline.dev>
|
||
|
|
96ad7a5c5b
|
Wire deterministic context-menu close signaling across Electron and renderer (#2932)
Context-menu opens previously produced renderer callbacks only on
selection (0 or 1 events). This change makes the lifecycle
deterministic: every menu open now emits exactly one completion signal,
with `null` on cancel and item id on selection.
- **Main process: single terminal callback per popup**
- Updated `emain/emain-menu.ts` to use `menu.popup({ callback })`.
- Tracks whether a menu item click occurred during the popup.
- Emits `contextmenu-click: null` only when the menu closes without
selection.
- Suppresses duplicate close events when a click already fired.
- **Preload + API typing: nullable context-menu callback payload**
- Updated preload bridge and `frontend/types/custom.d.ts` so:
- `onContextMenuClick` now accepts `(id: string | null) => void`.
- Keeps existing channel semantics while allowing explicit cancel
signal.
- **Renderer context menu model: close/select/cancel hooks**
- Extended `showContextMenu` with optional `opts`:
- `onSelect?: (item) => void`
- `onCancel?: () => void`
- `onClose?: (item: MenuItem | null) => void`
- Execution order on selection:
1. original item `click`
2. `onSelect`
3. `onClose`
- Execution order on cancel:
1. `onCancel`
2. `onClose(null)`
- **Targeted behavior tests**
- Expanded `frontend/app/store/contextmenu.test.ts` to verify:
- singleton wiring still initializes once,
- selection path ordering (`click -> onSelect -> onClose`),
- cancel path ordering (`onCancel -> onClose(null)`).
```ts
ContextMenuModel.getInstance().showContextMenu(menu, e, {
onSelect: (item) => { /* after item.click */ },
onCancel: () => { /* close without selection */ },
onClose: (itemOrNull) => { /* always called */ },
});
```
<screenshot>
Not applicable — this is a behavioral/API flow change in native context
menu lifecycle rather than a visual UI update.
</screenshot>
<!-- START COPILOT CODING AGENT TIPS -->
---
💬 We'd love your input! Share your thoughts on Copilot coding agent in
our [2 minute survey](https://gh.io/copilot-coding-agent-survey).
---------
Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>
Co-authored-by: sawka <2722291+sawka@users.noreply.github.com>
Co-authored-by: sawka <mike@commandline.dev>
|
||
|
|
752265fed7
|
add a preview component for tabs, update contextmenu model w/ getInstance method (#2927) | ||
|
|
200863bbbc
|
Remove unused frontend notification system and dev-only updater notification UI (#2929)
This PR removes the legacy notification pipeline from the frontend
(`pushNotification`, removal helpers, notification atoms/types, and
notification UI components). The updater status notification path was
only wired through this system and dev-only rendering in `App`, so the
entire path is deleted.
- **Store/API cleanup**
- Removed notification functions from `frontend/app/store/global.ts`:
- `pushNotification`
- `removeNotificationById`
- `removeNotification`
- internal add/update helper
- Removed notification API exposure from `frontend/wave.ts`
(`window.pushNotification`, `window.removeNotificationById`).
- **Global atom/type cleanup**
- Removed notification atoms from `frontend/app/store/global-atoms.ts`:
- `notifications`
- `notificationPopoverMode`
- Removed notification-related fields/types from
`frontend/types/custom.d.ts`:
- `GlobalAtomsType.notifications`
- `GlobalAtomsType.notificationPopoverMode`
- `NotificationType`
- `NotificationActionType`
- **UI removal**
- Removed notification rendering from `frontend/app/app.tsx` by deleting
the `NotificationBubbles` import and dev-guarded render branch.
- Deleted the entire notification UI module under
`frontend/app/notification/`:
- `notificationbubbles.tsx/.scss`
- `notificationitem.tsx/.scss`
- `notificationpopover.tsx`
- `updatenotifier.tsx`
- `usenotification.tsx`
- **Representative diff**
```tsx
// before (app.tsx)
import { NotificationBubbles } from
"./notification/notificationbubbles";
...
{isDev() ? <NotificationBubbles></NotificationBubbles> : null}
// after
// notification import and render removed
```
<screenshot>
UI reference provided for this change set:
https://github.com/user-attachments/assets/6f56b16f-95c9-4a5e-ada8-18ecdc9a1ff8
</screenshot>
<!-- START COPILOT CODING AGENT TIPS -->
---
🔒 GitHub Advanced Security automatically protects Copilot coding agent
pull requests. You can protect all pull requests by enabling Advanced
Security for your repositories. [Learn more about Advanced
Security.](https://gh.io/cca-advanced-security)
---------
Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>
Co-authored-by: sawka <2722291+sawka@users.noreply.github.com>
|
||
|
|
578f1f3ba3
|
quick fix for #2918 (refocus block after magnify button click) (#2930) | ||
|
|
1c5f2f9840
|
Remove unused FlashError pipeline (UI + global state + style/type surface) (#2928)
`FlashError` was legacy UI/state that was never wired into real runtime flows (only self-referenced and window-exported for ad-hoc testing). This PR removes that dead path end-to-end to reduce global surface area and stale styling/types. - **Scope: UI removal (`frontend/app/app.tsx`)** - Deleted the `FlashError` component and its render site (`<FlashError />`). - Removed now-unused imports tied to that component (`removeFlashError`, `Fragment`, `useState`). - **Scope: global store cleanup (`frontend/app/store/global.ts`, `frontend/app/store/global-atoms.ts`)** - Removed `pushFlashError` / `removeFlashError`. - Removed `flashErrors` atom from global atom initialization and registry. - Kept notification path intact (`pushNotification`, `removeNotificationById`, etc.). - **Scope: external/debug surface cleanup (`frontend/wave.ts`)** - Removed `pushFlashError` from imports and from `window` export wiring. - **Scope: type + style cleanup (`frontend/types/custom.d.ts`, `frontend/app/app.scss`, `frontend/app/theme.scss`)** - Removed `GlobalAtomsType.flashErrors`. - Removed `FlashErrorType`. - Removed `.flash-error-container` style block and related z-index token `--zindex-flash-error-container`. ```ts // before (window as any).pushFlashError = pushFlashError; // after (window as any).pushNotification = pushNotification; ``` - **`<screenshot>`** - User-provided screenshot URL (if suitable for PR timeline context): https://github.com/user-attachments/assets/aacc2e61-a65c-4dbf-bfcc-f9f99a490f20 <!-- 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> |
||
|
|
4dd83c3ac2
|
update some npm deps (#2924) | ||
|
|
661d7c070d
|
Bump @vitejs/plugin-react-swc from 4.2.2 to 4.2.3 in the dev-dependencies-patch group (#2874)
Bumps the dev-dependencies-patch group with 1 update: [@vitejs/plugin-react-swc](https://github.com/vitejs/vite-plugin-react/tree/HEAD/packages/plugin-react-swc). Updates `@vitejs/plugin-react-swc` from 4.2.2 to 4.2.3 <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.3 (2026-02-02)</h2> </blockquote> </details> <details> <summary>Commits</summary> <ul> <li><a href=" |
||
|
|
b96d74d953
|
Bump tar from 7.5.7 to 7.5.9 (#2896)
Bumps [tar](https://github.com/isaacs/node-tar) from 7.5.7 to 7.5.9. <details> <summary>Commits</summary> <ul> <li><a href=" |
||
|
|
110e2b90a1
|
update eslint to v9 (and fix all eslint errors) (#2923) | ||
|
|
a79a534975
|
Refine global atom split: keep atom init in global-atoms.ts, move About-menu wiring back to global.ts (#2900)
This refactor keeps `global-atoms.ts` as the owner of atom
state/initialization while correcting ownership boundaries for UI/event
wiring. Specifically, the About menu handler was moved out of atom
initialization and back into `global.ts` startup orchestration.
- **Context / intent**
- `global-atoms.ts` should own atom construction and registries only.
- `global.ts` should orchestrate app-level startup side effects and
re-export compatibility APIs.
- **What changed**
- **`global-atoms.ts`**
- Removed `onMenuItemAbout` registration from `initGlobalAtoms`.
- Removed `modalsModel` import (no longer needed; improves layering).
- Continued to own atom state (`atoms`), atom init (`initGlobalAtoms`),
and atom registries/caches.
- **`global.ts`**
- Added `onMenuItemAbout` registration to `initGlobal` immediately after
`initGlobalAtoms(initOpts)`.
- Keeps UI-level event wiring with global startup orchestration.
- **Boundary after this change**
- `global-atoms.ts`: atom ownership + atom graph init.
- `global.ts`: runtime orchestration + menu/event side effects +
compatibility re-exports.
```ts
// global.ts
function initGlobal(initOpts: GlobalInitOptions) {
globalEnvironment = initOpts.environment;
globalPrimaryTabStartup = initOpts.primaryTabStartup ?? false;
setPlatform(initOpts.platform);
initGlobalAtoms(initOpts);
try {
getApi().onMenuItemAbout(() => {
modalsModel.pushModal("AboutModal");
});
} catch (e) {
console.log("failed to initialize onMenuItemAbout handler", e);
}
}
```
<!-- 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>
|
||
|
|
386faf7454
|
fix multi-input to use onData instead of onKey (#2922) | ||
|
|
dc4acc77d5
|
tooltips for tab bar buttons (AI and workspace switcher) (#2914) | ||
|
|
705563ebe0
|
Refactor ContextMenuModel to lazy singleton via getInstance() and update all call sites (#2920)
`contextmenu.ts` eagerly instantiated its model at import time, which
triggered constructor side effects (`getApi()`) too early. This change
aligns ContextMenuModel with the `client-model.ts` singleton pattern so
initialization is explicit and deferred.
- **Singleton pattern migration (`frontend/app/store/contextmenu.ts`)**
- Replaced eager module-level instance creation with a class-based
singleton:
- `private constructor()`
- `static getInstance()`
- Removed `ContextMenuModelType` export and now export
`ContextMenuModel` class only.
- Constructor side effects (`onContextMenuClick` wiring) now run only on
first `getInstance()` call.
- **Usage updates (all context menu entry points)**
- Updated all direct static-style calls:
- `ContextMenuModel.showContextMenu(...)`
- ⟶ `ContextMenuModel.getInstance().showContextMenu(...)`
- Applied across app/builder/preview/term/tab/widget context-menu
handlers to keep behavior consistent while deferring initialization.
- **Focused regression test**
- Added `frontend/app/store/contextmenu.test.ts` to verify:
- importing `contextmenu` does not initialize the API binding;
- first `getInstance()` initializes once;
- repeated `getInstance()` returns the same singleton instance.
```ts
// before
ContextMenuModel.showContextMenu(menu, e);
// after
ContextMenuModel.getInstance().showContextMenu(menu, e);
```
<!-- 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>
|
||
|
|
a233dcd838
|
try to fix error with go mod download in copilot setup steps (#2921) | ||
|
|
9abd590176
|
UI only preview server (+ deployments) (#2919)
adds a new "preview server" for UI testing. hooking up to cloudflare pages deployments. for now, just a test "about modal" component. will add more later. |
||
|
|
195277de45
|
Generate WaveEvent as a typed discriminated union with explicit null payloads for no-data events (#2899)
This updates WaveEvent typing to be event-aware instead of `data?: any`,
while keeping safe fallback behavior for unmapped events. It also
codifies known no-payload events as `null` payloads and documents event
payload expectations alongside the Go event constants.
- **Event registry + payload documentation (Go)**
- Added `AllEvents` in `pkg/wps/wpstypes.go` as the canonical list of
Wave event names.
- Added/updated inline payload annotations on `Event_*` constants.
- Marked confirmed no-payload events with `// type: none` (e.g.
`route:up`, `route:down`, `workspace:update`, `waveapp:appgoupdated`).
- **Dedicated WaveEvent TS generation path**
- Added `pkg/tsgen/tsgenevent.go` with `event -> reflect.Type` metadata
(`WaveEventDataTypes`).
- Supports three cases:
- mapped concrete type → strong TS payload type
- mapped `nil` → `data?: null` (explicit no-data contract)
- unmapped event → `data?: any` (non-breaking fallback)
- **Custom WaveEvent output and default suppression**
- Suppressed default struct-based `WaveEvent` emission in
`gotypes.d.ts`.
- Added generated `frontend/types/waveevent.d.ts` containing:
- `WaveEventName` string-literal union from `AllEvents`
- discriminated `WaveEvent` union keyed by `event`.
- **Generator wiring + focused coverage**
- Hooked custom event generation into
`cmd/generatets/main-generatets.go`.
- Added `pkg/tsgen/tsgenevent_test.go` assertions for:
- typed mapped events
- explicit `null` for known no-data events
- `any` fallback for unmapped events.
```ts
type WaveEvent = {
event: WaveEventName;
scopes?: string[];
sender?: string;
persist?: number;
data?: any;
} & (
{ event: "block:jobstatus"; data?: BlockJobStatusData } |
{ event: "route:up"; data?: null } |
{ event: "workspace:update"; data?: null } |
{ event: "some:future:event"; data?: any } // fallback if unmapped
);
```
<!-- START COPILOT CODING AGENT TIPS -->
---
💬 We'd love your input! Share your thoughts on Copilot coding agent in
our [2 minute survey](https://gh.io/copilot-coding-agent-survey).
---------
Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>
Co-authored-by: sawka <2722291+sawka@users.noreply.github.com>
Co-authored-by: sawka <mike@commandline.dev>
|
||
|
|
f3b1c16882
|
improve the schema for widgets.json (#2913) | ||
|
|
9400d9467d
|
Bump ajv from 6.12.6 to 6.14.0 (#2910)
Bumps [ajv](https://github.com/ajv-validator/ajv) from 6.12.6 to 6.14.0. <details> <summary>Commits</summary> <ul> <li><a href=" |
||
|
|
b774bab97f
|
add focusallowscursor for waveai panel as well (#2911) | ||
|
|
f49449cff1
|
Bump google.golang.org/api from 0.266.0 to 0.267.0 (#2903)
Bumps [google.golang.org/api](https://github.com/googleapis/google-api-go-client) from 0.266.0 to 0.267.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.267.0</h2> <h2><a href="https://github.com/googleapis/google-api-go-client/compare/v0.266.0...v0.267.0">0.267.0</a> (2026-02-17)</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/3492">#3492</a>) (<a href=" |
||
|
|
b9067fb60b
|
Add app:focusfollowscursor setting (off/on/term) for hover-based block focus (#2908)
This PR adds a new app setting to control whether block focus follows cursor movement: - `app:focusfollowscursor: "off" | "on" | "term"` - Default is `"off"` (no behavior change unless enabled) ## What changed - Added hover-focus behavior on block pointer enter. - Added guardrails so hover focus does not trigger when: - touch input is used - pointer buttons are pressed (drag/select scenarios) - modal is open - pointer events are disabled - block is resizing - Added config key plumbing across settings types and schema: - `pkg/wconfig/settingsconfig.go` - `pkg/wconfig/metaconsts.go` - `schema/settings.json` - `pkg/wconfig/defaultconfig/settings.json` -> `"app:focusfollowscursor": "off"` - Added docs for the new key and default example: - `docs/docs/config.mdx` ## Behavior - `"off"`: do not focus on cursor movement - `"on"`: focus follows cursor for all block types - `"term"`: focus follows cursor only for terminal blocks |
||
|
|
cc0f5c7e11
|
Bump golang.org/x/mod from 0.32.0 to 0.33.0 (#2905)
Bumps [golang.org/x/mod](https://github.com/golang/mod) from 0.32.0 to
0.33.0.
<details>
<summary>Commits</summary>
<ul>
<li><a
href="
|