github / github/copilot-cli

Session resume fails when tool.execution_complete writes raw multiline content into events.jsonl

Abierto
#2,649 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

## Bug

Resuming a session can fail with:

```text
Failed to resume session: Error: Session file is corrupted
(line 1086: SyntaxError: Unterminated string in JSON at position 8038 (line 1 column 8039))
```

## Environment

- Copilot CLI version: 1.0.24
- OS: Linux
- Session ID affected: `46cb26fd-2fc9-4737-954a-1419bea933ff`

## Root cause

This was **not random file corruption**. The session's `events.jsonl` contained `tool.execution_complete` events that were written with **literal newline characters inside `result.content`**, so a single JSON object was split across multiple physical JSONL lines.

Two corrupted spans were present:

- lines `1086-1088`
- lines `1577-1579`

Both spans reconstructed cleanly into valid single `tool.execution_complete` events when the intermediate line breaks were replaced with escaped `\\n` and the combined string was parsed as JSON.

The affected events contained fetched page content beginning with:

- `Contents of https://www.anthropic.com/pricing:`

So the failure mode appears to be tied to persisted tool output that contains raw multiline content.

## Why this breaks resume

`events.jsonl` expects **one complete JSON object per line**. Once a writer emits literal newlines inside a JSON string value, the JSONL reader later tries to parse the first physical line as a complete JSON object and fails with `Unterminated string in JSON`.

## Evidence

The Copilot CLI log reported:

```text
Failed to parse session 46cb26fd-2fc9-4737-954a-1419bea933ff:
Failed to read JSONL from ~/.copilot/session-state/46cb26fd-2fc9-4737-954a-1419bea933ff/events.jsonl:
Invalid event at line 1086: SyntaxError: Unterminated string in JSON at position 8038
Event: {"type":"tool.execution_complete", ...}
```

External validation showed:

- line `1086` alone is invalid JSON
- line `1086 + "\\n" + 1087 + "\\n" + 1088` parses successfully as a single `tool.execution_complete` event
- same pattern for lines `1577-1579`

## Expected behavior

Session event writing should always escape embedded newlines inside string values so each event stays on one physical JSONL line.

## Suggested fix

1. **Fix on write**: ensure event serialization for `tool.execution_complete` always goes through normal JSON string escaping before appending to `events.jsonl`
2. **Defense on read**: consider a repair path for malformed JSONL where a line looks like the start of an event and subsequent lines can be safely rejoined
3. **Better error message**: include the event type and a hint that multiline tool output may have split a JSONL record

## Related issues

This looks related to the broader session-corruption family, but it appears distinct from the existing U+2028/U+2029 reports because the bad file here is caused by **raw literal newlines in tool output**, not line-separator Unicode characters.

Guía de contribución

Abrir la guía de contribución

Línea de trabajo

Localiza el escritor de eventos que añade contenido a events.jsonl y el lector JSONL utilizado al reanudar sesiones; inspecciona cómo se serializa tool.execution_complete result.content. Reproduce el fallo con una salida de herramienta multilínea y, después, verifica que cada evento siga ocupando una sola línea física y que la sesión afectada pueda reanudarse correctamente.

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

Evaluación

Stack tecnológico
shell
Área
cli, tooling
Tipo de issue
Error
Dificultad
4/5
Tiempo estimado
3-5 días
Estado de actividad
Tranquilo
Claridad
Bastante claro
Aptitud para principiantes
45/100

Recibe los nuevos issues en tu correo

Un resumen breve de issues de GitHub para principiantes.