You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Kilo Console briefly tears down the active terminal and replaces the changes panel with a loading state when project snapshots refresh after worktree changes or resize-related PTY updates. The console also logs a warning when it receives sync events in the newer syncEvent envelope instead of the legacy name shape.
Implementation
Terminal frames are already keyed by stable PTY identity in the outer list, so the inner Show no longer uses the freshly allocated query object as a keyed boundary. That keeps the existing Ghostty instance mounted while snapshot data refreshes. The changes panel now only renders its loading placeholder before the first diff result exists, preserving the prior diff during background refreshes. The route event parser also accepts both legacy name and newer syncEvent.type sync events, treating unknown envelopes as non-actionable instead of throwing.
Screenshots / Video
N/A - behavior-only flicker fix; no visual redesign.
How to Test
Manual/local verification
Agent: bun run typecheck from packages/kilo-console/
Agent: bun test src from packages/kilo-console/
Agent: bun turbo typecheck passed via the normal pre-push hook
Reviewer test steps
Start a local backend with bun dev serve --port 4096 --hostname 127.0.0.1 --cors http://127.0.0.1:3017 from the repo root.
Start the console with bun run dev from packages/kilo-console/.
Open a project with an active terminal, then edit a file in the selected worktree or resize the browser window.
Confirm the terminal remains visible and the changes panel keeps the previous diff visible while refreshes complete.
Blocked checks and substitute verification
None.
Checklist
Issue linked above, or exception explained
Tests/verification described
Screenshots/video included for visual changes, or marked N/A
Changeset considered for user-facing changes
I personally reviewed the diff and can explain the changes, including any AI-assisted work.
Show keying removal (ProjectConsoleRoute.tsx:705) — Removing keyed prevents GhosttyTerminal from being torn down and re-mounted when the input() memo changes value (e.g. on snapshot refresh). The inner render function receives target as a SolidJS accessor, so target() at line 716 correctly dereferences it when constructing the Query prop. Since the terminal is already de-duplicated by stable PTY key in the outer For, removing the keyed boundary is the right call.
Diff loading guard (ProjectConsoleRoute.tsx:757) — diffs.loading && !diffs() correctly suppresses the "Loading diff…" placeholder during background refreshes (when previous data already exists), while still showing it on the initial load when no data is present yet. The downstream "No changes detected" check at line 763 already guards with !diffs.loading, so neither placeholder flashes during a refresh.
eventType hardening (ProjectConsoleRoute.tsx:91-98) — Gracefully handles both legacy name and newer syncEvent.type sync envelope shapes, and treats unknown/missing envelopes as a no-op ("") rather than propagating undefined. The as cast is an acceptable escape hatch for an opaque external payload.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Issue
No linked issue.
Context
Kilo Console briefly tears down the active terminal and replaces the changes panel with a loading state when project snapshots refresh after worktree changes or resize-related PTY updates. The console also logs a warning when it receives sync events in the newer
syncEventenvelope instead of the legacynameshape.Implementation
Terminal frames are already keyed by stable PTY identity in the outer list, so the inner
Showno longer uses the freshly allocated query object as a keyed boundary. That keeps the existing Ghostty instance mounted while snapshot data refreshes. The changes panel now only renders its loading placeholder before the first diff result exists, preserving the prior diff during background refreshes. The route event parser also accepts both legacynameand newersyncEvent.typesync events, treating unknown envelopes as non-actionable instead of throwing.Screenshots / Video
N/A - behavior-only flicker fix; no visual redesign.
How to Test
Manual/local verification
bun run typecheckfrompackages/kilo-console/bun test srcfrompackages/kilo-console/bun turbo typecheckpassed via the normal pre-push hookReviewer test steps
bun dev serve --port 4096 --hostname 127.0.0.1 --cors http://127.0.0.1:3017from the repo root.bun run devfrompackages/kilo-console/.Blocked checks and substitute verification
Checklist