Skip to main content

Session Recording

Record and replay agent sessions in Asciicast v2 format.

Recording

let engine = RecordingEngine()

// Start recording a session
try engine.startRecording(sessionId: "s1")

// Feed terminal data as it arrives
engine.recordData(data, forSession: "s1")

// Stop and get the recording file
let url = try engine.stopRecording(sessionId: "s1")
// → ~/Library/Application Support/AgentsBoard/recordings/s1-<timestamp>.cast

Asciicast v2 Format

Each recording is a JSONL file:

{"version": 2, "width": 120, "height": 40, "timestamp": 1710000000}
[0.5, "o", "$ claude --model opus\r\n"]
[1.2, "o", "Claude Code is ready.\r\n"]
[3.0, "i", "fix the auth bug\r\n"]

Metadata

public struct RecordingMetadata: Codable {
let sessionId: String
let provider: String?
let model: String?
let project: String?
let startTime: Date
var endTime: Date?
var totalCost: Decimal?
let terminalWidth: Int
let terminalHeight: Int
}

Playback

The PlaybackView provides a full playback interface:

  • Variable speed (0.5x, 1x, 2x, 4x)
  • Timeline with seek
  • Event markers for key moments
  • Recording browser for past sessions

File Management

engine.listRecordings()           // List all recordings
engine.deleteRecording(at: url) // Delete a recording
engine.isRecording(sessionId:) // Check if session is being recorded