(runId)
| 29 | } |
| 30 | |
| 31 | function getRun(runId) { |
| 32 | const runs = buildRuns(); |
| 33 | const run = runs.find((entry) => entry.runId === runId); |
| 34 | if (!run) return null; |
| 35 | const paths = getObserverPaths(); |
| 36 | const events = readJsonl(paths.eventsPath).map(redactValue).filter((e) => belongsToRun(e, runId)); |
| 37 | const assetCalls = readJsonl(paths.assetCallLogPath).map(redactValue).filter((e) => belongsToRun(e, runId)); |
| 38 | const pipelineEvents = readPipelineEvents().filter((e) => belongsToRun(e, runId)); |
| 39 | const detail = buildRunDetail(runId); |
| 40 | return { |
| 41 | ...run, |
| 42 | detail, |
| 43 | phases: buildPhases(run, pipelineEvents, events, assetCalls), |
| 44 | evidence: events, |
| 45 | assets: assetCalls, |
| 46 | pipelineEvents, |
| 47 | }; |
| 48 | } |
| 49 | |
| 50 | function buildRunDetail(runId) { |
| 51 | const paths = getObserverPaths(); |
nothing calls this directly
no test coverage detected