mirror of
https://github.com/QwenLM/qwen-code.git
synced 2026-08-09 16:56:27 +00:00
* feat(core): emit liveness heartbeats for silent foreground shell commands Silent foreground commands previously produced no events between spawn and settle, so ACP gateways and stream-json consumers could not tell a long-running command from a dead session. The shell tool now emits a structured ShellProgressData through the existing updateOutput channel whenever no display update has fired for tools.shell.heartbeatIntervalMs (default 10s, 0 disables). Heartbeats carry liveness stats only - never command output - and never enter model context. Consumers: the ACP session forwards heartbeats as meta-only tool_call_update frames (gated so a tick racing the settle path cannot regress status after completion) and records heartbeat span attributes; stream-json forwards them as tool_progress events behind includePartialMessages; the TUI scheduler, React hook, and subagent runtime ignore them so live output views are not replaced by stats objects. * docs(design): add silent command heartbeat design doc * fix(acp): keep tool_call_update heartbeats from breaking in-repo consumers Codex review of the heartbeat change found that in-repo ACP consumers did not tolerate the new meta-only in_progress frames. A full sweep of tool_call_update consumers found three that mishandled them, each now guarded with a regression test: - The desktop agent converted every tool_call_update into a terminal tool_result, so the first heartbeat would prematurely complete the command with an empty result. It now skips in_progress updates. - DaemonChannelBridge requires kind on tool_call_update and flagged the kind-less heartbeat as a malformed-protocol error every interval. It now drops kind-less in_progress frames silently. - The web-shell daemon UI normalizer derived the tool block title from _meta.toolName, overwriting the human-readable title on every heartbeat. It now drops heartbeat frames outright. The remaining consumers (VS Code companion, acp-bridge compaction, session export, daemon TUI adapter) merge updates conditionally and are heartbeat-safe without changes. * fix(core): address PR review — heartbeat monotonic gate, guard scope, telemetry Review round 1 on #6876 (yiliang114, wenshao, chiga0, qwen3.7-max): - shell.ts: the silent-idle gate now uses the monotonic performance.now() clock (via lastOutputPerfTime, falling back to spawn time) instead of the Date.now()-based lastUpdateTime, so an NTP step can neither skew the payload nor misfire a heartbeat — matching the design doc's monotonic commitment. It also keys off actual output arrival rather than the throttled display update. - session-tracing.ts: endToolExecutionSpan now applies caller-supplied attributes BEFORE the canonical keys (duration_ms, success, error) so a passthrough attribute can never mask the span's own outcome fields. - desktop qwen-agent.ts: the in_progress drop guard is now scoped to frames carrying _meta.shellProgress, matching the daemon bridge and web-shell normalizer guards, so a future non-heartbeat in_progress frame is not silently swallowed. - Tests: the desktop regression test now pins result==='done' (previously it stayed green even with the guard removed); added a Session.test assertion that heartbeat counts reach the tool-execution span attributes. * fix(acp): align desktop heartbeat guard with normalizer; test kind pass-through Review round 2 on #6876 (qwen3.7-max via ci-bot): - The desktop qwen-agent in_progress drop guard was broader than the web-shell normalizer's: it dropped any in_progress + shellProgress frame regardless of kind, while the normalizer only drops kind-less ones. The comment claimed they matched. Added the kind-absent check so the desktop guard matches the normalizer exactly — a kind-bearing frame now passes through on both platforms (heartbeats emitted by the ACP session never carry a kind, so real behavior is unchanged). - Added pass-through tests on both sides (daemonUi + desktop) asserting an in_progress frame WITH a kind normalizes to a tool.update / tool_result rather than being dropped, so the load-bearing kind-absent condition is no longer only exercised on the drop path. * fix(channels): scope daemon bridge heartbeat drop to shellProgress frames Review round 3 on #6876 (qwen3.7-max via ci-bot): the DaemonChannelBridge heartbeat guard lived in the shared tool_call / tool_call_update case and dropped ANY kind-less in_progress frame, so a genuinely malformed kind-less tool_call (status in_progress, no shellProgress) was silently swallowed instead of reaching emitProtocolError. Gate the drop on _meta.shellProgress — matching the qwen-agent and web-shell normalizer guards — so real heartbeats are still dropped while malformed frames are flagged. Added a regression test for the malformed path. |
||
|---|---|---|
| .. | ||
| adaptive-output-token-escalation | ||
| auth | ||
| auto-memory | ||
| channels | ||
| compact-mode | ||
| compaction-image-stripping | ||
| ctrl-o-detail-expand | ||
| customize-banner-area | ||
| daemon-acp-http | ||
| daemon-session-artifacts | ||
| daemon-sidechannel-coordination | ||
| daemon-transport-abstraction | ||
| fork-subagent | ||
| hot-reload | ||
| performance | ||
| prompt-cache | ||
| prompt-suggestion | ||
| rt-optimization | ||
| session-crash-recovery | ||
| session-idle-reaper | ||
| session-recap | ||
| session-title | ||
| skill-nudge | ||
| slash-command | ||
| standalone-clipboard-native-addon/assets | ||
| structured-output | ||
| tool-use-summary | ||
| virtual-viewport | ||
| 2026-05-15-async-memory-recall-design.md | ||
| 2026-05-21-memory-pressure-monitor-design.md | ||
| 2026-05-26-daemon-logger-design.md | ||
| 2026-05-27-daemon-workspace-service-design.md | ||
| 2026-06-12-session-shell-permission-policy.md | ||
| 2026-06-13-file-history-snapshot-persistence.md | ||
| 2026-06-15-simulated-sed-file-history.md | ||
| 2026-06-23-fix-conflicts-command.md | ||
| 2026-06-24-daemon-clientid-self-heal-design.md | ||
| 2026-06-24-stream-inactivity-timeout-design.md | ||
| 2026-06-30-unified-reasoning-effort-cli.md | ||
| 2026-07-01-channel-lifecycle-status-adapters.md | ||
| 2026-07-01-channel-lifecycle-status-umbrella.md | ||
| 2026-07-01-channel-p0-identity-task-lifecycle-design.md | ||
| 2026-07-05-large-frame-handling-measurement.md | ||
| 2026-07-06-session-start-profiler.md | ||
| 2026-07-07-bounded-replay-snapshot-window.md | ||
| 2026-07-09-webshell-user-message-input-annotations.md | ||
| 2026-07-11-daemon-persistent-workspace-registration.md | ||
| 2026-07-11-daemon-workspace-runtime-removal.md | ||
| 2026-07-11-managed-memory-microcompaction.md | ||
| 2026-07-13-workspace-skills-installed-path.md | ||
| 2026-07-14-silent-command-heartbeat.md | ||
| auto-compaction-threshold-redesign.md | ||
| chat-recording-failure-observability.md | ||
| custom-api-key-auth-wizard-prd.md | ||
| daemon-channel-runtime-control.md | ||
| daemon-extension-at-mention.md | ||
| daemon-extension-install-interactions.md | ||
| daemon-idle-detection-api.md | ||
| daemon-multi-workspace-phase1-registry.md | ||
| daemon-multi-workspace-phase2a-sessions.md | ||
| daemon-multi-workspace-phase4-acp.md | ||
| daemon-multi-workspace-phase4b-channel-workers.md | ||
| daemon-multi-workspace-phase4b-voice.md | ||
| daemon-multi-workspace-session-export.md | ||
| daemon-multi-workspace-session-file-ops.md | ||
| daemon-multi-workspace-session-organization-mutations.md | ||
| daemon-session-runtime-status.md | ||
| daemon-skill-toggle.md | ||
| daemon-untrusted-workspace-session-catalog.md | ||
| daemon-workspace-remember.md | ||
| declarative-agents-port.md | ||
| extension-file-reload.md | ||
| extension-management-v2.md | ||
| f2-mcp-transport-pool.md | ||
| issue-4479-token-usage-stats-coordination.md | ||
| markdown-syntax-extension.md | ||
| openrouter-auth-and-models.md | ||
| prompt-queue-backpressure.md | ||
| serve-server-final-split.md | ||
| serve-server-split.md | ||
| session-group-custom-hex-colors.md | ||
| skill-required-capabilities.md | ||
| standalone-clipboard-native-addon.md | ||
| telemetry-llm-request-timing-design.md | ||
| telemetry-outbound-propagation-design.md | ||
| telemetry-resource-attributes-design.md | ||
| telemetry-subagent-spans-design.md | ||
| tui-spacing-density-pr1.md | ||
| tui-user-message-half-line-pr2.md | ||
| untrusted-persisted-transcript.md | ||
| web-shell-session-created-callback.md | ||
| web-shell-table-selection-statistics.md | ||
| webshell-composer-placeholders.md | ||
| webshell-mention-icon-chips.md | ||
| workflow-tracing-gaps.md | ||
| worktree.md | ||
| yaml-parser-replacement.md | ||