github / github/copilot-sdk

.NET: runtime logs forwarding session.idle, but SDK callback never delivers it

オープン
#2,008 コメント 2 件 リアクション 0 件 担当者 0 名 GitHub で見る
bug waiting on response
主要言語
Java
スター
10.5k
フォーク
1.5k
平均マージ
1日 11時間
マージ済み PR(30日)
128

説明

## Summary

Visual Studio can remain indefinitely in the running state after the Copilot CLI has completed a response.

The CLI verbose log shows that it forwarded the terminal, ephemeral `session.idle` event. The .NET SDK subscription receives the preceding events, including the final `assistant.turn_end`, but never receives `SessionIdleEvent`.

Because `session.idle` is ephemeral, it cannot be recovered later through `GetEventsAsync()`. The client therefore has no authoritative completion signal and continues waiting.

## Environment

- GitHub.Copilot.SDK: `1.0.1`
- Copilot CLI runtime: `1.0.61`
- Windows ARM64
- Visual Studio Agent and Agent (Preview) modes

The current SDK `1.0.7` still does not expose a durable idle wait or event-dispatch flush API.

## Observed behavior

The CLI log ends with:

```text
Forwarding event ... assistant.turn_end
Forwarding event ... session.idle (ephemeral)
```

The .NET subscriber observes `assistant.turn_end`, but not `session.idle`. The operation remains active even though the runtime has finished.

The absence of `session.idle` from `events.jsonl` is expected because the event is ephemeral; it does not explain why the live subscriber missed it.

## Why `assistant.turn_end` is insufficient

In multi-turn tool workflows, an intermediate `assistant.turn_end` can be followed immediately by another `assistant.turn_start`. Completion also needs to account for sub-agents, attached shells, queued messages, and follow-up notification turns.

## Requested fix

Please provide an authoritative completion contract owned by the runtime/SDK, for example:

```csharp
await session.WaitForIdleAsync(cancellationToken);
```

It should:

1. Wait for turns, sub-agents, attached shells, queued work, and follow-up turns to settle.
2. Resolve only when the runtime is fully idle.
3. Ensure preceding session events have crossed the .NET SDK FIFO dispatch queue.
4. Surface session errors and transport failures.
5. Remain correct if the live `session.idle` notification is dropped.
6. Support cancellation without leaving an orphaned waiter.

An equivalent `session.waitForIdle` runtime RPC combined with an SDK dispatch barrier would also work.

## Regression test

Add a .NET test where a multi-turn response completes, the live `session.idle` notification is deliberately dropped, and the completion wait still resolves only after all preceding assistant and tool events have been delivered.

## Related

- #794 - identifies missing `session.idle` and silent notification drops, but its proposed fallback did not ship
- #558 - timeout waiting for `session.idle`
- #791 - serialized FIFO event dispatch in the .NET SDK
- #927 - ephemeral events are intentionally unavailable through replay
- #1275 - `assistant.turn_end` alone is not a completion signal

コントリビューションガイド

コントリビューションガイドを開く

調査の方向性

No specific files are named. Start by tracing the .NET session subscription and FIFO dispatch path, then inspect the proposed session.waitForIdle runtime contract alongside session.idle and GetEventsAsync handling. Done means a regression test shows completion waits for all preceding events, handles dropped idle notifications, surfaces failures, and supports cancellation.

索引モデルが issue の本文から書いたものです。

評価

技術スタック
csharp
領域
api, backend-api-design, distributed-systems
issue の種類
機能追加
難易度
5/5
見積もり時間
1週間以上
活発さ
静か
明瞭さ
おおむね明確
初心者へのやさしさ
42/100

新しい issue をメールで受け取る

初心者向けの GitHub issue を短くまとめたダイジェスト。