* perf(vscode): stop O(N) reactive cascade on every streaming token
The webview DataBridge wrapped the whole session Data shape in a
`createMemo`, whose body walked `store.parts[msg.id]` for every message
in the session family. Any single part mutation — i.e. every token
delta — invalidated the memo, produced a fresh POJO, and invalidated
every downstream consumer (including O(N) scans inside each mounted
SessionTurn). On a 200-message session a Chrome CPU profile showed
three back-to-back 440ms main-thread blocks per SSE batch, ~46% of
the time in Solid reactive runtime alone.
Expose `data` as a plain object with reactive getters over
`session.allMessages`/`allParts`/`allStatusMap` so consumers reading
`data.store.part[Y]` subscribe to only that key. Removes the now-unused
`familyData` helper and its interface/mock entries.
* perf(ui): drop TextShimmer JS timer — CSS-only animation
A createEffect inside TextShimmer ran clearTimeout + setTimeout on every
`active` prop change to gate the sweep animation via a `data-run`
attribute. During LLM token streaming in long sessions, `active` props
(bound to `pending()` / `running()` accessors) thrashed as tools
started/finished across many shimmer instances. CPU profile of a 7s
streaming window showed ~2,500 timer operations — 16% of the blocked
main-thread time.
Remove the effect and drive the animation purely from the `data-active`
attribute. The opacity transition on the shimmer char (220ms) already
handles the fade, so visual behavior is unchanged. Adds one static
regression guard and one runtime perf assertion (with happy-dom) that
toggling the prop 1000 times results in zero timer calls.
* perf(kilo-ui): skip layout reads in GrowBox watch-mode ResizeObserver
The GrowBox component wraps each assistant part and, when watch=true
(which is set on the currently-streaming text part), runs a
ResizeObserver that called body.getBoundingClientRect() via
targetHeight() on every body-size change. During streaming this fires
at ~60Hz and each call forces a synchronous layout. CPU profile of a
7s streaming window showed 1,362 gBCR samples (~9% of blocked
main-thread time) all attributable to this path.
Reuse the browser's pre-measured contentBoxSize / contentRect from the
observer entries — no extra layout read. Also skip sub-pixel updates
(<2px) that the spring absorbs imperceptibly anyway, cutting per-token
spring work when tokens add tiny height deltas.
* perf(ui): coalesce markdown parse to one per animation frame
During LLM token streaming, the Markdown render effect ran
temp.innerHTML = content + morphdom on every content update. SSE
tokens arrive at 60–200Hz and each delta reparsed the entire
accumulated HTML. CPU profile of a 7s streaming window showed 2,940
ParseHTML events totaling ~619ms (~46% of blocked main-thread time).
Queue the latest content in a component-scoped pending variable and
run the morphdom pass inside requestAnimationFrame. K rapid updates
before the frame fires now collapse to one parse. The onCleanup
handler cancels any queued frame so it doesn't touch an unmounted
DOM. Fast-path is preserved untouched so non-streaming first paint
stays synchronous.
* chore(changeset): consolidate streaming-perf changesets into one
Per-commit changesets produced four nearly-identical release-note
entries. The user-visible change is a single perceptual improvement —
streaming is smooth in long sessions — so roll them up into one
feature-oriented entry.
* test(vscode): consolidate streaming perf tests + wire into CI
Replace three synthetic reactivity tests with a single end-to-end
streaming perf benchmark that:
- Renders the real TextShimmer component and asserts zero setTimeout/
clearTimeout calls during a 100-toggle burst (TextShimmer fix).
- Asserts per-key Solid reactivity: 100 text deltas on one message
must re-run only that message's consumer, not O(N) consumers
(DataBridge cascade fix).
- Uses only count-based assertions against deterministic APIs
(setTimeout/clearTimeout/innerHTML setter) — no wall-clock
thresholds, so it doesn't flake under CI load.
Also wire `bun run test:webview-reactivity` into the test-vscode
workflow so the benchmark runs on every PR that touches
packages/kilo-vscode, packages/ui, or packages/kilo-ui. Without this
wiring the perf regression guard would have shipped dormant.
* test(vscode): declare @happy-dom/global-registrator as devDep
The streaming-perf benchmark imports @happy-dom/global-registrator to
get a DOM for mounting the real TextShimmer component. It resolved
locally through workspace hoisting but CI's clean install didn't have
it. Make the dependency explicit.
* test(vscode): import TextShimmer via package export so JSX resolves
Using the deep relative path (../../../ui/src/components/text-shimmer)
made Bun's test transpiler apply kilo-vscode's tsconfig — which has no
`jsxImportSource` — so the .tsx file was compiled with the default
React runtime, producing "React is not defined" in CI.
Resolving through the package export (@opencode-ai/ui/text-shimmer)
picks up packages/ui/tsconfig.json which sets
`jsxImportSource: solid-js`. Works consistently across Linux/macOS/
Windows CI without needing bunfig-level JSX overrides.
* test(vscode): address bot review — add runtime coverage for Markdown + GrowBox, drop empty smoke test
Two kilo-code-bot findings on the streaming perf bench:
1. The 'benchmark completes quickly' smoke test timed an empty block,
so `elapsed` was always near zero and the assertion never fired.
Drop it — the real benchmarks below already complete in ~90ms.
2. The original file installed spy counters for innerHTML writes and
getBoundingClientRect but never asserted against them, leaving
Markdown rAF coalescing and GrowBox layout-read regressions silently
uncaught.
Add two runtime mirrors:
- Markdown rAF pattern: 100 async content updates coalesce to <20 parses
(would be exactly 100 pre-fix).
- GrowBox ResizeObserver pattern: 100 synthetic resize callbacks using
contentBoxSize/contentRect trigger zero getBoundingClientRect calls
(would be exactly 100 pre-fix).
Source-level regression guards in tests/unit/markdown-raf-coalesce.test.ts
and tests/unit/growbox-no-layout-thrash.test.ts cover the actual
component code. The runtime tests here prove the patterns the guards
require actually deliver the perf property at runtime.
Benchmark runs in ~90ms, 5 consecutive local runs all green.
* test(vscode): drop unstable TextShimmer runtime mount from streaming perf bench
The benchmark tried to mount the real @opencode-ai/ui TextShimmer to
assert zero setTimeout/clearTimeout calls. That required Bun's test
runner to transpile text-shimmer.tsx with Solid's JSX runtime, which
depends on tsconfig resolution walking up to packages/ui/tsconfig.json.
In CI (fresh workspace, different node_modules layout) this resolution
was unstable and kept falling back to React JSX ("React is not
defined").
Keep the three runtime patterns that don't need JSX transpilation
(DataBridge cascade, Markdown rAF coalescing, GrowBox contentRect),
plus the source-level regression guard at
tests/unit/textshimmer-no-timer.test.ts which asserts text-shimmer.tsx
contains no setTimeout/clearTimeout/createEffect/data-run. Together
these cover all four fixes without CI flakiness.
5 consecutive local runs pass in ~80ms.
* test(vscode): remove streaming perf tests
Static source-parsing guards and pattern-mirror runtime tests didn't
actually exercise the fixed component code — a regression in the real
code could have left them green. Remove them along with the
test:webview-reactivity script, the workflow step, the
@happy-dom/global-registrator devDep, and the tests/webview-reactivity
directory. The four perf fixes stand on their own; adding dubious
guards was worse than adding none.
* test(vscode): restore static perf-regression guards wired to real source
Restore four guards that each parse the actual fixed component source
and fail loudly if the fix pattern is removed:
- databridge-shape.test.ts reads webview-ui/src/App.tsx, asserts
`data` is not wrapped in createMemo
- textshimmer-no-timer.test.ts reads ui/src/components/text-shimmer.tsx
+ .css, asserts no setTimeout/
clearTimeout/createEffect, animation
gated on data-active
- markdown-raf-coalesce.test.ts reads ui/src/components/markdown.tsx,
asserts the render createEffect uses
requestAnimationFrame + cancelAnimationFrame
- growbox-no-layout-thrash.test.ts reads kilo-ui/src/components/grow-box.tsx,
asserts the ResizeObserver callback
does not call gBCR, uses contentRect/
contentBoxSize, and has the sub-pixel
delta guard
Verified by mutation: each guard fails when its fix pattern is removed
from the real source file and passes again once restored. Runs as part
of the existing test:unit script (no extra CI wiring).
Single $ delimiters in agent responses (e.g. $93K, $307K) were being
interpreted as inline LaTeX math by marked-katex-extension, garbling
dollar amounts. Override the inlineKatex tokenizer to never match and
remove the regex-based single-dollar rendering in renderMathInText.
Display math ($$...$$) is preserved.
* perf(vscode): paginated message loading with virtualized scroll
Reimplement session message loading with cursor-based pagination and
virtual list rendering to reduce initial load time and memory for long
sessions.
* chore: update kilo-vscode visual regression baselines
* fix(vscode): update VscodeSessionTurn props in storybook
* chore: update kilo-vscode visual regression baselines
* perf(vscode): skip reconcile on session switch, lazy part hydration, fast markdown render
Skip SolidJS reconcile() for replace-mode message loads — direct array
assignment avoids expensive O(n) diffing and proxy creation for 80+
messages on every session switch.
Defer part hydration until the virtualizer renders each turn, reducing
reactive store writes by 85% on initial load. Double-rAF scroll
restoration avoids forced layout reflow mid-paint.
Extract markdown fast-path render into packages/ui/src/kilocode/ to
minimize shared file changes.
* fix(vscode): keep lazy part hydration correct in stories
* fix(vscode): resolve state-risk regressions in message pagination
Five correctness issues surfaced during review of the paginated-message-
loading stack, plus the follow-through performance tuning needed to keep
session switching near-instant:
- focus-mode selection re-enters the server for the tail (new "reconcile"
load mode) so SSE drops self-heal on the next session switch instead of
stranding the webview on a stale snapshot. Throttled to 1s to avoid
stacking up fetches on rapid tab switching, and early-outs in the
webview when the server tail matches local state.
- cursor pagination falls back to a client-synthesized `{id,time}` cursor
when a proxy or older binary strips the X-Next-Cursor header, so "load
earlier" keeps working.
- in-flight loadMessages results for a session deleted mid-fetch are
dropped instead of resurrecting a ghost entry in the webview store.
- sub-agent viewer now loads the full transcript via `limit: 0` instead
of silently truncating to MESSAGE_PAGE_LIMIT (it has no "load earlier"
UI to recover from the cap).
- stashed message parts are now cleared on messageRemoved. Extracted the
stash-access helpers into a PartStash class so every lifecycle event
coordinates store + stash cleanup in one place.
Also restores the two-pass markdown rendering intended by PR #7102 — an
upstream merge silently re-added marked-shiki, which made Shiki run
synchronously during parse and froze the main thread for up to 1.3s on
session switches with many code blocks. Code blocks render as plain
<pre><code> first and deferredHighlight() upgrades them after paint.
Regression tests cover all five state risks (fetchMessagePage cursor
fallback, KiloProvider focus reconcile, ghost session on prepend,
sub-agent full load, focus-mode throttle, PartStash leak on
messageRemoved).
* chore(vscode): restore unrelated doc comments in KiloProvider
PR review: the previous fix commit trimmed four unrelated doc comments
(loadMessagesAbort, handleSyncSession JSDoc, "inherit parent directory"
comment, handleDeleteSession JSDoc) to squeeze under the 3350-line
max-lines cap. Restoring them — the cap is hit exactly at 3350 and the
PR surface stays focused on the state-risk fixes.
* chore: update kilo-vscode visual regression baselines
* refactor: simplify pagination helpers without behavior change
- fetchMessagePage: drop the conditional spread for `limit`/`before` — the
server schema accepts `limit: 0` the same as omitted (`z.coerce.number()
.int().min(0).optional()`), so always passing the values directly works.
Inline the `oldest` temp and drop `?? undefined` (`headers.get()` returns
`null | string` which `??` handles identically downstream).
- handleLoadMessages: inline the single-use `focus` boolean, fold the
`mode === "replace"` refresh call into the `if (abort)` block since
they're gated by the same condition.
- sameReconcileShape: destructure `c`/`n` once per iteration instead of
accessing `current[i]!` / `incoming[i]!` three times each.
All 1815 tests pass, typecheck + lint clean.
* docs: clarify intent of helpers flagged in PR review
- commands.ts: comment explains the in-flight dedup pattern and why the
identity check in the `finally` guards against clear-then-restart races.
- sessionsForWorktree: comment notes the oldest-first sort is the canonical
order before applyTabOrder, and why both the worktree label and the tab
bar must agree on "which session is first".
No behavior change — both helpers already did this; now the intent is on
the page for future readers.
* chore: address PR #8911 review feedback from chrarnoldus
- Rewrite changeset as user-facing imperative summary (per AGENTS.md
guidance: changesets appear in release notes; keep concise and feature-
oriented, not implementation details).
- Drop redundant `kilocode_change - new file` marker on
packages/ui/src/kilocode/markdown-fast-path.ts — the kilocode/ directory
already signals the file is a Kilo addition; markers aren't needed in
paths containing "kilocode".
---------
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
* feat(kilo-ui): enhance MCP tool display with input/output sections and improved styling
- Add subtitle and args display to MCP tool triggers for better context
- Separate input and output sections with labels and dividers
- Format input and output as JSON with proper syntax highlighting
- Reposition copy button tooltip to prevent clipping in tool output
- Add styling for MCP section labels and tool dividers
* feat(kilo-ui): i18n for MCP input/output labels
* chore: add changeset
---------
Co-authored-by: Sylwester Liljegren <sylwester.liljegren@softronic.se>
The trailing / in directory paths was visually disappearing in diff
viewer headers because CSS direction:rtl interacted poorly with the
weaker LRE/PDF bidi embedding characters (\u202A/\u202C). Replace with
LRI/PDI isolate characters (\u2066/\u2069) which fully prevent the
surrounding RTL context from reordering boundary characters like /.
* feat(agent-manager): jump to changed line when clicking line number in diff
When clicking a line number in the diff review panel (DiffPanel or
FullScreenDiffView), open the file in the editor at that exact line
instead of always landing on line 1.
Closes#6076
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
* style: fix prettier formatting in AgentManagerApp
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
---------
Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
Introduce new localized strings for git/branch change titles and
diff file list controls (changed, showAll, showLess, more) in 18
language files to support the updated session review UI.
Resolve merge conflicts across e2e tests, UI components, and core
packages. Clean up conflict markers in test specs by adopting the
upstream `project` fixture pattern over the legacy `withProject`
approach. Alphabetically sort package.json dependencies, apply
consistent code formatting across i18n files, flag declarations,
and TSX components. Update internal API calls to use current
signatures (Permission.defaultLayer, MessageV2.parts, Git.run).
Key changes:
- Remove Windows-specific test.skip guards and conflict markers
- Replace deprecated `git` util import with `Git.run` in worktree-family
- Drop unused SDK type import from share-next
- Add lib entries to kilo-gateway and kilo-telemetry tsconfigs
- Regenerate models-snapshot.js and SDK types with reordered events
- Fix SDK openapi.json code sample to reference @kilocode/sdk
- Add onCleanup import to popover component
* feat(agent-manager): add run script feature for worktrees
Add project-specific run script execution with cross-platform support.
Users configure a .kilo/run-script file that runs in any worktree or
the local repo root. Includes play/stop toolbar button with dropdown,
Cmd+E keybinding, run status badges on worktree cards, and VS Code
Task integration for terminal output.
New files in src/agent-manager/run/:
- service.ts: platform-aware script resolution (sh/ps1/cmd/bat)
- manager.ts: process lifecycle state machine (idle/running/stopping)
- controller.ts: orchestrates service, manager, and VS Code task
- task.ts: VS Code ProcessExecution adapter
- message.ts: webview message handler
* fix(vscode): avoid run shortcut in terminals
* tweak: use theme tokens for debug bar surface
* chore: update nix node_modules hashes
* feat(tui): add heap snapshot functionality for TUI and server (#19028)
* ci
* change model for changelog
* release: v1.3.2
* fix(opencode): skip typechecking generated models snapshot (#19018)
* Revert "fix(app): more startup efficiency (#18985)"
This reverts commit 98b3340cee.
* Revert "fix(app): startup efficiency (#18854)"
This reverts commit 546748a461.
* effectify Worktree service (#18679)
* fix: increase operations-per-run to 1000 and pin stale action to v10.2.0
The stale-issues workflow was hitting the default 30 operations limit,
preventing it from processing all 2900+ issues/PRs. Increased to 1000
to handle the full backlog. Also pinned to exact v10.2.0 for reproducibility.
* Add close-issues script and GitHub Action
- Create script/github/close-issues.ts to close stale issues after 60 days
- Add GitHub Action workflow to run daily at 2 AM
- Remove old stale-issues workflow to avoid conflicts
* Fix close-issues workflow permissions
- Add contents: read permission for checkout
- Use github.token instead of secrets.GITHUB_TOKEN
* Process issues sequentially to avoid rate limits
* Change issue close reason from not_planned to completed
* fix(opencode): avoid snapshotting files over 2MB (#19043)
* fix: provide merge context to beta conflict resolver (#19055)
* tweak: only spawn lsp servers for files in current instance (or cwd if instance is global) (#19058)
* fix: beta resolver typecheck + build smoke check (#19060)
* fix: unblock beta conflict recovery (#19068)
* electron: add createDirectory to open directory picker (#19071)
* electron: remove file extension from electron-store wrapper (#19082)
* app: pre-warm project globalSync state when navigate project via keybind (#19088)
* fix(app): move message navigation off cmd+arrow (#18728)
* Reapply "fix(app): startup efficiency (#18854)"
This reverts commit a379eb3867.
* Reapply "fix(app): more startup efficiency (#18985)"
This reverts commit cbe1337f24.
* fix(app): hash inline script for csp
* Revert "fix(app): startup efficiency"
* Reapply "fix(app): startup efficiency"
This reverts commit 898456a25c.
* fix(app): opencode web server url
* chore(app): markdown playground in storyboard
* chore(app): markdown playground in storyboard
* feat(core): initial implementation of syncing (#17814)
* chore: generate
* chore: bump modelcontextprotocol/sdk to 1.27.1 (#19064)
* chore: storybook tweaks
* feat: restore git-backed review modes with effectful git service (#18900)
* chore: generate
* chore: update nix node_modules hashes
* chore: cleanup
* chore: remove dead code for todoread tool (#19128)
* chore: storybook tweaks
* fix(opencode): classify ZlibError from Bun fetch as retryable instead of unknown (#19104)
Co-authored-by: Aiden Cline <63023139+rekram1-node@users.noreply.github.com>
* fix(task): respect agent permission config for todowrite tool (#19125)
* fix(app): agent normalization (#19169)
* fix: Windows e2e stability (CrossSpawnSpawner, snapshot isolation, session race guards) (#19163)
* fix+refactor(mcp): lifecycle tests, cancelPending fix, Effect migration (#19042)
* effectify Bus service: migrate to Effect PubSub + InstanceState (#18579)
* file: use Effect.cached for scan deduplication (#19164)
* ignore: update disavowed list (#19184)
* skill: use Effect.cached for load deduplication (#19165)
* chore: generate
* fix: bump gitlab-ai-provider to 5.3.3 for DWS tool approval support (#19185)
* test: restore 5 workers on Windows e2e (#19188)
* fix(opencode): image paste on Windows Terminal 1.25+ with kitty keyboard (#17674)
* chore: update nix node_modules hashes
* wip: zen
* wip: zen
* go: do not respect disabled zen models
* fix: ensure enterprise url is set properly during auth flow (#19212)
* revert: roll back git-backed review modes (#19295)
* chore: generate
* tui: bypass local SSE event streaming in worker (#19183)
* feat: embed WebUI in binary with proxy flags (#19299)
Co-authored-by: BlankParticle <blankparticle@gmail.com>
* release: v1.3.3
* chore: generate
* changelog ci tweaks
* refactor(lsp): effectify LSP service with InstanceState (#19150)
* chore: generate
* feat: add gpt prompt so non codex gpt models have their own system prompt modeled after codex cli (#19220)
* feat(core): remove workspace server, WorkspaceContext, start work towards better routing (#19316)
* effectify Config service (#19139)
* chore: generate
* refactor(config): use cachedInvalidateWithTTL, bump effect to beta.37 (#19322)
* fix(mcp): close transport on failed/timed-out connections (#19200)
* fix(app): more startup perf (#19288)
* chore: generate
* chore: update nix node_modules hashes
* fix(app): don't bundle fonts (#19329)
* chore: generate
* fix(app): default shell tool to collapsed
* fix(app): remove fork session button
* fix(ui): reduce markdown jank while responses stream (#19304)
* fix: web ui bundle build on windows (#19337)
* refactor(effect): yield services instead of promise facades (#19325)
* chore: generate
* refactor(vcs): replace async git() with ChildProcessSpawner (#19361)
* fix(opencode): ignore generated models snapshot files (#19362)
* fix(ui): keep partial markdown readable while responses stream (#19403)
* chore: update nix node_modules hashes
* fix(app): persist queued followups across project switches (#19421)
* refactor(tool-registry): yield Config/Plugin services, use Effect.forEach (#19363)
* chore: generate
* tui plugins (#19347)
* chore: generate
* effectify Skill service internals (#19364)
* chore: update nix node_modules hashes
* effectify Plugin service internals (#19365)
* refactor(core): split out instance and route through workspaces (#19335)
* chore(app): more spacing controls
* fix(ui): make streamed markdown feel more continuous (#19404)
* fix(app): resize layout viewport when mobile keyboard appears (#15841)
* fix(desktop-electron): match dev dock icon inset on macOS (#19429)
* fix(app): default file tree to closed with minimum width (#19426)
* fix flaky plugin tests (no mock.module for bun) (#19445)
* tweak: add additional overflow error patterns (#19446)
* no theme override in dev (#19456)
* feat: AI SDK v6 support (#18433)
* refactor(session): effectify Session service (#19449)
* refactor(core): move more responsibility to workspace routing (#19455)
* chore: update nix node_modules hashes
* refactor(format): use ChildProcessSpawner instead of Process.spawn (#19457)
* chore: generate
* Single target plugin entrypoints (#19467)
* refactor(session): effectify SessionCompaction service (#19459)
* feat(ci): use Azure Artifact Signing for Windows releases (#15201)
* fix(app): more startup efficiency (#19454)
* update effect to 4.0.0-beta.42 (#19484)
* chore: update nix node_modules hashes
* tweak: adjust bash tool description to increase cache hit rates between projects (#19487)
* refactor(session): move context into prompt footer (#19486)
* refactor(prompt): remove variant cycle display from footer (#19489)
* feat: add model variant selection dialog (#19488)
* fix: restore subagent footer and fix style guide violations (#19491)
* tweak(session): add top spacing and remove obsolete docs prompt
* upgrade opentui to 0.1.91 (#19440)
* refactor(file): use AppFileSystem instead of raw Filesystem (#19458)
* chore: generate
* chore: update nix node_modules hashes
* kv theme before default fallback (#19523)
* feat: open dialog for model variant selection instead of cycling (#19534)
* refactor(session): effectify session processor (#19485)
* feat: dialog variant menu and subagent improvements (#19537)
* use theme color for prompt placeholder (#19535)
* fix: update opencode-gitlab-auth to 2.0.1 (#19552)
* chore: update nix node_modules hashes
* prompt slot (#19563)
* fix: respect semver build identifiers for nix (#11915)
* fix: nix embedded web-ui support (#19561)
* ignore: kill todo (#19566)
* chore: update nix node_modules hashes
* wip: zen
* wip: zen
* zen: ZDR policy
* ci: cancel stale nix-hashes runs (#19571)
* release: v1.3.4
* refactor: kilo compat for v1.3.4
* fix: migration types
* refactor: upgrade kilo-gateway to ai sdk v6
* refactor: improve upstream merge script
* fix: fix some tests
* style(kilo-vscode): adjust indentation and formatting in parts-util and PopupSelector
Normalize boolean expression indentation in isCompletionResult to use
consistent 4-space alignment and reformat PopupSelectorProps generic
interface declaration to split the Omit type across multiple lines.
* docs(kilo-docs): update auto-generated source links
Remove outdated URLs and add new bug report issue link pointing to
anomalyco/opencode repository. Drop references to kilocode bug report
template and config precedence order docs, reducing total unique URLs
from 262 to 261.
* fix(kilo-ui): remove unused NerdFonts story and MONO_NERD_FONTS import
Drop the NerdFonts story from font.stories.tsx along with the unused
MONO_NERD_FONTS import, as the exported constant is no longer available
from the @opencode-ai/ui/font module.
* chore: update visual regression baselines
* fix(opencode): move Show conditional wrapper outside box in home onboarding
Relocate the Show component to wrap the box element instead of being
nested inside it, preventing the empty box from rendering when the
onboarding tip is not visible.
---------
Co-authored-by: Jay V <air@live.ca>
Co-authored-by: opencode-agent[bot] <opencode-agent[bot]@users.noreply.github.com>
Co-authored-by: Dax <mail@thdxr.com>
Co-authored-by: Dax Raad <d@ironbay.co>
Co-authored-by: opencode <opencode@sst.dev>
Co-authored-by: Kit Langton <kit.langton@gmail.com>
Co-authored-by: Adam <2363879+adamdotdevin@users.noreply.github.com>
Co-authored-by: Luke Parker <10430890+Hona@users.noreply.github.com>
Co-authored-by: Aiden Cline <63023139+rekram1-node@users.noreply.github.com>
Co-authored-by: Brendan Allan <brendonovich@outlook.com>
Co-authored-by: Shoubhit Dash <shoubhit2005@gmail.com>
Co-authored-by: James Long <longster@gmail.com>
Co-authored-by: André Cruz <acruz@cloudflare.com>
Co-authored-by: Ariane Emory <97994360+ariane-emory@users.noreply.github.com>
Co-authored-by: Vladimir Glafirov <vglafirov@gitlab.com>
Co-authored-by: Frank <frank@anoma.ly>
Co-authored-by: BlankParticle <blankparticle@gmail.com>
Co-authored-by: Sebastian <hasta84@gmail.com>
Co-authored-by: Burak Yigit Kaya <byk@sentry.io>
Co-authored-by: Caleb Norton <n0603919@outlook.com>
Co-authored-by: Imanol Maiztegui <imanol.mzd@gmail.com>
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>