github / github/copilot-cli

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

Abierto
#3,892 0 comentarios 0 reacciones 0 asignados Ver en GitHub
area:sessions
Lenguaje dominante
Shell
Estrellas
11.2k
Forks
1.9k
Merge medio
14 h 16 min
PR fusionados (30 d)
6

Descripción

### 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).

Guía de contribución

Abrir la guía de contribución

Línea de trabajo

Comienza localizando el código de CLI que crea y lee ~/.copilot/session-state; después, sigue los puntos de entrada del inicio o de las tareas en segundo plano y la enumeración de workspace.yaml. Reproduce el caso de una sesión grande en Windows y verifica que la retención elimine el estado antiguo, que las lecturas de archivos se cierren rápidamente y que la CLI ya no alcance EMFILE con la carga de trabajo indicada.

Escrito por el modelo de indexación a partir del texto del issue.

Evaluación

Stack tecnológico
vscode
Área
cli, operating-systems
Tipo de issue
Error
Dificultad
5/5
Tiempo estimado
Más de una semana
Estado de actividad
Tranquilo
Claridad
Bastante claro
Aptitud para principiantes
35/100

Recibe los nuevos issues en tu correo

Un resumen breve de issues de GitHub para principiantes.