Skip to content

CCC

v4.8.0 Feature

This release adds 2 notable features for engineering teams evaluating rollout.

✓ No known CVEs patched
Read the diff → Tool health → What is this tool? →

✓ No known CVEs patched in this version

Topics

agents claude claude-code web developer-tools headless
+4 more
kanban llm-tools local-first python

Summary

AI summary

Conversation header adds a pop‑out button and context badge triggers /compact.

Changes in this release

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 openConversationPopout helper 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.composerData key) and the global storage database (under the composer.composerHeaders key) 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 /compact is injected via the existing /api/inject-input path. Same toast feedback as any other inject: "/compact sent" on success, "/compact failed: …" on error. The badge gets a cursor: pointer and a faint hover lift so it reads as an action target; keyboard-accessible via role="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 persistAnnotation upstream — 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 + characterData on 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, called scrollConversationToEnd(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-header before 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 only role + message per line — no per-event timestamp — so _parse_cursor_event returned ts="" for every row, and the browser's render path fell back to nowStamp() (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 without st_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.applicationShouldTerminateAfterLastWindowClosed was hard-coded to true, so any "zero visible windows" moment — closing a popout when the main was minimized or in a transient zero-window state — quit CCC. Changed to false, matching standard full-GUI-app behavior (Safari, Mail, etc.): closing windows leaves the app running, Cmd+Q is the explicit quit path. Added applicationShouldHandleReopen so 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 takes repo_path. Root: + decodes to a space in a URL query string, so /api/sessions?repo_path=/Users/.../BYM+Finie arrived 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 takes repo_path funnels through this validator, so one fix covers them all. Test: test_repo_path_with_plus_resolves_when_query_decoded_to_space creates BYM+Finie/.git and asserts both the exact and the +→space mangled 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: renderSidebar early-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, so markSessionSending's renderSidebar() call was suppressed by the same guard. The sidebar then only refreshed on the next 5s liveStatus tick or later. Fix: renderSidebar accepts a {force: true} option that bypasses the periodic-pause guard (rename and drag guards are still respected); markSessionSending and clearSessionSending use 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 recorded cwd no longer exists (deleted worktrees, moved checkouts). Root cause: _relocate_missing_session_cwd did a full os.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_cache to 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_budget seeds 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

Track CCC

Get notified when new releases ship.

Sign up free

Related context

Earlier breaking changes

  • v5.0.1 Removes horizontal-drag gesture that collapsed conversation pane.

Beta — feedback welcome: [email protected]