Standard workspace window, persistent threads, and interaction fixes - #11
Merged
Conversation
…fficiencies - Convert hitTest point into flipped view space so idle Miku is clickable - Gate composer on an explicit agent run lifecycle; detect completion via the PTY foreground process group with a startup grace so a never-launching agent cannot lock the composer; show RUNNING/SENT on prompt cards - Accept multi-line prompts; keep rejecting control/escape bytes - Release composer focus when terminal focus is requested; restore on hide - Frame-gate PTY output flushes to ~60Hz with a lossless final drain - Memoize scrollback presentation so per-flush snapshot cost is O(visible) - Flag output discontinuity when the pending queue drops a chunk - Coalesce same-style runs and cache fonts/attributes in attributed text - Reuse Metal CGContext/texture; reallocate only on layout change - Reset scroll only on page change; propagate cursor backing scale; derive cursor cell height from real font metrics - Gate rim breathing animation on Reduce Motion; remove redundant tap-to-focus Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
- Content, header, composer, embedded terminal, and right resize handles now respect the speech-bubble tail inset so the Send button sits fully inside the bubble and stays clickable - Replace harsh cyan hairlines with tone-shift seams and gradient surfaces; elevated composer card with top highlight; teal gradient send button with hover/pressed/disabled states; quieter pills; soft top-edge glow rim Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
A borderless NSPanel with becomesKeyOnlyIfNeeded never becomes key from clicks and never activates its app, so once another app was frontmost every click, focus change, and cursor update in the open workspace was dead. Presented state now clears becomesKeyOnlyIfNeeded and re-activates the app on the first click into the workspace; idle keeps the non-activating overlay behavior. Verified against the live app with synthetic HID clicks: inactive-state click revives key/active status in the same click. Also let the provider/approval pills size to content instead of clipping inside a fixed 182pt column. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
- Workspace is now a titled, resizable, fullscreen-capable NSWindow with native traffic lights over the bubble header; red button and Cmd-W return to idle, never quit; transparent outside the bubble and Miku rail - Guard the Miku close target against stale replayed events that closed the workspace immediately after opening; hit area limited to the artwork - Codex Desktop-style composer: bright elevated card, multi-line prompt, provider/approval chips and circular send inside the card; working menus replace the deprecated borderless style; vector provider marks (Anthropic starburst, OpenAI-style knot) - Sessions sidebar (threads): per-session terminal + agent transcript via WorkspaceSessionStore; create and switch sessions like codex-desktop - Centered welcome block; removed glow shadows that banded into rings over the transparent window Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
- Threads survive app restarts: metadata index + per-thread terminal snapshot under ~/Library/Application Support/MikuCode/sessions/, restored at launch with selection; shells start lazily (selected thread only) - Each thread has its own working directory; the PTY spawns there and the path shows abbreviated in the sidebar and thread header - Centered new-thread pane when no thread is selected: folder chooser (NSOpenPanel) plus primary create button; sidebar + reuses the last folder or asks first - Store persists on create/select/transcript change/stop/termination Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
- Codex Desktop-style context row above the composer: working-folder chip (click to change via folder panel; live shell cd when idle), Local badge, and git branch read from .git/HEAD (worktrees supported) - Thread working directory is changeable after creation and persists - New thread button under the centered welcome copy - TERMINAL labelled divider when the embedded terminal opens - Flat design pass: radii 18/14/10 -> 10/8/6, gradient surfaces -> flat solids, capsules -> 6pt rounded rectangles, unified 1px white dividers, removed breathing rim, inner highlights, and decorative glows Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
- Context menu on sidebar rows: inline rename (Enter commits, Esc cancels, blank reverts to the prompt-derived title) and delete with confirmation - Deleting stops the shell, removes the thread's persisted terminal snapshot, reselects a neighboring thread, and persists; custom titles round-trip through index.json (optional field, old indexes still load) Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
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
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
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.
Summary
Test plan
🤖 Generated with Claude Code
https://claude.ai/code/session_015peMZyaHEmxDzyzNyhYeR5