github / github/copilot-cli

Feature request: emit periodic heartbeat hook events during agent processing

未关闭
#2,701 0 条评论 0 个 reaction 已指派 0 人 在 GitHub 查看
area:plugins
主要语言
Shell
星标
11.2k
派生
1.9k
平均合并
14 小时 16 分钟
30 天内合并 PR
6

描述

## Problem

Tools that integrate with Copilot CLI via the hook system (e.g. [agent-deck](https://github.com/asheshgoplani/agent-deck)) rely on lifecycle events like `UserPromptSubmit` and `Stop` to track whether the agent is actively working. However, there are **no events emitted while the agent is processing** — only a start event and an end event.

For long-running operations (multi-minute responses, complex code generation, large refactors), external tools have no signal that the agent is still alive. They must either:
- Trust the last event indefinitely (risks showing "running" for crashed sessions)
- Use a freshness window and fall back to heuristics (loses accurate status after timeout)

Neither option is great. Agent-deck currently uses a 10-minute freshness window with tmux activity heuristics as a fallback, but this is fragile.

## Proposed Solution

Emit a periodic `Heartbeat` (or `Processing`) hook event every 15-30 seconds while the agent is actively working (between `UserPromptSubmit`/`BeforeAgent` and `Stop`/`AfterAgent`).

The payload would be identical to existing hook events:

```json
{
"hook_event_name": "Heartbeat",
"session_id": "session-uuid-here"
}
```

### Why this works well

- **Zero protocol changes** — same JSON format, same stdin delivery, same hook handler invocation
- **Minimal implementation** — a timer that fires during processing and calls the existing hook dispatch
- **Graceful degradation** — tools that dont recognize `Heartbeat` ignore it (unknown events already map to no-op)
- **Solves the freshness problem** — external tools reset their freshness timer on each heartbeat, keeping accurate status for arbitrarily long operations

### What tools get from this

- Accurate "running" vs "idle" status for long operations
- Reliable detection of crashed/hung sessions (heartbeats stop = session is dead)
- No need for fragile heuristics (tmux pane activity polling, process tree inspection)

## Alternatives Considered

- **Tool-use events** — emitting a hook on each tool invocation (file edit, bash, grep) would also reset freshness, but is more invasive and couples the hook protocol to internal tool execution
- **Longer freshness windows** — what we do today; works but loses accuracy for sessions that genuinely crash during a long operation

## Context

This came up while investigating status tracking gaps in agent-deck, where Copilot sessions would show as "idle" in the TUI even though they were actively processing. The root cause is the silence between start/end events during long operations.

贡献指南

打开贡献指南

调研方向

Start by locating the existing hook-event dispatch and the agent-processing lifecycle around UserPromptSubmit/BeforeAgent and Stop/AfterAgent. Trace how hook payloads are delivered, then add periodic Heartbeat coverage while processing and tests that verify emission during work and cessation after completion.

由索引模型根据 Issue 内容生成。

评估

技术栈
shell
领域
cli
Issue 类型
功能
难度
4/5
预计耗时
3-5 天
活跃度
冷清
描述清晰度
基本清楚
新手友好度
48/100

把新 issue 发到你的邮箱

精选适合新手参与的 GitHub issue 摘要。