github / github/copilot-cli

Copilot CLI never prunes ~/.copilot/session-state, causing EMFILE / file-descriptor exhaustion (crashes VS Code Copilot Chat)

オープン
#3,892 コメント 0 件 リアクション 0 件 担当者 0 名 GitHub で見る
area:sessions
主要言語
Shell
スター
11.2k
フォーク
1.9k
平均マージ
14時間 16分
マージ済み PR(30日)
6

説明

### Summary

The Copilot CLI creates a `~/.copilot/session-state//` folder for **every** session — including background automations, heartbeats, and memory-consolidation runs — and **never prunes them**. On a heavily-used machine these accumulate into the thousands. A Copilot component then bulk-opens `session-state/*/workspace.yaml`, exhausting the process's file-descriptor table (libuv's ~8189 limit on Windows) and throwing `EMFILE: too many open files`. In VS Code this makes Copilot Chat hang on "working" and crash after a few turns.

This is the root cause behind microsoft/vscode#313799 — that's where it *manifests*, but the fix belongs here.

### Evidence (Windows, measured with Sysinternals `handle.exe`)

- `~/.copilot/session-state` contained **10,313 `workspace.yaml` files**, accumulated since 2026-02-18, never pruned.
- The Copilot `node.mojom.NodeService` utility process peaked at **~8,788 open handles** — right at the libuv fd ceiling — then dropped back to ~580 after the burst (which is why point-in-time snapshots look normal).
- In a single mid-spike handle dump, **3,256 of 3,352 (97%) File-handle paths were `session-state\...\workspace.yaml`**.
- Reducing the folder count to ~67 **immediately** resolved the EMFILE crashes.

### Two underlying issues

1. **No retention/cleanup (primary):** session-state folders grow unbounded — no age or count cap, no garbage collection.
2. **Unbounded fan-out open:** the code that reads `workspace.yaml` across sessions opens them without bounding concurrent file descriptors or closing promptly, so a large directory exhausts the fd table instead of degrading gracefully.

### Suggested fixes

- Add automatic retention (e.g., prune session-state older than N days, or cap to the M most-recent) on CLI startup and/or via a background task.
- Bound concurrency and ensure prompt handle closure when enumerating session metadata.
- Optionally consolidate session metadata into a single index/DB rather than one folder + file per session.

### Workaround

Periodically prune `~/.copilot/session-state` (e.g., a scheduled task that deletes folders older than ~14 days).

### Environment

Windows; GitHub Copilot CLI + VS Code Copilot Chat (stable).

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

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

調査の方向性

Start by locating the CLI code that creates and reads ~/.copilot/session-state, then trace startup or background-task entry points and the workspace.yaml enumeration. Reproduce the large-session case on Windows and verify that retention removes old state, file reads close promptly, and the CLI no longer reaches EMFILE under the reported workload.

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

評価

技術スタック
vscode
領域
cli, operating-systems
issue の種類
バグ
難易度
5/5
見積もり時間
1週間以上
活発さ
静か
明瞭さ
おおむね明確
初心者へのやさしさ
35/100

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

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