✨ feat(conversation): queue follow-up sends during running CC turns#14179
Conversation
…Plan A) Without this, a send fired while a Claude Code turn was running would spawn a second `claude` process in parallel. Now CC participates in the same soft-queue path that Client mode already uses: follow-ups are queued and auto-drained into a fresh sendMessage once the current turn completes. "Send now" remains a manual stop + send — no new UI, minimum architectural diff vs. the persistent-stdin Plan B. Refs LOBE-7346. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
|
The latest updates on your projects. Learn more about Vercel for GitHub.
|
…lter Replace inline `op.type === 'execAgentRuntime' || 'execHeterogeneousAgent'` with the `AI_RUNTIME_OPERATION_TYPES` constant already used by cancelOperation, loading-state selectors, and the plugin slice. Picks up `execServerAgentRuntime` (Gateway) for free — same parallel-run risk as CC, now also queued. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: 28edb7fdf4
ℹ️ About Codex in GitHub
Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".
Codecov Report❌ Patch coverage is Additional details and impacted files@@ Coverage Diff @@
## canary #14179 +/- ##
==========================================
- Coverage 67.85% 67.84% -0.01%
==========================================
Files 2227 2227
Lines 191305 191342 +37
Branches 23732 19147 -4585
==========================================
+ Hits 129810 129822 +12
- Misses 61366 61391 +25
Partials 129 129
Flags with carried forward coverage won't be shown. Click here to find out more.
🚀 New features to boost your workflow:
|
The drain previously fired from inside onComplete on a fixed setTimeout(100), racing with the post-sendPrompt updateTopicMetadata write that persists adapter.sessionId as topic.metadata.heteroSessionId. On the very first queued follow-up for a topic the metadata write could lose, leaving resolveHeteroResume to start a fresh CLI session instead of resuming and breaking turn-to-turn continuity. Move the drain to run after `await updateTopicMetadata(...)`, so the next sendMessage observes the just-finished session id. Drain still gated on "not aborted, no terminal error" — manual stop preserves the queue. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
…hile typing Two changes for the queue UX: 1. QueueTray: per-row "Send now" icon between Edit and Delete. Clicking it cancels the current AI runtime op for the context, removes that item from the queue, and immediately fires sendMessage with its payload. Remaining queue items stay in place — the new turn's drain picks them up after it finishes. 2. ChatInput Stop button: previously flipped to Send the moment the composer had any text during loading (`isInputLoading && isInputEmpty`), which read as "agent finished" and made queued sends look like fresh sends. Now Stop stays up for the whole loading window. Enter still enqueues; the QueueTray Send-now icon is the explicit cancel+send escape hatch. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
# 🚀 LobeHub v2.1.53 (20260427) **Release Date:** April 27, 2026 **Since v2.1.52:** 194 merged PRs · 17 contributors > Introduce Heterogeneous Agent — Claude Code and Codex run as first-class desktop runtimes, paired with a new Agent Signal package, sharper desktop UX, and a wave of flagship model additions. --- ## ✨ Highlights - **Introduce Heterogeneous Agent** — Claude Code and Codex run as first-class desktop agents: subagent rendering, partial-message streaming, multi-turn resume, terminal error surfacing, rich tool inspectors, and runtime polish. (#14162, #13754, #14067, #14001, #13970, #13942) - **Screen capture & Quick Chat tray** — New desktop screen capture overlay (macOS permission-gated) with Quick Chat tray and upload pipeline improvements; chat input auto-focuses on overlay mount. (#13818, #14097, #14105) - **Desktop topic & tab UX** — Dedicated topic popup window with cross-window sync, Cmd+W/Cmd+T tab shortcuts, TabBar polish, recent working directories expanded to 20, and human approval notifications. (#13957, #13983, #13972, #14036, #14092) - **Git workflow built-in** — One-click pull/push from the branch chip, ahead/behind badge, and submodule/worktree repo detection. (#14041, #13980, #13978) - **Agent Signal package** — New `@lobechat/agent-signal` runtime for dynamic memory feedback signals, with OTel metrics and self-iteration in Lab. (#14157, #14170, #14159, #14169, #14187) - **New models** — Claude Opus 4.7 with `xhigh` effort tier, GPT-5.5, DeepSeek V4 Flash/Pro with reasoning slider, Kimi K2.6, MiMo-V2.5/Pro, gpt-image-2, Qwen3.6 Flash/Plus, and Pixverse-c1. (#13903, #14147, #14114, #14004, #14089, #14039, #13923) - **New providers** — OpenCode Zen, OpenCode Go, and Azure OpenAI Router runtime. (#13943, #14064, #13823) - **Mobile settings overhaul** — Full settings menu and responsive profile layout for mobile. (#14019) --- ## 🏗️ Heterogeneous Agent - Claude Code runtime, working-directory awareness, and sidebar polish. (#13970) - CC subagent rendering with persistent streamed text; parallel-tool orphan fix. (#14001, #13968, #14024) - Per-step usage persisted to each step assistant message. (#13964) - Per-phase workflow expand defaults; full-expand toggle with three-level expansion. (#14171, #13906) - Hetero-mode actions bar; tool inspector polish. (#13963, #14034, #14030) - Codex desktop integration with rich tool rendering and devtools preview. (#14067, #14100) - Codex terminal error surfacing and CLI output tracing. (#14166) - Tighten `isCanUseVision` default and add aggregator fallback. (#14172) - Persist `ccSessionId` in topic metadata for CC multi-turn resume. (#13902) - CC account card, topic filter, and integration polish. (#13955, #13942, #13950) - Token-level deltas streamed via `--include-partial-messages`. (#13929) --- ## 🧠 Agent Signal & Self-Iteration - New `@lobechat/agent-signal` package with dynamic feedback signals. (#14157) - AgentSignalRuntime wired through agent-tracing and observability-otel metrics. (#14170, #14159) - Self-iteration feature flag added to Lab; front-side flag check. (#14169, #14186) - Signal policy for receiving memory feedback dynamically. (#14187) --- ## 💬 Conversation - Queue follow-up sends during running CC turns. (#14179) - Persist per-topic chat scroll position; pin user message + fold long messages. (#14191, #14056) - Inline resend when editing last user message. (#14080) - Disable first-block markdown streaming to prevent flicker. (#14193, #13904) - Prevent Markdown stream replay when vlist remounts streaming items. (#14086) - Stop repinning after manual scroll; unify scroll-to-user + spacer hooks. (#14099, #14132) --- ## 📱 Platforms & Integrations ### Desktop / Electron - Screen capture overlay, Quick Chat tray, and upload pipeline improvements. (#13818) - macOS permission gate for screen capture; auto-focus chat panel input. (#14097, #14105) - Dedicated topic popup window with cross-window sync. (#13957) - TabBar polish: `+` button for new topic, dark theme blend, close icon by default. (#13972, #14203, #13973) - Recent working directories expanded from 5 to 20; submodule/worktree repo detection. (#14036, #13978) - Cmd+W / Cmd+T tab shortcuts and global shortcut consolidation. (#13983, #13880) - Linux icon configuration; human approval desktop notifications. (#14042, #14092) ### Git Workflow - One-click pull/push from branch chip; ahead/behind badge with refactored GitCtr. (#14041, #13980) ### Mobile - Full settings menu and responsive profile layout. (#14019) - Agent route added to mobile router; mobile agent topic route registered. (#14103, #14158) - Session list skeleton row layout corrected. (#14040) ### Bot / Messaging - DM strategy support; bot emoji and markdown render optimization. (#14201, #14091, #14140) - Slack webhook fix; bot platform setup guide reference. (#14052, #14121) --- ## 🤖 Models & Providers ### New models - **Claude Opus 4.7** with `xhigh` effort tier; strip temperature/top_p. (#13903, #13909) - **GPT-5.5**. (#14147) - **DeepSeek V4** Flash/Pro cards with reasoning slider; cache-hit and Pro discount pricing. (#14114, #14209, #14196, #14131) - **Kimi K2.6** model with LobeHub-hosted card. (#14004, #14006) - **MiMo-V2.5 / V2.5-Pro**. (#14089) - **gpt-image-2**, **Qwen3.6 Flash/Plus**, **Pixverse-c1**. (#14039, #13923) ### New providers - **OpenCode Zen** and **OpenCode Go** with env-var support. (#13943, #14064) - **Azure OpenAI Router** runtime support. (#13823) - Model alias mapping for image and video runtimes. (#13896) - Seedance video models migrated to Dreamina. (#14144) ### Runtime reliability - Sanitize invalid tool_call arguments to unbreak strict providers. (#14033) - Tolerate null `function.name` in streaming tool_call deltas. (#14139) - Preserve Gemini 3 `thoughtSignature` in `call_tools_batch` normalization. (#14032) - Downgrade `image_url` parts when target model lacks vision. (#14029) - Preserve Cloudflare provider error context. (#14136) - Use `safety_identifier` for OpenAI Responses API. (#14148) - Unwrap underlying PG error in `formatErrorEventData`. (#14038) --- ## 🖥️ User Experience - **Onboarding** — Preset agent naming suggestions, structured hunk ops for `updateDocument`, persona analytics snapshot, footer promotion pipeline, wrap-up button. (#13931, #13989, #13930, #13853, #13934) - **Document workflow** — Agent documents promoted as primary workspace panel; history management and compare workflow; web-crawl docs associated with agent documents. (#13924, #13725, #13893) - **cmdk** — Agent identity surfaced on topic search results; topic/message search scoped to current agent. (#14204, #13960) - **Floating chat panel** and workspace improvements. (#13887) - **Topic completion status** with dropdown action and filter. (#14005) --- ## 🔧 Tooling - Redis-backed feature flag provider for runtime config. (#14098) - Vite upgraded to 8.0.0 with Rolldown strict execution order. (#12720, #14058) - `@lobechat/model-bank` automated npm release with provenance. (#14015, #14017, #14018) - Skill activation fallback when `activateTools` cannot find identifier. (#14010) - Cron tool: timezone and existing jobs injected into system prompt; clarified `lobe-gtd` and `lobe-cron` descriptions. (#14012, #14013) --- ## 🔒 Security & Reliability - **Security:** uuid bumped to v14 (advisory). (#14083) - **Security:** validate avatar URL and scope old-avatar deletion to owner. (#13982) - **Security:** clear OIDC sessions on better-auth signout; return 401 (not 500) for expired OIDC JWT. (#13916, #14014) - **Reliability:** scope pending-approval check to current assistant turn. (#14182) - **Reliability:** sanitize heterogeneous-agent attachment cache filenames. (#13937) - **Reliability:** reduce subagent task status error noise. (#14026) --- ## 👥 Contributors Huge thanks to **17 contributors** who shipped **194 merged PRs** this week. @hardy · @shaun0927 · @hezhijie0327 · @sxjeru · @arvinxx · @Innei · @tjx666 · @lijian · @neko · @rdmclin2 · @AmAzing129 · @sudongyuer · @CanisMinor · @rivertwilight Plus @lobehubbot and renovate[bot] for maintenance. --- **Full Changelog**: v2.1.52...v2.1.53
💻 Change Type
🔗 Related Issue
fix LOBE-7346.
🔀 Description of Change
Without this, a
sendMessagefired while a Claude Code (execHeterogeneousAgent) turn was still running would skip the queue entirely and spawn a secondclaudeprocess in parallel. The existing message-queue infra (enqueueMessage/drainQueuedMessages/mergeQueuedMessages/QueueTray) only covered Client mode (execAgentRuntime).This PR mirrors the Client-mode behaviour for CC, taking the Plan A route from the issue (frontend queue) instead of the persistent-stdin Plan B. Architectural diff is intentionally minimal — no new IPC, no process-model change, no UI surface added.
Two touch-points:
conversationLifecycle.ts— broaden the queue-check filter so a runningexecHeterogeneousAgentop also routes follow-up sends intoenqueueMessage(interruptMode: 'soft') instead of starting a parallel CC run.heterogeneousAgentExecutor.ts— at the end ofonComplete(success path only, mirrorsstreamingExecutor.ts), drain the queue, force-complete the just-finished op + mark unread, thensetTimeout(100)→useChatStore.getState().sendMessage(...)with the merged content. The next CC turn picks up--resumevia the topic-metadataheteroSessionIdthat the previous run already wrote.On "send now" (cancel + send): kept as the existing manual gesture — click Stop (cancels the op, leaves the queue intact), then Send. Adding a "send now" UI button is out of scope; the queue still shows pending items via
QueueTrayso the user can edit/delete with the existing controls.On error / cancel: drain only fires on success. On error or manual stop the queue is preserved so messages aren't silently lost.
🧪 How to Test
Local Electron verification (Claude Code agent, real
claudeCLI):op.type === 'execHeterogeneousAgent'isrunning.chat.queuedMessages[<contextKey>]withinterruptMode: 'soft'.pgrep -af claudeshows only one process — no parallel spawn.sendMessageop + newexecHeterogeneousAgentop appear, queue clears, follow-up gets a real CC reply.cancelled, queue stays empty) → send a fresh prompt → starts cleanly with no leftover queue items.Unit tests added/extended:
conversationLifecycle.test.ts— new case:execHeterogeneousAgentinrunningstatus causes follow-up sends toenqueueMessagewithinterruptMode: 'soft'.heterogeneousAgentExecutor.test.ts— mock store extended withdrainQueuedMessages/markUnreadCompleted/operations/sendMessageso executor's new drain branch doesn't trip on undefined methods in existing tests.bun run type-checkis clean (only the pre-existing.next/dev/types/validator.tsissue remains).📝 Additional Information
Plan B (persistent stdin in same
claudeprocess, in-tool-loop interrupts viacontrol_request) is deferred — see LOBE-7360 for the design notes. This PR is the smaller, lower-risk drop that already removes the parallel-process foot-gun and makesQueueTrayactually useful for CC.