fix(supervisor): resume legacy changed-source reviews

This commit is contained in:
mesalogo
2026-10-09 20:25:48 +08:00
parent dc582b7acf
commit 8f1b600798
2 changed files with 14 additions and 1 deletions
@@ -50,6 +50,19 @@ it.each(['zh-CN', 'en-US'] as const)('retains operational failure details and re
expect(screen.getByRole('button', { name: copy.reviewSettings.resume })).toBeEnabled() expect(screen.getByRole('button', { name: copy.reviewSettings.resume })).toBeEnabled()
}) })
it('allows continuing a legacy source-change failure', async () => {
const copy = i18nResources['zh-CN'].heartbeat
const resume = vi.fn().mockResolvedValue(undefined)
vi.stubGlobal('goodbuddy', { supervision: { activity: vi.fn().mockResolvedValue([{
...row, status: 'failed', supervisionStatus: 'failed',
error: 'Review source changed or was removed',
reviewProgress: { runId: 'saved-run', batches: 1, characters: 1000, sources: 2, remainingSources: 1, restartRequired: true, complete: false }
}]), resume } })
render(<SupervisorActivity active projects={[]} onOpenResult={vi.fn()} />)
fireEvent.click(await screen.findByRole('button', { name: copy.reviewSettings.resume }))
await waitFor(() => expect(resume).toHaveBeenCalledWith({ runId: 'saved-run' }))
})
it('shows durable progress, pauses and continues the same run, and expands retained facts', async () => { it('shows durable progress, pauses and continues the same run, and expands retained facts', async () => {
const progress = { runId: 'saved-run', batches: 1, characters: 1000, sources: 2, remainingSources: 1, complete: false } const progress = { runId: 'saved-run', batches: 1, characters: 1000, sources: 2, remainingSources: 1, complete: false }
const activity = vi.fn().mockResolvedValue([{ ...row, reviewProgress: progress }]) const activity = vi.fn().mockResolvedValue([{ ...row, reviewProgress: progress }])
+1 -1
View File
@@ -186,7 +186,7 @@ export function SupervisorActivity({ active, projects, onOpenResult, configId, c
<button type="button" className="secondary-button" disabled={!!pending || !!stoppingKind} onClick={() => void control(row, 'pause')}>{t('reviewSettings.pause')}</button> <button type="button" className="secondary-button" disabled={!!pending || !!stoppingKind} onClick={() => void control(row, 'pause')}>{t('reviewSettings.pause')}</button>
<button type="button" className="danger-ghost" disabled={!!pending || !!stoppingKind} onClick={() => void control(row, 'cancel')}>{t('reviewSettings.cancel')}</button> <button type="button" className="danger-ghost" disabled={!!pending || !!stoppingKind} onClick={() => void control(row, 'cancel')}>{t('reviewSettings.cancel')}</button>
</>} </>}
{!stoppingKind && !row.reviewProgress.complete && !row.reviewProgress.restartRequired && (row.supervisionStatus === 'paused' || row.supervisionStatus === 'failed') && <button type="button" className="secondary-button" disabled={!!pending || execution.active} onClick={() => void control(row, 'resume')}>{t(row.reviewProgress.phase === 'summarizing' ? 'activity.resumeMerge' : row.reviewProgress.phase === 'saving' ? 'activity.resumeSave' : 'reviewSettings.resume')}</button>} {!stoppingKind && !row.reviewProgress.complete && (row.supervisionStatus === 'paused' || row.supervisionStatus === 'failed') && <button type="button" className="secondary-button" disabled={!!pending || execution.active} onClick={() => void control(row, 'resume')}>{t(row.reviewProgress.phase === 'summarizing' ? 'activity.resumeMerge' : row.reviewProgress.phase === 'saving' ? 'activity.resumeSave' : 'reviewSettings.resume')}</button>}
<button type="button" className="secondary-button" aria-expanded={expanded === row.id} aria-controls={`batches-${row.id}`} onClick={() => setExpanded(expanded === row.id ? undefined : row.id)}>{t('reviewSettings.facts')}</button> <button type="button" className="secondary-button" aria-expanded={expanded === row.id} aria-controls={`batches-${row.id}`} onClick={() => setExpanded(expanded === row.id ? undefined : row.id)}>{t('reviewSettings.facts')}</button>
</div> </div>
</>} </>}