Conversation
WalkthroughThis PR introduces v0.14.1 release infrastructure by adding release notes documentation, new onboarding UI components for a GitHub star prompt flow, a reusable gradient background component, and telemetry enhancements. Changes include updates to the onboarding version constant, creation of dedicated components for minor upgrade and patch upgrade flows, integration of GitHub star tracking events, and corresponding TypeScript type definitions and telemetry schema expansions. Preview and test files are updated to accommodate the new components. Estimated code review effort🎯 3 (Moderate) | ⏱️ ~20 minutes 🚥 Pre-merge checks | ✅ 1 | ❌ 2❌ Failed checks (1 warning, 1 inconclusive)
✅ Passed checks (1 passed)
✏️ Tip: You can configure your own custom pre-merge checks in the settings. ✨ Finishing Touches
🧪 Generate unit tests (beta)
Tip Try Coding Plans. Let us write the prompt for your AI agent so you can ship faster (with fewer bugs). Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out. Comment |
Code Review SummaryStatus: No Issues Found | Recommendation: Merge Files Reviewed (10 files)
Review Notes: This PR adds v0.14.1 release notes and onboarding flow updates. The code is well-structured and follows the project's established patterns:
|
Deploying waveterm with
|
| Latest commit: |
d6dec03
|
| Status: | ✅ Deploy successful! |
| Preview URL: | https://380e6a65.waveterm.pages.dev |
| Branch Preview URL: | https://sawka-rl-141.waveterm.pages.dev |
There was a problem hiding this comment.
Actionable comments posted: 3
Caution
Some comments are outside the diff and can’t be posted inline due to platform limitations.
⚠️ Outside diff range comments (1)
frontend/app/onboarding/onboarding-upgrade-minor.tsx (1)
133-183:⚠️ Potential issue | 🟠 MajorMake the metadata write non-blocking in all three handlers to prevent UX flow stalls.
At lines 143, 161, and 178,
await RpcApi.SetMetaCommand(...)blocks the handler. If the RPC call fails, the handler throws andsetPageName("features")at lines 148, 165, and 182 never executes, leaving the user stuck on the welcome page.Extract the metadata write to a helper that silently handles errors:
Proposed fix
+ const setGithubStarMeta = async (value: boolean) => { + const clientId = ClientModel.getInstance().clientId; + try { + await RpcApi.SetMetaCommand(TabRpcClient, { + oref: WOS.makeORef("client", clientId), + meta: { "onboarding:githubstar": value }, + }); + } catch { + // keep onboarding flow non-blocking + } + }; + const handleAlreadyStarred = async () => { RpcApi.RecordTEventCommand( TabRpcClient, { event: "onboarding:githubstar", props: { "onboarding:githubstar": "already", "onboarding:page": "minorupgrade" }, }, { noresponse: true } ); - const clientId = ClientModel.getInstance().clientId; - await RpcApi.SetMetaCommand(TabRpcClient, { - oref: WOS.makeORef("client", clientId), - meta: { "onboarding:githubstar": true }, - }); + void setGithubStarMeta(true); setPageName("features"); };🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@frontend/app/onboarding/onboarding-upgrade-minor.tsx` around lines 133 - 183, The three handlers handleStarClick, handleAlreadyStarred, and handleMaybeLater currently await RpcApi.SetMetaCommand which can block or throw and prevent setPageName("features"); instead, make the meta write fire-and-forget: extract the SetMetaCommand call into a small helper (e.g., writeMetaNoBlock or setMetaAsync) that invokes RpcApi.SetMetaCommand without awaiting, catches and logs any errors (but does not rethrow), and call that helper from each handler before or after calling setPageName("features") so setPageName always runs even if the RPC fails.
🧹 Nitpick comments (2)
frontend/app/onboarding/onboarding.tsx (1)
38-52: Consider extracting shared GitHub-star telemetry/meta logic into one helper.The same record-event + set-meta sequence now exists in multiple handlers with only page/choice differences, which increases drift risk.
Also applies to: 190-216
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@frontend/app/onboarding/onboarding.tsx` around lines 38 - 52, The telemetry + meta update logic in handlers like handleStarClick currently duplicates the RpcApi.RecordTEventCommand + RpcApi.SetMetaCommand sequence; extract a single helper function (e.g., sendOnboardingChoice or recordOnboardingAction) that accepts parameters for event props (page and choice) and performs RpcApi.RecordTEventCommand(TabRpcClient, {...}) then RpcApi.SetMetaCommand(TabRpcClient, { oref: WOS.makeORef("client", ClientModel.getInstance().clientId), meta: { ["onboarding:githubstar"]?: boolean | other key } }); replace handleStarClick and the similar handlers (the other occurrences around the later handlers) to call this helper with the appropriate page and choice values so all recording and meta-setting logic is centralized and consistent.frontend/app/onboarding/onboarding-starask.tsx (1)
31-31: Remove thenoopener,noreferrersuggestion from this review.In Electron applications,
window.open(..., "_blank")opens external links in the system's default browser, creating a security boundary that preventswindow.openeraccess. Thenoopener,noreferrerattributes do not apply in this context. Sincepagevalues are hardcoded internally ("upgrade" is the only value used), URL encoding is a minor hardening measure but not critical.🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@frontend/app/onboarding/onboarding-starask.tsx` at line 31, Remove the earlier suggestion to add "noopener,noreferrer" — leave the external-open behavior using window.open(..., "_blank") in onboarding-starask.tsx because Electron already opens external links in the system browser; no noopener/noreferrer is required. If you want a minor hardening, URL-encode the page variable used in the template string by replacing `\`https://github.com/wavetermdev/waveterm?ref=${page}\`` with `\`https://github.com/wavetermdev/waveterm?ref=${encodeURIComponent(page)}\`` when calling window.open, but do not add noopener/noreferrer.
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.
Inline comments:
In `@docs/docs/releasenotes.mdx`:
- Line 32: Replace the misspelled word "intermittant" in the release notes
sentence "Fixed intermittant bugs with connection switching in terminal blocks"
with the correct spelling "intermittent" so the line reads "Fixed intermittent
bugs with connection switching in terminal blocks".
In `@frontend/app/onboarding/onboarding-starask.tsx`:
- Around line 52-62: The clickable repo area uses a non-semantic <div> with
handleRepoLinkClick, which is not keyboard-accessible; replace that <div> with a
semantic <a> element that includes
href="https://github.com/wavetermdev/waveterm", target="_blank", rel="noopener
noreferrer" and keeps the onClick handler (RpcApi.RecordTEventCommand call in
handleRepoLinkClick) and an appropriate aria-label so it is focusable and
activates with Enter/Space via native browser behavior.
- Around line 17-33: The handlers handleStarClick and handleAlreadyStarred call
RpcApi.SetMetaCommand and then onClose(), but if SetMetaCommand rejects the
modal stays open; wrap the RpcApi.SetMetaCommand(...) call in a try/finally so
onClose() is executed regardless of success or error. Specifically, in
handleStarClick and handleAlreadyStarred, surround the await
RpcApi.SetMetaCommand(TabRpcClient, { oref: WOS.makeORef("client",
ClientModel.getInstance().clientId), meta: { "onboarding:githubstar": true } })
(and the corresponding meta call in the other handler) with try { await ... }
finally { onClose(); } while leaving the event-recording and window.open logic
as appropriate.
---
Outside diff comments:
In `@frontend/app/onboarding/onboarding-upgrade-minor.tsx`:
- Around line 133-183: The three handlers handleStarClick, handleAlreadyStarred,
and handleMaybeLater currently await RpcApi.SetMetaCommand which can block or
throw and prevent setPageName("features"); instead, make the meta write
fire-and-forget: extract the SetMetaCommand call into a small helper (e.g.,
writeMetaNoBlock or setMetaAsync) that invokes RpcApi.SetMetaCommand without
awaiting, catches and logs any errors (but does not rethrow), and call that
helper from each handler before or after calling setPageName("features") so
setPageName always runs even if the RPC fails.
---
Nitpick comments:
In `@frontend/app/onboarding/onboarding-starask.tsx`:
- Line 31: Remove the earlier suggestion to add "noopener,noreferrer" — leave
the external-open behavior using window.open(..., "_blank") in
onboarding-starask.tsx because Electron already opens external links in the
system browser; no noopener/noreferrer is required. If you want a minor
hardening, URL-encode the page variable used in the template string by replacing
`\`https://github.com/wavetermdev/waveterm?ref=${page}\`` with
`\`https://github.com/wavetermdev/waveterm?ref=${encodeURIComponent(page)}\``
when calling window.open, but do not add noopener/noreferrer.
In `@frontend/app/onboarding/onboarding.tsx`:
- Around line 38-52: The telemetry + meta update logic in handlers like
handleStarClick currently duplicates the RpcApi.RecordTEventCommand +
RpcApi.SetMetaCommand sequence; extract a single helper function (e.g.,
sendOnboardingChoice or recordOnboardingAction) that accepts parameters for
event props (page and choice) and performs
RpcApi.RecordTEventCommand(TabRpcClient, {...}) then
RpcApi.SetMetaCommand(TabRpcClient, { oref: WOS.makeORef("client",
ClientModel.getInstance().clientId), meta: { ["onboarding:githubstar"]?: boolean
| other key } }); replace handleStarClick and the similar handlers (the other
occurrences around the later handlers) to call this helper with the appropriate
page and choice values so all recording and meta-setting logic is centralized
and consistent.
ℹ️ Review info
Configuration used: Repository UI
Review profile: CHILL
Plan: Pro
📒 Files selected for processing (10)
docs/docs/releasenotes.mdxfrontend/app/onboarding/onboarding-common.tsxfrontend/app/onboarding/onboarding-starask.tsxfrontend/app/onboarding/onboarding-upgrade-minor.tsxfrontend/app/onboarding/onboarding-upgrade-patch.tsxfrontend/app/onboarding/onboarding-upgrade-v0141.tsxfrontend/app/onboarding/onboarding.tsxfrontend/preview/previews/onboarding.preview.tsxfrontend/types/gotypes.d.tspkg/telemetry/telemetrydata/telemetrydata.go
|
|
||
| **Other Changes:** | ||
|
|
||
| - Fixed intermittant bugs with connection switching in terminal blocks |
There was a problem hiding this comment.
Fix spelling typo in the release notes.
Line 32 uses “intermittant”; it should be “intermittent”.
✏️ Suggested fix
-- Fixed intermittant bugs with connection switching in terminal blocks
+- Fixed intermittent bugs with connection switching in terminal blocks📝 Committable suggestion
‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.
| - Fixed intermittant bugs with connection switching in terminal blocks | |
| - Fixed intermittent bugs with connection switching in terminal blocks |
🧰 Tools
🪛 LanguageTool
[grammar] ~32-~32: Ensure spelling is correct
Context: ...er presets Other Changes: - Fixed intermittant bugs with connection switching in termi...
(QB_NEW_EN_ORTHOGRAPHY_ERROR_IDS_1)
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.
In `@docs/docs/releasenotes.mdx` at line 32, Replace the misspelled word
"intermittant" in the release notes sentence "Fixed intermittant bugs with
connection switching in terminal blocks" with the correct spelling
"intermittent" so the line reads "Fixed intermittent bugs with connection
switching in terminal blocks".
| const handleStarClick = async () => { | ||
| RpcApi.RecordTEventCommand( | ||
| TabRpcClient, | ||
| { | ||
| event: "onboarding:githubstar", | ||
| props: { "onboarding:githubstar": "star", "onboarding:page": page }, | ||
| }, | ||
| { noresponse: true } | ||
| ); | ||
| const clientId = ClientModel.getInstance().clientId; | ||
| await RpcApi.SetMetaCommand(TabRpcClient, { | ||
| oref: WOS.makeORef("client", clientId), | ||
| meta: { "onboarding:githubstar": true }, | ||
| }); | ||
| window.open(`https://github.com/wavetermdev/waveterm?ref=${page}`, "_blank"); | ||
| onClose(); | ||
| }; |
There was a problem hiding this comment.
🧩 Analysis chain
🏁 Script executed:
find . -name "onboarding-starask.tsx" -type fRepository: wavetermdev/waveterm
Length of output: 112
🏁 Script executed:
cat -n ./frontend/app/onboarding/onboarding-starask.tsxRepository: wavetermdev/waveterm
Length of output: 5951
Wrap SetMetaCommand calls in try/finally to ensure onClose() always executes.
If SetMetaCommand rejects at lines 27, 45, or 74, the subsequent onClose() calls at lines 32, 49, and 78 will not run, leaving the modal open unintentionally. Ensure these handlers always close the modal regardless of RPC success or failure:
Suggested pattern
const handleMaybeLater = async () => {
RpcApi.RecordTEventCommand(
TabRpcClient,
{
event: "onboarding:githubstar",
props: { "onboarding:githubstar": "later", "onboarding:page": page },
},
{ noresponse: true }
);
- const clientId = ClientModel.getInstance().clientId;
- await RpcApi.SetMetaCommand(TabRpcClient, {
- oref: WOS.makeORef("client", clientId),
- meta: { "onboarding:githubstar": false },
- });
- onClose();
+ try {
+ const clientId = ClientModel.getInstance().clientId;
+ await RpcApi.SetMetaCommand(TabRpcClient, {
+ oref: WOS.makeORef("client", clientId),
+ meta: { "onboarding:githubstar": false },
+ });
+ } finally {
+ onClose();
+ }
};Also applies to handleStarClick and handleAlreadyStarred.
📝 Committable suggestion
‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.
| const handleStarClick = async () => { | |
| RpcApi.RecordTEventCommand( | |
| TabRpcClient, | |
| { | |
| event: "onboarding:githubstar", | |
| props: { "onboarding:githubstar": "star", "onboarding:page": page }, | |
| }, | |
| { noresponse: true } | |
| ); | |
| const clientId = ClientModel.getInstance().clientId; | |
| await RpcApi.SetMetaCommand(TabRpcClient, { | |
| oref: WOS.makeORef("client", clientId), | |
| meta: { "onboarding:githubstar": true }, | |
| }); | |
| window.open(`https://github.com/wavetermdev/waveterm?ref=${page}`, "_blank"); | |
| onClose(); | |
| }; | |
| const handleStarClick = async () => { | |
| RpcApi.RecordTEventCommand( | |
| TabRpcClient, | |
| { | |
| event: "onboarding:githubstar", | |
| props: { "onboarding:githubstar": "star", "onboarding:page": page }, | |
| }, | |
| { noresponse: true } | |
| ); | |
| try { | |
| const clientId = ClientModel.getInstance().clientId; | |
| await RpcApi.SetMetaCommand(TabRpcClient, { | |
| oref: WOS.makeORef("client", clientId), | |
| meta: { "onboarding:githubstar": true }, | |
| }); | |
| } finally { | |
| window.open(`https://github.com/wavetermdev/waveterm?ref=${page}`, "_blank"); | |
| onClose(); | |
| } | |
| }; |
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.
In `@frontend/app/onboarding/onboarding-starask.tsx` around lines 17 - 33, The
handlers handleStarClick and handleAlreadyStarred call RpcApi.SetMetaCommand and
then onClose(), but if SetMetaCommand rejects the modal stays open; wrap the
RpcApi.SetMetaCommand(...) call in a try/finally so onClose() is executed
regardless of success or error. Specifically, in handleStarClick and
handleAlreadyStarred, surround the await RpcApi.SetMetaCommand(TabRpcClient, {
oref: WOS.makeORef("client", ClientModel.getInstance().clientId), meta: {
"onboarding:githubstar": true } }) (and the corresponding meta call in the other
handler) with try { await ... } finally { onClose(); } while leaving the
event-recording and window.open logic as appropriate.
| const handleRepoLinkClick = () => { | ||
| RpcApi.RecordTEventCommand( | ||
| TabRpcClient, | ||
| { | ||
| event: "action:link", | ||
| props: { "action:type": "githubrepo", "onboarding:page": page }, | ||
| }, | ||
| { noresponse: true } | ||
| ); | ||
| window.open("https://github.com/wavetermdev/waveterm", "_blank"); | ||
| }; |
There was a problem hiding this comment.
🧩 Analysis chain
🏁 Script executed:
find . -name "onboarding-starask.tsx" -o -name "*starask*"Repository: wavetermdev/waveterm
Length of output: 112
🏁 Script executed:
wc -l ./frontend/app/onboarding/onboarding-starask.tsxRepository: wavetermdev/waveterm
Length of output: 116
🏁 Script executed:
cat -n ./frontend/app/onboarding/onboarding-starask.tsxRepository: wavetermdev/waveterm
Length of output: 5951
Use a semantic link for the repo target to enable keyboard accessibility.
The <div> element at line 95 with an onClick handler is not keyboard-accessible—it can't be focused with Tab and won't respond to Enter/Space keys. Replace it with an <a> tag:
Accessible alternative
- <div
+ <a
+ href="https://github.com/wavetermdev/waveterm"
+ target="_blank"
+ rel="noopener noreferrer"
className="group flex items-center justify-center gap-2 text-secondary text-sm mt-1 cursor-pointer transition-colors"
onClick={handleRepoLinkClick}
>
<i className="fa-brands fa-github text-foreground text-lg group-hover:text-accent transition-colors" />
<span className="text-foreground font-mono text-sm group-hover:text-accent group-hover:underline transition-colors">
wavetermdev/waveterm
</span>
- </div>
+ </a>🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.
In `@frontend/app/onboarding/onboarding-starask.tsx` around lines 52 - 62, The
clickable repo area uses a non-semantic <div> with handleRepoLinkClick, which is
not keyboard-accessible; replace that <div> with a semantic <a> element that
includes href="https://github.com/wavetermdev/waveterm", target="_blank",
rel="noopener noreferrer" and keeps the onClick handler
(RpcApi.RecordTEventCommand call in handleRepoLinkClick) and an appropriate
aria-label so it is focusable and activates with Enter/Space via native browser
behavior.
No description provided.