JobEvent
Single broadcast frame for the SSE channel. Always has kind, id,
phase, and at (epoch millis); result is only populated on
Finished events; progress is only populated on Progress events.
Kind of work an event refers to. Stays a plain string in the serialized form so the frontend can pattern-match without importing the enum.
Possible values: [source, provider, seriesRefresh, codex]
Lifecycle phase. Started fires after the per-key mutex was
acquired (so a skipped job emits only Finished). Progress
frames fire from inside the work body via
ProgressHandle; they are
not throttled the way DB progress writes are — the broadcast channel
back-pressure handles laggy consumers by dropping intermediate frames.
Possible values: [started, progress, finished]
progress object
- null
- JobProgress
result object
- null
- JobResult
{
"at": 0,
"id": "string",
"kind": "source",
"phase": "started",
"progress": "null",
"result": "null"
}