Skip to content

Session file corrupted: raw U+2028/U+2029 in events.jsonl breaks JSON.parse() on /resume #2012

@stimitoak

Description

@stimitoak

Bug

/resume fails with SyntaxError: Unterminated string in JSON when events.jsonl contains raw Unicode Line Separator (U+2028) or Paragraph Separator (U+2029) characters.

Root Cause

JavaScript's JSON.parse() treats U+2028 and U+2029 as line terminators inside strings, making them invalid in unescaped form. Python's JSON parser handles them fine, so the file appears valid to external tooling — making the bug hard to diagnose.

When terminal output containing U+2028 (e.g., from commands that include certain Unicode text) is captured into the session, the raw codepoint gets written into the JSONL event record without escaping.

Reproduction

  1. Exit the session
  2. Attempt /resume <session-id>
  3. Observe: Error: Session file is corrupted (line N: SyntaxError: Unterminated string in JSON at position X)

Workaround

Manually escape the characters in the session file:

path = '~/.copilot/session-state/<session-id>/events.jsonl'
with open(path) as f:
    content = f.read()
fixed = content.replace('\u2028', '\\u2028').replace('\u2029', '\\u2029')
with open(path, 'w') as f:
    f.write(fixed)

Expected Behavior

The session writer should escape U+2028 and U+2029 as \u2028/\u2029 when serializing event data to events.jsonl, so the file remains valid for JSON.parse().

Environment

  • macOS (Darwin)
  • Copilot CLI v1.0.4
  • Session hit this bug twice in one day from different command outputs

Metadata

Metadata

Assignees

No one assigned

    Labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions