fix: recover expired task leases and persist diagnostic logs

This commit is contained in:
薇星幻海
2026-10-18 02:30:56 +08:00
parent 1b497286dc
commit ef35b461f7
15 changed files with 1368 additions and 85 deletions
+30 -2
View File
@@ -34,7 +34,7 @@ async function main() {
window.qaPanel = YianAssistantPanel.create({
onTaskAction: action => qaCalls.actions.push(action),
onLearningSetting: (key, value) => qaCalls.settings.push([key, JSON.parse(JSON.stringify(value))]),
onLogAction: action => qaCalls.logs.push(action),
onLogAction: (action, value) => qaCalls.logs.push(value === undefined ? action : [action, value]),
onSearch: (query, settings) => qaCalls.search.push({ query, settings }),
onAutoChange: value => qaCalls.auto.push(value),
onCopyChange: value => qaCalls.copy.push(value),
@@ -236,6 +236,26 @@ async function main() {
await host.getByRole('button', { name: '复制日志', exact: true }).click();
await host.getByRole('button', { name: '清空显示', exact: true }).click();
assert.deepEqual(await page.evaluate(() => qaCalls.logs), ['copy', 'clear']);
const diagnosticSwitch = host.getByRole('switch', { name: '持续记录诊断日志', exact: true });
assert(await diagnosticSwitch.isChecked(), '持久诊断记录默认开启');
await diagnosticSwitch.uncheck();
assert.deepEqual(await page.evaluate(() => qaCalls.logs.at(-1)), ['record', false]);
await page.evaluate(() => qaPanel.setState({ diagnostics: { enabled: false, total: 37, dropped: 2, pending: 1, storage: 'userscript' } }));
assert((await host.getByTestId('diagnostic-status').textContent()).includes('已停止新增记录'));
assert((await host.getByTestId('diagnostic-status').textContent()).includes('已记录 37 条'));
await tab('bank').click(); await tab('console').click();
assert.equal(await diagnosticSwitch.isChecked(), false, '切栏保留日志开关');
for (const [name, action] of [['导出诊断 JSON', 'exportJson'], ['导出诊断 TXT', 'exportText'], ['清空已保存诊断', 'clearSaved']]) {
await host.getByRole('button', { name, exact: true }).click();
assert.equal(await page.evaluate(() => qaCalls.logs.at(-1)), action);
}
await page.evaluate(() => qaPanel.setState({ diagnostics: { storageError: '模拟配额不足' } }));
assert((await host.getByTestId('diagnostic-status').textContent()).includes('可先导出当前记录'));
assert.equal(await diagnosticSwitch.isChecked(), false, '部分诊断状态更新保留关闭值');
await diagnosticSwitch.check();
assert.deepEqual(await page.evaluate(() => qaCalls.logs.at(-1)), ['record', true]);
await page.evaluate(() => qaPanel.setState({ diagnostics: { enabled: true, storageError: '', pending: 0 } }));
await diagnosticSwitch.scrollIntoViewIfNeeded(); await screenshot('05-desktop-diagnostics.png');
await page.evaluate(() => qaPanel.setState({ learning: { logs: Array.from({ length: 510 }, (_, index) => ({ time: '10:00:00', level: 'info', message: '任务状态 ' + index })) } }));
await host.getByRole('combobox', { name: '日志级别' }).selectOption('all');
assert.equal(await host.locator('.log-entry').count(), 500);
@@ -245,7 +265,12 @@ async function main() {
assert.equal(await host.getByTestId('global-pause').textContent(), '继续全部');
await host.getByTestId('global-pause').click();
assert.equal(await page.evaluate(() => qaCalls.actions.at(-1)), 'resume');
console.log('PASS filtered/capped logs and shared global pause/resume');
await page.evaluate(() => qaPanel.setState({ learning: { status: 'running', waiting: 0, leaseWaiting: 1, video: { status: 'waitingLease' }, tasks: [{ id: 'lease1', type: 'exam', title: '等待中的考试', status: 'waitingLease' }] } }));
assert((await host.getByTestId('learning-status').textContent()).includes('1 项等待执行权'));
assert(!(await host.getByTestId('learning-status').textContent()).includes('等待人工'));
await tab('overview').click();
assert((await pane('overview').textContent()).includes('等待执行权(自动重试)'));
console.log('PASS filtered/capped runtime logs, persisted diagnostics controls/export/clear and shared global pause/resume; lease waits are distinct from manual waits');
await tab('overview').click();
await page.evaluate(() => qaPanel.setState({ position: { left: 100, top: 20 }, learning: { logs: [], status: 'running' } }));
@@ -264,6 +289,9 @@ async function main() {
await control.scrollIntoViewIfNeeded(); assert(await control.isVisible()); assert(await control.isChecked());
}
await screenshot('03b-mobile-playback-switches.png');
await tab('console').click(); await diagnosticSwitch.scrollIntoViewIfNeeded();
assert(await diagnosticSwitch.isVisible()); assert(await diagnosticSwitch.isChecked());
await screenshot('06-mobile-diagnostics.png');
await tab('exam').click(); await incompleteSwitch.scrollIntoViewIfNeeded();
assert(await incompleteSwitch.isVisible()); assert(await incompleteSwitch.isChecked());
await screenshot('03a-mobile-incomplete-switch-on.png');