Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
20 changes: 20 additions & 0 deletions docs/docs/releasenotes.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,26 @@ sidebar_position: 200

# Release Notes

### v0.12.1 — Oct 20, 2025

Patch release focused on shell integration improvements and Wave AI enhancements. This release fixes syntax highlighting in the code editor and adds significant shell context tracking capabilities.

**Shell Integration & Context:**
- **OSC 7 Support** - Added OSC 7 (current working directory) support across bash, zsh, fish, and pwsh shells. Wave now automatically tracks and restores your current directory across restarts for both local and remote terminals.
- **Shell Context Tracking** - Implemented shell integration for bash, zsh, and fish shells. Wave now tracks when your shell is ready to receive commands, the last command executed, and exit codes. This enhanced context enables better terminal management and lays the groundwork for Wave AI to write and execute commands intelligently.

**Wave AI Improvements:**
- Display reasoning summaries in the UI while waiting for AI responses
- Added enhanced terminal context - Wave AI now has access to shell state including current directory, command history, and exit codes
- Added feedback buttons (thumbs up/down) for AI responses to help improve the experience
- Added copy button to easily copy AI responses to clipboard

**Other Changes:**
- Mobile user agent emulation support for web widgets [#2442](https://github.com/wavetermdev/waveterm/issues/2442)
- [bugfix] Fixed padding for header buttons in code editor (Tailwind regression)
- [bugfix] Restored syntax highlighting in code editor preview blocks [#2427](https://github.com/wavetermdev/waveterm/issues/2427)
- Package updates and dependency bumps

### v0.12.0 — Oct 16, 2025

**Wave v0.12 Has Arrived with Wave AI (beta)!**
Expand Down
2 changes: 1 addition & 1 deletion frontend/app/modals/about.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@ const AboutModal = ({}: AboutModalProps) => {
const [updaterChannel] = useState(() => getApi().getUpdaterChannel());

return (
<Modal className="pb-[34px]" onClose={() => modalsModel.popModal()}>
<Modal className="pt-[34px] pb-[34px]" onClose={() => modalsModel.popModal()}>
<div className="flex flex-col gap-[26px] w-full">
<div className="flex flex-col items-center justify-center gap-4 self-stretch w-full text-center">
<Logo />
Expand Down
4 changes: 2 additions & 2 deletions frontend/app/modals/modalsrenderer.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -2,13 +2,13 @@
// SPDX-License-Identifier: Apache-2.0

import { NewInstallOnboardingModal } from "@/app/onboarding/onboarding";
import { CurrentOnboardingVersion } from "@/app/onboarding/onboarding-features";
import { CurrentOnboardingVersion } from "@/app/onboarding/onboarding-common";
import { UpgradeOnboardingModal } from "@/app/onboarding/onboarding-upgrade";
import { atoms, globalPrimaryTabStartup, globalStore } from "@/store/global";
import { modalsModel } from "@/store/modalmodel";
import * as jotai from "jotai";
import { useEffect } from "react";
import semver from "semver";
import * as semver from "semver";
import { getModalComponent } from "./modalregistry";

const ModalsRenderer = () => {
Expand Down
4 changes: 4 additions & 0 deletions frontend/app/onboarding/onboarding-common.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
// Copyright 2025, Command Line Inc.
// SPDX-License-Identifier: Apache-2.0

export const CurrentOnboardingVersion = "v0.12.1";
3 changes: 1 addition & 2 deletions frontend/app/onboarding/onboarding-features.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -12,11 +12,10 @@ import { TabRpcClient } from "@/app/store/wshrpcutil";
import { isMacOS } from "@/util/platformutil";
import { useEffect, useState } from "react";
import { FakeChat } from "./fakechat";
import { CurrentOnboardingVersion } from "./onboarding-common";
import { EditBashrcCommand, ViewLogoCommand, ViewShortcutsCommand } from "./onboarding-command";
import { FakeLayout } from "./onboarding-layout";

export const CurrentOnboardingVersion = "v0.12.0";

type FeaturePageName = "waveai" | "magnify" | "files";

const OnboardingFooter = ({
Expand Down
201 changes: 201 additions & 0 deletions frontend/app/onboarding/onboarding-upgrade-v0120.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,201 @@
// Copyright 2025, Command Line Inc.
// SPDX-License-Identifier: Apache-2.0

import Logo from "@/app/asset/logo.svg";
import { Button } from "@/app/element/button";
import { FlexiModal } from "@/app/modals/modal";
import { CurrentOnboardingVersion } from "@/app/onboarding/onboarding-common";
import { OnboardingFeatures } from "@/app/onboarding/onboarding-features";
import { atoms, globalStore } from "@/app/store/global";
import { disableGlobalKeybindings, enableGlobalKeybindings, globalRefocus } from "@/app/store/keymodel";
import { modalsModel } from "@/app/store/modalmodel";
import * as WOS from "@/app/store/wos";
import { RpcApi } from "@/app/store/wshclientapi";
import { TabRpcClient } from "@/app/store/wshrpcutil";
import { OverlayScrollbarsComponent } from "overlayscrollbars-react";
import { useEffect, useRef, useState } from "react";
import { debounce } from "throttle-debounce";

const UpgradeOnboardingModal_v0_12_0 = () => {
const modalRef = useRef<HTMLDivElement | null>(null);
const [pageName, setPageName] = useState<"welcome" | "features">("welcome");
const [isCompact, setIsCompact] = useState<boolean>(window.innerHeight < 800);

const updateModalHeight = () => {
const windowHeight = window.innerHeight;
setIsCompact(windowHeight < 800);
if (modalRef.current) {
const modalHeight = modalRef.current.offsetHeight;
const maxHeight = windowHeight * 0.9;
if (maxHeight < modalHeight) {
modalRef.current.style.height = `${maxHeight}px`;
} else {
modalRef.current.style.height = "auto";
}
}
};

useEffect(() => {
updateModalHeight();
const debouncedUpdateModalHeight = debounce(150, updateModalHeight);
window.addEventListener("resize", debouncedUpdateModalHeight);
return () => {
window.removeEventListener("resize", debouncedUpdateModalHeight);
};
}, []);

useEffect(() => {
disableGlobalKeybindings();
return () => {
enableGlobalKeybindings();
};
}, []);

const handleStarClick = async () => {
RpcApi.RecordTEventCommand(
TabRpcClient,
{
event: "onboarding:githubstar",
props: { "onboarding:githubstar": "star" },
},
{ noresponse: true }
);
const clientId = globalStore.get(atoms.clientId);
await RpcApi.SetMetaCommand(TabRpcClient, {
oref: WOS.makeORef("client", clientId),
meta: { "onboarding:githubstar": true },
});
window.open("https://github.com/wavetermdev/waveterm?ref=upgrade", "_blank");
setPageName("features");
};

const handleAlreadyStarred = async () => {
RpcApi.RecordTEventCommand(
TabRpcClient,
{
event: "onboarding:githubstar",
props: { "onboarding:githubstar": "already" },
},
{ noresponse: true }
);
const clientId = globalStore.get(atoms.clientId);
await RpcApi.SetMetaCommand(TabRpcClient, {
oref: WOS.makeORef("client", clientId),
meta: { "onboarding:githubstar": true },
});
setPageName("features");
};

const handleMaybeLater = async () => {
RpcApi.RecordTEventCommand(
TabRpcClient,
{
event: "onboarding:githubstar",
props: { "onboarding:githubstar": "later" },
},
{ noresponse: true }
);
const clientId = globalStore.get(atoms.clientId);
await RpcApi.SetMetaCommand(TabRpcClient, {
oref: WOS.makeORef("client", clientId),
meta: { "onboarding:githubstar": false },
});
setPageName("features");
};

const handleFeaturesComplete = () => {
const clientId = globalStore.get(atoms.clientId);
RpcApi.SetMetaCommand(TabRpcClient, {
oref: WOS.makeORef("client", clientId),
meta: { "onboarding:lastversion": CurrentOnboardingVersion },
});
globalStore.set(modalsModel.upgradeOnboardingOpen, false);
setTimeout(() => {
globalRefocus();
}, 10);
};

let pageComp: React.JSX.Element = null;
if (pageName === "welcome") {
pageComp = (
<div className="flex flex-col h-full">
<header className="flex flex-col gap-2 border-b-0 p-0 mt-1 mb-6 w-full unselectable flex-shrink-0">
<div className="flex justify-center">
<Logo />
</div>
<div className="text-center text-[25px] font-normal text-foreground">Welcome to Wave v0.12!</div>
</header>
<OverlayScrollbarsComponent
className="flex-1 overflow-y-auto min-h-0"
options={{ scrollbars: { autoHide: "never" } }}
>
<div className="flex flex-col items-center gap-3 w-full mb-2 unselectable">
<div className="flex flex-col items-center gap-4 max-w-md text-center">
<div className="flex h-[52px] px-3 items-center rounded-lg bg-hover text-accent text-[24px]">
<i className="fa fa-sparkles" />
<span className="font-bold ml-2 font-mono">Wave AI</span>
</div>
<div className="text-secondary leading-relaxed max-w-[420px]">
<p className="mb-4">
Wave AI is your new terminal assistant with full context. It can read your terminal
output, analyze widgets, access files, and help you solve problems&nbsp;faster.
</p>
<p className="p-3 border border-border rounded-md bg-hover/30">
Wave AI is in active beta with included AI credits while we refine the experience.
We're actively improving it and would love your feedback in{" "}
<a target="_blank" href="https://discord.gg/XfvZ334gwU" className="hover:underline">
Discord
</a>
.
</p>
</div>
</div>

<div className="w-full max-w-md border-t border-border my-2"></div>

<div className="flex flex-col items-center gap-3 text-center max-w-[440px]">
<div className="text-foreground text-base">Thanks for being an early Wave adopter! ⭐</div>
<div className="text-secondary text-sm">
A GitHub star shows your support for Wave (and open-source) and helps us reach more
developers.
</div>
</div>
</div>
</OverlayScrollbarsComponent>
<footer className="unselectable flex-shrink-0 mt-4">
<div className="flex flex-row items-center justify-center gap-2.5 [&>button]:!px-5 [&>button]:!py-2 [&>button]:text-sm [&>button]:!h-[37px]">
<Button className="outlined grey font-[600]" onClick={handleAlreadyStarred}>
🙏 Already Starred
</Button>
<Button className="outlined green font-[600]" onClick={handleStarClick}>
⭐ Star Now
</Button>
<Button className="outlined grey font-[600]" onClick={handleMaybeLater}>
Maybe Later
</Button>
</div>
</footer>
</div>
);
} else if (pageName === "features") {
pageComp = <OnboardingFeatures onComplete={handleFeaturesComplete} />;
}

if (pageComp == null) {
return null;
}

const paddingClass = isCompact ? "!py-3 !px-[30px]" : "!p-[30px]";
const widthClass = pageName === "features" ? "w-[800px]" : "w-[560px]";

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

UpgradeOnboardingModal_v0_12_0.displayName = "UpgradeOnboardingModal_v0_12_0";

export { UpgradeOnboardingModal_v0_12_0 };
Loading
Loading