This release adds 2 notable features for engineering teams evaluating rollout.
✓ No known CVEs patched in this version
Topics
+4 more
Summary
AI summaryConversation header adds a pop‑out button and context badge triggers /compact.
Changes in this release
| Type | Severity | Summary | CVE |
|---|---|---|---|
| Feature | Low |
Adds pop‑out button in conversation header for windowed view. Adds pop‑out button in conversation header for windowed view. Source: llm_adapter@2026-06-07 Confidence: high |
— |
| Feature | Low |
Adds automatic Cursor IDE integration for CCC‑spawned CLI/agent sessions. Adds automatic Cursor IDE integration for CCC‑spawned CLI/agent sessions. Source: llm_adapter@2026-06-07 Confidence: high |
— |
| Feature | Low |
Makes context-% badge a one‑click shortcut to /compact command. Makes context-% badge a one‑click shortcut to /compact command. Source: llm_adapter@2026-06-07 Confidence: high |
— |
| Performance | Medium |
Improves performance of /api/sessions endpoint for repos with many missing session cwd entries. Improves performance of /api/sessions endpoint for repos with many missing session cwd entries. Source: llm_adapter@2026-06-07 Confidence: high |
— |
| Bugfix | High |
Prevents macOS app termination when closing conversation pop‑out windows. Prevents macOS app termination when closing conversation pop‑out windows. Source: llm_adapter@2026-06-07 Confidence: high |
— |
| Bugfix | Medium |
Fixes scrolling regression caused by MutationObserver on sticky header. Fixes scrolling regression caused by MutationObserver on sticky header. Source: llm_adapter@2026-06-07 Confidence: high |
— |
| Bugfix | Medium |
Fixes cursor event timestamps showing "just now" by interpolating approximate times. Fixes cursor event timestamps showing "just now" by interpolating approximate times. Source: llm_adapter@2026-06-07 Confidence: high |
— |
| Bugfix | Medium |
Ensures all Cursor agent sessions appear in the IDE sidebar by backfilling missing storage folders. Ensures all Cursor agent sessions appear in the IDE sidebar by backfilling missing storage folders. Source: llm_adapter@2026-06-07 Confidence: high |
— |
| Bugfix | Medium |
Resolves 400 errors when repo_path contains '+' characters. Resolves 400 errors when repo_path contains '+' characters. Source: llm_adapter@2026-06-07 Confidence: high |
— |
| Bugfix | Medium |
Updates sidebar "● Sending…" pill to light up immediately on send. Updates sidebar "● Sending…" pill to light up immediately on send. Source: llm_adapter@2026-06-07 Confidence: high |
— |
| Refactor | Low |
Changes "Session is asking a question" surface from modal overlay to inline sticky card. Changes "Session is asking a question" surface from modal overlay to inline sticky card. Source: granite4.1:30b@2026-06-07-audit Confidence: low |
— |
Full changelog
Added
- Conversation header now carries a pop-out button (next to the size badge) for users who would rather click than drag. Tap it and the active pane's conversation opens in its own window — native CCC window when running inside the macOS app, browser popup otherwise — reusing the same
openConversationPopouthelper that already powers the drag-out-of-window gesture. The button is delegated at the document level so it survives every breadcrumb rewrite, and it's hidden inside the pop-out itself (no point popping a popout). Keyboard accessible with a visible focus ring. - Added automatic Cursor IDE integration for all CCC-spawned and resumed Cursor CLI/agent sessions. Spawned sessions are registered in both the Cursor IDE's local workspace SQLite database (under the
composer.composerDatakey) and the global storage database (under thecomposer.composerHeaderskey) on macOS, Windows, and Linux, making them appear natively in the Cursor IDE's sidebar and composer history. - The context-% badge on each conversation row is now a one-click shortcut to
/compact. Click the percentage (e.g. "82%") and CCC asks "Context is at 82%. Compact now? (Sends /compact to the session.)" — confirm and/compactis injected via the existing/api/inject-inputpath. Same toast feedback as any other inject: "/compact sent" on success, "/compact failed: …" on error. The badge gets acursor: pointerand a faint hover lift so it reads as an action target; keyboard-accessible viarole="button"+ Enter/Space. Clicking the badge does not also open the conversation — it's excluded from the row-click handler.
Changed
- "Add to UX fixes queue" in the annotation editor now closes the modal immediately on click instead of leaving it open while the API call is in flight. The annotation is already persisted via
persistAnnotationupstream — closing early is safe — and feedback (success or failure) arrives as a toast a moment later. Failure toasts surface the underlying error message ("UX fixes queue failed: …") so the user knows whether to retry. Same treatment for the in-page editor and the screen-capture editor. - The "Session is asking a question" surface is no longer a body-level modal overlay — it now renders as an inline card mounted inside the active conversation view, pinned to the bottom via
position: sticky. Inheriting the conv pane's font stack means the question header, prompt, options, and "Other / type your own" input all match the surrounding conversation typography instead of the previous modal-specific font. Same answer flow (single-pick / multi-pick / free-text → POST/api/answer-question) and the "Answer in terminal" escape hatch are preserved; only the surface changed. The card tears down the same way the modal did — on successful submit, when the session stops asking, or when the user navigates to a different conversation.
Fixed
- Scrolling down in a conversation no longer fails to make progress while the "Earlier ask" top box blinks. Root: the conv view's pin-to-bottom MutationObserver watched
childList + subtree + characterDataon the entire view — which includes the in-view.conv-sticky-header. Every scroll tick, the dynamic-ask tracker rewrites the earlier-ask slot's text to mirror whichever user message is just above the threshold; the observer treated that text rewrite as new content and, when the user was anywhere near the bottom, calledscrollConversationToEnd(view)— instantly snapping the scroll back. The visible symptom: scroll input was consumed but the position didn't move, and the top box flashed text as the tracker fought the scroll. Fix: filter mutations whose target lives inside.conv-sticky-headerbefore deciding to auto-scroll; only actual conversation-content mutations re-trigger the pin-to-bottom behavior. - Cursor conversation events no longer all show "just now". Root: cursor transcripts (
~/.cursor/projects/<slug>/agent-transcripts/<sid>/<sid>.jsonl) record onlyrole+messageper line — no per-event timestamp — so_parse_cursor_eventreturnedts=""for every row, and the browser's render path fell back tonowStamp()(the current wall-clock time). Every event therefore claimed it had just happened, regardless of whether it was 5 minutes or 8 hours old. Since cursor's transcripts are streamed append-only, we approximate per-event time by linearly interpolating between the JSONL's birthtime (first event) and mtime (last event). Distinct, monotonic, honest-about-being-approximate — better than fabricated "now"s. Falls back to mtime-everywhere when birthtime isn't available (Linux withoutst_birthtime). - Closing a conversation pop-out window (or the main window momentarily) in the macOS app no longer terminates the entire app and tears down every other window plus the bundled server. Root:
AppDelegate.applicationShouldTerminateAfterLastWindowClosedwas hard-coded totrue, so any "zero visible windows" moment — closing a popout when the main was minimized or in a transient zero-window state — quit CCC. Changed tofalse, matching standard full-GUI-app behavior (Safari, Mail, etc.): closing windows leaves the app running, Cmd+Q is the explicit quit path. AddedapplicationShouldHandleReopenso a dock-click re-shows the main window when the user has closed everything. DMG users get this only via a Sparkle release (per docs/RELEASING.md —scripts/macapp/changes need a versioned DMG); curl / brew users get the JS/CSS side automatically on next./run.sh. - Fixed an issue where some Cursor agent sessions (including manually discovered ones, and ones spawned in directories not yet opened in the IDE) were missing from the Cursor IDE sidebar. The system now automatically creates missing workspace storage folders and backfills all discovered transcripts.
- Repo paths containing
+(e.g./Users/.../BYM+Finie) no longer 400 from every API endpoint that takesrepo_path. Root:+decodes to a space in a URL query string, so/api/sessions?repo_path=/Users/.../BYM+Finiearrived at the server as/Users/.../BYM Finie, which matched no real directory and bounced. Fix:resolve_repo_path()now treats the as-given path as the primary attempt; if it doesn't resolve, the helper tries+/space swap variants of the input and accepts exactly one match against the known-repos registry or a real on-disk repo. Ambiguous matches (multiple variants exist) raise an explicit error instead of guessing. Every endpoint that takesrepo_pathfunnels through this validator, so one fix covers them all. Test:test_repo_path_with_plus_resolves_when_query_decoded_to_spacecreatesBYM+Finie/.gitand asserts both the exact and the+→spacemangled form resolve. - The "● Sending…" pill in the sidebar conversation row now lights up the instant the user hits Send instead of waiting up to a poller cycle. Root:
renderSidebarearly-returned whenever focus was in a textarea — a guard meant to keep background pollers from yanking the list around while the user types in the conv input or search box. But hitting Enter to send a message also leaves focus in the textarea, somarkSessionSending'srenderSidebar()call was suppressed by the same guard. The sidebar then only refreshed on the next 5sliveStatustick or later. Fix:renderSidebaraccepts a{force: true}option that bypasses the periodic-pause guard (rename and drag guards are still respected);markSessionSendingandclearSessionSendinguse it so user-initiated state changes paint synchronously. GET /api/sessions?repo_path=<heavy-repo>no longer times out on repos with many sessions whose recordedcwdno longer exists (deleted worktrees, moved checkouts). Root cause:_relocate_missing_session_cwddid a fullos.walk(up to 8000 dirs per root, ~4 roots) every time a session's recorded cwd was missing, and the cache lived only in memory — so every server restart re-paid the full cost. On a worktree-heavy repo (BYM+Finie, 128 missing cwds) this added up to ~40s per cold scan, beyond curl's 15s default and beyond any reasonable UI patience. Fixes: (1) persist_session_cwd_relocation_cacheto disk (~/.claude/command-center/cwd-relocation-cache.json, schema-versioned, lazily revalidated on read so a restored worktree gets re-resolved); (2) per-request time budget for relocation walks (env:CCC_CWD_RELOCATION_BUDGET_S, default 1.5s) that short-circuits remaining missing-cwd resolutions to None for the rest of the request — uncached so the next call can resume; (3) per-root visit cap dialed from 8000 → 2000 (env:CCC_CWD_RELOCATION_VISIT_CAP). Result on BYM+Finie: 49s → 7.3s on the truest-cold first scan, then 1.6s on every subsequent scan as the cache fills. Test:test_find_conversations_honors_relocation_budgetseeds 200 sessions all pointing at a deleted cwd, sets the budget to 0.5s, and asserts the scan returns within 3s.
Weekly OSS security release digest.
The CVE patches and breaking changes that affected production tools this week. One email, every Sunday.
No spam, unsubscribe anytime.
Share this release
About CCC
All releases →Related context
Related tools
Earlier breaking changes
- v5.0.1 Removes horizontal-drag gesture that collapsed conversation pane.
Beta — feedback welcome: [email protected]