Skip to content

Commit b5d23e5

Browse files
authored
v0.14.1 Release Notes and Onboarding (#2966)
1 parent df24959 commit b5d23e5

File tree

10 files changed

+532
-141
lines changed

10 files changed

+532
-141
lines changed

docs/docs/releasenotes.mdx

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,34 @@ sidebar_position: 200
66

77
# Release Notes
88

9+
### v0.14.1 — Mar 3, 2026
10+
11+
Wave v0.14.1 fixes several high-impact terminal bugs (Claude Code scrolling, IME input) and adds new config options: focus-follows-cursor, cursor style customization, workspace-scoped widgets, and vim-style block navigation.
12+
13+
**Terminal Improvements:**
14+
15+
- **Claude Code Scroll Fix** - Fixed a long-standing bug that caused terminal windows to jump to the top unexpectedly, affecting many Claude Code users
16+
- **IME Fix** - Fixed Korean/CJK input where characters were lost or stuck in composition and only committed on Space
17+
- **Scroll Position Preserved on Resize** - Terminal now stays scrolled to the bottom across resizes when it was already at the bottom
18+
- **Better Link Handling** - Terminal URLs now have improved context menus and tooltips for easier navigation
19+
- **Terminal Scrollback Save** - New context menu item and `wsh` command to save terminal scrollback to a file
20+
21+
**New Features:**
22+
23+
- **Focus Follows Cursor** - New `app:focusfollowscursor` setting (off/on/term) for hover-based block focus
24+
- **Terminal Cursor Style & Blink** - New settings for cursor style (block/bar/underline) and blink, configurable per-block
25+
- **Tab Close Confirmation** - New `tab:confirmclose` setting to prompt before closing a tab
26+
- **Workspace-Scoped Widgets** - New optional `workspaces` field in `widgets.json` to show/hide widgets per-workspace
27+
- **Vim-Style Block Navigation** - Added Ctrl+Shift+H/J/K/L to navigate between blocks
28+
- **New AI Providers** - Added Groq and NanoGPT as built-in AI provider presets
29+
30+
**Other Changes:**
31+
32+
- Fixed intermittant bugs with connection switching in terminal blocks
33+
- Widgets.json schema improvements for better editor validation
34+
- Package updates and dependency upgrades
35+
- Internal code cleanup and refactoring
36+
937
### v0.14.0 — Feb 10, 2026
1038

1139
**Durable SSH Sessions and Enhanced Connection Monitoring**
Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,10 @@
11
// Copyright 2026, Command Line Inc.
22
// SPDX-License-Identifier: Apache-2.0
33

4-
export const CurrentOnboardingVersion = "v0.14.0";
4+
export const CurrentOnboardingVersion = "v0.14.1";
5+
6+
export function OnboardingGradientBg() {
7+
return (
8+
<div className="absolute inset-0 bg-gradient-to-br from-accent/[0.25] via-transparent to-accent/[0.05] pointer-events-none rounded-[10px]" />
9+
);
10+
}
Lines changed: 122 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,122 @@
1+
// Copyright 2026, Command Line Inc.
2+
// SPDX-License-Identifier: Apache-2.0
3+
4+
import Logo from "@/app/asset/logo.svg";
5+
import { Button } from "@/app/element/button";
6+
import { ClientModel } from "@/app/store/client-model";
7+
import * as WOS from "@/app/store/wos";
8+
import { RpcApi } from "@/app/store/wshclientapi";
9+
import { TabRpcClient } from "@/app/store/wshrpcutil";
10+
11+
type StarAskPageProps = {
12+
onClose: () => void;
13+
page?: string;
14+
};
15+
16+
export function StarAskPage({ onClose, page = "upgrade" }: StarAskPageProps) {
17+
const handleStarClick = async () => {
18+
RpcApi.RecordTEventCommand(
19+
TabRpcClient,
20+
{
21+
event: "onboarding:githubstar",
22+
props: { "onboarding:githubstar": "star", "onboarding:page": page },
23+
},
24+
{ noresponse: true }
25+
);
26+
const clientId = ClientModel.getInstance().clientId;
27+
await RpcApi.SetMetaCommand(TabRpcClient, {
28+
oref: WOS.makeORef("client", clientId),
29+
meta: { "onboarding:githubstar": true },
30+
});
31+
window.open(`https://github.com/wavetermdev/waveterm?ref=${page}`, "_blank");
32+
onClose();
33+
};
34+
35+
const handleAlreadyStarred = async () => {
36+
RpcApi.RecordTEventCommand(
37+
TabRpcClient,
38+
{
39+
event: "onboarding:githubstar",
40+
props: { "onboarding:githubstar": "already", "onboarding:page": page },
41+
},
42+
{ noresponse: true }
43+
);
44+
const clientId = ClientModel.getInstance().clientId;
45+
await RpcApi.SetMetaCommand(TabRpcClient, {
46+
oref: WOS.makeORef("client", clientId),
47+
meta: { "onboarding:githubstar": true },
48+
});
49+
onClose();
50+
};
51+
52+
const handleRepoLinkClick = () => {
53+
RpcApi.RecordTEventCommand(
54+
TabRpcClient,
55+
{
56+
event: "action:link",
57+
props: { "action:type": "githubrepo", "onboarding:page": page },
58+
},
59+
{ noresponse: true }
60+
);
61+
window.open("https://github.com/wavetermdev/waveterm", "_blank");
62+
};
63+
64+
const handleMaybeLater = async () => {
65+
RpcApi.RecordTEventCommand(
66+
TabRpcClient,
67+
{
68+
event: "onboarding:githubstar",
69+
props: { "onboarding:githubstar": "later", "onboarding:page": page },
70+
},
71+
{ noresponse: true }
72+
);
73+
const clientId = ClientModel.getInstance().clientId;
74+
await RpcApi.SetMetaCommand(TabRpcClient, {
75+
oref: WOS.makeORef("client", clientId),
76+
meta: { "onboarding:githubstar": false },
77+
});
78+
onClose();
79+
};
80+
81+
return (
82+
<div className="flex flex-col h-full">
83+
<header className="flex flex-col gap-2 border-b-0 p-0 mt-1 mb-6 w-full unselectable flex-shrink-0">
84+
<div className="flex justify-center">
85+
<Logo />
86+
</div>
87+
<div className="text-center text-[25px] font-normal text-foreground">Support open-source. Star Wave. ⭐</div>
88+
</header>
89+
<div className="flex-1 flex flex-col items-center justify-center gap-5 unselectable">
90+
<div className="flex flex-col items-center gap-4 max-w-[460px] text-center">
91+
<div className="text-secondary text-sm leading-relaxed">
92+
Wave is free, open-source, and open-model. Stars help us stay visible against closed
93+
alternatives. One click makes a difference.
94+
</div>
95+
<div
96+
className="group flex items-center justify-center gap-2 text-secondary text-sm mt-1 cursor-pointer transition-colors"
97+
onClick={handleRepoLinkClick}
98+
>
99+
<i className="fa-brands fa-github text-foreground text-lg group-hover:text-accent transition-colors" />
100+
<span className="text-foreground font-mono text-sm group-hover:text-accent group-hover:underline transition-colors">
101+
wavetermdev/waveterm
102+
</span>
103+
</div>
104+
</div>
105+
</div>
106+
<footer className="unselectable flex-shrink-0 mt-6">
107+
<div className="flex flex-row items-center justify-center gap-2.5 [&>button]:!px-5 [&>button]:!py-2 [&>button]:text-sm [&>button]:!h-[37px]">
108+
<Button className="outlined grey font-[600]" onClick={handleAlreadyStarred}>
109+
🙏 Already Starred
110+
</Button>
111+
<Button className="outlined green font-[600]" onClick={handleStarClick}>
112+
⭐ Star Now
113+
</Button>
114+
<Button className="outlined grey font-[600]" onClick={handleMaybeLater}>
115+
Maybe Later
116+
</Button>
117+
</div>
118+
</footer>
119+
</div>
120+
);
121+
}
122+

frontend/app/onboarding/onboarding-upgrade-minor.tsx

Lines changed: 90 additions & 74 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,10 @@
1-
// Copyright 2025, Command Line Inc.
1+
// Copyright 2026, Command Line Inc.
22
// SPDX-License-Identifier: Apache-2.0
33

44
import Logo from "@/app/asset/logo.svg";
55
import { Button } from "@/app/element/button";
66
import { FlexiModal } from "@/app/modals/modal";
7-
import { CurrentOnboardingVersion } from "@/app/onboarding/onboarding-common";
7+
import { CurrentOnboardingVersion, OnboardingGradientBg } from "@/app/onboarding/onboarding-common";
88
import { OnboardingFeatures } from "@/app/onboarding/onboarding-features";
99
import { ClientModel } from "@/app/store/client-model";
1010
import { globalStore } from "@/app/store/global";
@@ -17,6 +17,84 @@ import { OverlayScrollbarsComponent } from "overlayscrollbars-react";
1717
import { useEffect, useRef, useState } from "react";
1818
import { debounce } from "throttle-debounce";
1919

20+
type UpgradeMinorWelcomePageProps = {
21+
onStarClick: () => void;
22+
onAlreadyStarred: () => void;
23+
onMaybeLater: () => void;
24+
};
25+
26+
const UpgradeMinorWelcomePage = ({ onStarClick, onAlreadyStarred, onMaybeLater }: UpgradeMinorWelcomePageProps) => {
27+
return (
28+
<div className="flex flex-col h-full">
29+
<header className="flex flex-col gap-2 border-b-0 p-0 mt-1 mb-4 w-full unselectable flex-shrink-0">
30+
<div className="flex justify-center">
31+
<Logo />
32+
</div>
33+
<div className="text-center text-[25px] font-normal text-foreground">Welcome to Wave v0.14!</div>
34+
</header>
35+
<OverlayScrollbarsComponent
36+
className="flex-1 overflow-y-auto min-h-0"
37+
options={{ scrollbars: { autoHide: "never" } }}
38+
>
39+
<div className="flex flex-col items-center gap-3 w-full mb-2 unselectable">
40+
<div className="flex flex-col items-center gap-4">
41+
<div className="flex flex-row gap-4 items-center">
42+
<div className="flex h-[52px] px-3 items-center rounded-lg bg-hover text-accent text-[24px]">
43+
<i className="fa fa-sparkles" />
44+
<span className="font-bold ml-2 font-mono">Wave AI</span>
45+
</div>
46+
<div className="flex h-[52px] px-3 items-center rounded-lg bg-hover text-[18px]">
47+
<i className="fa-sharp fa-solid fa-shield text-sky-500" />
48+
<span className="font-bold ml-2 text-accent">Durable SSH Sessions</span>
49+
</div>
50+
</div>
51+
<div className="text-secondary leading-relaxed max-w-[600px] text-left">
52+
<p className="mb-4">
53+
Wave AI is your terminal assistant with full context. It can read your terminal output,
54+
analyze widgets, read and write files, and help you solve problems&nbsp;faster.
55+
</p>
56+
<p className="mb-4">
57+
<span className="font-semibold text-foreground">New in v0.13:</span> Wave AI now
58+
supports local models and bring-your-own-key! Use Ollama, LM Studio, vLLM, OpenRouter,
59+
or any OpenAI-compatible provider.
60+
</p>
61+
<p className="mb-4">
62+
<span className="font-semibold text-foreground">New in v0.14:</span> Durable SSH
63+
sessions survive network drops, laptop sleep, and restarts — all without tmux or screen.
64+
</p>
65+
</div>
66+
</div>
67+
68+
<div className="w-full max-w-[550px] border-t border-border my-2"></div>
69+
70+
<div className="flex flex-col items-center gap-3 text-center max-w-[550px]">
71+
<div className="text-foreground text-base">Thanks for being an early Wave adopter! ⭐</div>
72+
<div className="text-secondary text-sm text-left">
73+
A GitHub star shows your support for Wave (and open-source) and helps us reach more
74+
developers.
75+
</div>
76+
</div>
77+
</div>
78+
</OverlayScrollbarsComponent>
79+
<footer className="unselectable flex-shrink-0 mt-4">
80+
<div className="flex flex-row items-center justify-center gap-2.5 [&>button]:!px-5 [&>button]:!py-2 [&>button]:text-sm [&>button]:!h-[37px]">
81+
<Button className="outlined grey font-[600]" onClick={onAlreadyStarred}>
82+
🙏 Already Starred
83+
</Button>
84+
<Button className="outlined green font-[600]" onClick={onStarClick}>
85+
⭐ Star Now
86+
</Button>
87+
<Button className="outlined grey font-[600]" onClick={onMaybeLater}>
88+
Maybe Later
89+
</Button>
90+
</div>
91+
</footer>
92+
</div>
93+
);
94+
};
95+
96+
UpgradeMinorWelcomePage.displayName = "UpgradeMinorWelcomePage";
97+
2098
const UpgradeOnboardingMinor = () => {
2199
const modalRef = useRef<HTMLDivElement | null>(null);
22100
const [pageName, setPageName] = useState<"welcome" | "features">("welcome");
@@ -57,7 +135,7 @@ const UpgradeOnboardingMinor = () => {
57135
TabRpcClient,
58136
{
59137
event: "onboarding:githubstar",
60-
props: { "onboarding:githubstar": "star" },
138+
props: { "onboarding:githubstar": "star", "onboarding:page": "minorupgrade" },
61139
},
62140
{ noresponse: true }
63141
);
@@ -75,7 +153,7 @@ const UpgradeOnboardingMinor = () => {
75153
TabRpcClient,
76154
{
77155
event: "onboarding:githubstar",
78-
props: { "onboarding:githubstar": "already" },
156+
props: { "onboarding:githubstar": "already", "onboarding:page": "minorupgrade" },
79157
},
80158
{ noresponse: true }
81159
);
@@ -92,7 +170,7 @@ const UpgradeOnboardingMinor = () => {
92170
TabRpcClient,
93171
{
94172
event: "onboarding:githubstar",
95-
props: { "onboarding:githubstar": "later" },
173+
props: { "onboarding:githubstar": "later", "onboarding:page": "minorupgrade" },
96174
},
97175
{ noresponse: true }
98176
);
@@ -119,73 +197,11 @@ const UpgradeOnboardingMinor = () => {
119197
let pageComp: React.JSX.Element = null;
120198
if (pageName === "welcome") {
121199
pageComp = (
122-
<div className="flex flex-col h-full">
123-
<header className="flex flex-col gap-2 border-b-0 p-0 mt-1 mb-4 w-full unselectable flex-shrink-0">
124-
<div className="flex justify-center">
125-
<Logo />
126-
</div>
127-
<div className="text-center text-[25px] font-normal text-foreground">Welcome to Wave v0.14!</div>
128-
</header>
129-
<OverlayScrollbarsComponent
130-
className="flex-1 overflow-y-auto min-h-0"
131-
options={{ scrollbars: { autoHide: "never" } }}
132-
>
133-
<div className="flex flex-col items-center gap-3 w-full mb-2 unselectable">
134-
<div className="flex flex-col items-center gap-4">
135-
<div className="flex flex-row gap-4 items-center">
136-
<div className="flex h-[52px] px-3 items-center rounded-lg bg-hover text-accent text-[24px]">
137-
<i className="fa fa-sparkles" />
138-
<span className="font-bold ml-2 font-mono">Wave AI</span>
139-
</div>
140-
<div className="flex h-[52px] px-3 items-center rounded-lg bg-hover text-[18px]">
141-
<i className="fa-sharp fa-solid fa-shield text-sky-500" />
142-
<span className="font-bold ml-2 text-accent">Durable SSH Sessions</span>
143-
</div>
144-
</div>
145-
<div className="text-secondary leading-relaxed max-w-[600px] text-left">
146-
<p className="mb-4">
147-
Wave AI is your terminal assistant with full context. It can read your terminal
148-
output, analyze widgets, read and write files, and help you solve
149-
problems&nbsp;faster.
150-
</p>
151-
<p className="mb-4">
152-
<span className="font-semibold text-foreground">New in v0.13:</span> Wave AI now
153-
supports local models and bring-your-own-key! Use Ollama, LM Studio, vLLM,
154-
OpenRouter, or any OpenAI-compatible provider.
155-
</p>
156-
<p className="mb-4">
157-
<span className="font-semibold text-foreground">New in v0.14:</span> Durable SSH
158-
sessions survive network drops, laptop sleep, and restarts — all without tmux or
159-
screen.
160-
</p>
161-
</div>
162-
</div>
163-
164-
<div className="w-full max-w-[550px] border-t border-border my-2"></div>
165-
166-
<div className="flex flex-col items-center gap-3 text-center max-w-[550px]">
167-
<div className="text-foreground text-base">Thanks for being an early Wave adopter! ⭐</div>
168-
<div className="text-secondary text-sm text-left">
169-
A GitHub star shows your support for Wave (and open-source) and helps us reach more
170-
developers.
171-
</div>
172-
</div>
173-
</div>
174-
</OverlayScrollbarsComponent>
175-
<footer className="unselectable flex-shrink-0 mt-4">
176-
<div className="flex flex-row items-center justify-center gap-2.5 [&>button]:!px-5 [&>button]:!py-2 [&>button]:text-sm [&>button]:!h-[37px]">
177-
<Button className="outlined grey font-[600]" onClick={handleAlreadyStarred}>
178-
🙏 Already Starred
179-
</Button>
180-
<Button className="outlined green font-[600]" onClick={handleStarClick}>
181-
⭐ Star Now
182-
</Button>
183-
<Button className="outlined grey font-[600]" onClick={handleMaybeLater}>
184-
Maybe Later
185-
</Button>
186-
</div>
187-
</footer>
188-
</div>
200+
<UpgradeMinorWelcomePage
201+
onStarClick={handleStarClick}
202+
onAlreadyStarred={handleAlreadyStarred}
203+
onMaybeLater={handleMaybeLater}
204+
/>
189205
);
190206
} else if (pageName === "features") {
191207
pageComp = <OnboardingFeatures onComplete={handleFeaturesComplete} />;
@@ -200,12 +216,12 @@ const UpgradeOnboardingMinor = () => {
200216

201217
return (
202218
<FlexiModal className={`${widthClass} rounded-[10px] ${paddingClass} relative overflow-hidden`} ref={modalRef}>
203-
<div className="absolute inset-0 bg-gradient-to-br from-accent/[0.25] via-transparent to-accent/[0.05] pointer-events-none rounded-[10px]" />
219+
<OnboardingGradientBg />
204220
<div className="flex flex-col w-full h-full relative z-10">{pageComp}</div>
205221
</FlexiModal>
206222
);
207223
};
208224

209225
UpgradeOnboardingMinor.displayName = "UpgradeOnboardingMinor";
210226

211-
export { UpgradeOnboardingMinor };
227+
export { UpgradeMinorWelcomePage, UpgradeOnboardingMinor };

0 commit comments

Comments
 (0)