feat: switch auto run to per-round retry with resilient resume summary
- 合并 PR #47 的核心改动:自动运行按设定总轮数逐轮执行,单轮失败时按轮重试并输出汇总日志 - 本地补充修复:恢复轮次摘要持久化、修正重试等待期间 stop 收尾、fresh attempt 清理过期 tab/url 运行态 - 影响范围:background auto orchestration、sidepanel auto-run settings and status
This commit is contained in:
+7
-40
@@ -662,8 +662,7 @@ function updateFallbackThreadIntervalInputState() {
|
||||
return;
|
||||
}
|
||||
|
||||
const enabled = inputAutoSkipFailures.checked && getRunCountValue() > 1;
|
||||
inputAutoSkipFailuresThreadIntervalMinutes.disabled = !enabled;
|
||||
inputAutoSkipFailuresThreadIntervalMinutes.disabled = true;
|
||||
}
|
||||
|
||||
function updateAutoDelayInputState() {
|
||||
@@ -834,7 +833,7 @@ function collectSettingsPayload() {
|
||||
inbucketMailbox: inputInbucketMailbox.value.trim(),
|
||||
cloudflareDomain: selectedCloudflareDomain,
|
||||
cloudflareDomains: domains,
|
||||
autoRunSkipFailures: inputAutoSkipFailures.checked,
|
||||
autoRunSkipFailures: true,
|
||||
autoRunFallbackThreadIntervalMinutes: normalizeAutoRunThreadIntervalMinutes(inputAutoSkipFailuresThreadIntervalMinutes.value),
|
||||
autoRunDelayEnabled: inputAutoDelayEnabled.checked,
|
||||
autoRunDelayMinutes: normalizeAutoDelayMinutes(inputAutoDelayMinutes.value),
|
||||
@@ -979,7 +978,7 @@ function applyAutoRunStatus(payload = currentAutoRun) {
|
||||
btnAutoRun.disabled = currentAutoRun.autoRunning;
|
||||
btnFetchEmail.disabled = locked || usesGeneratedAliasMailProvider(selectMailProvider.value);
|
||||
inputEmail.disabled = locked;
|
||||
inputAutoSkipFailures.disabled = scheduled;
|
||||
inputAutoSkipFailures.disabled = true;
|
||||
|
||||
if (currentAutoRun.totalRuns > 0) {
|
||||
inputRunCount.value = String(currentAutoRun.totalRuns);
|
||||
@@ -1079,7 +1078,7 @@ function applySettingsState(state) {
|
||||
inputInbucketMailbox.value = state?.inbucketMailbox || '';
|
||||
renderCloudflareDomainOptions(state?.cloudflareDomain || '');
|
||||
setCloudflareDomainEditMode(false, { clearInput: true });
|
||||
inputAutoSkipFailures.checked = Boolean(state?.autoRunSkipFailures);
|
||||
inputAutoSkipFailures.checked = true;
|
||||
inputAutoSkipFailuresThreadIntervalMinutes.value = String(normalizeAutoRunThreadIntervalMinutes(state?.autoRunFallbackThreadIntervalMinutes));
|
||||
inputAutoDelayEnabled.checked = Boolean(state?.autoRunDelayEnabled);
|
||||
inputAutoDelayMinutes.value = String(normalizeAutoDelayMinutes(state?.autoRunDelayMinutes));
|
||||
@@ -2566,25 +2565,6 @@ btnAutoRun.addEventListener('click', async () => {
|
||||
mode = choice;
|
||||
}
|
||||
|
||||
const autoRunSkipFailures = inputAutoSkipFailures.checked;
|
||||
const fallbackThreadIntervalMinutes = normalizeAutoRunThreadIntervalMinutes(
|
||||
inputAutoSkipFailuresThreadIntervalMinutes.value
|
||||
);
|
||||
inputAutoSkipFailuresThreadIntervalMinutes.value = String(fallbackThreadIntervalMinutes);
|
||||
|
||||
if (
|
||||
shouldWarnAutoRunFallbackRisk(totalRuns, autoRunSkipFailures)
|
||||
&& !isAutoRunFallbackRiskPromptDismissed()
|
||||
) {
|
||||
const result = await openAutoRunFallbackRiskConfirmModal(totalRuns, fallbackThreadIntervalMinutes);
|
||||
if (!result.confirmed) {
|
||||
return;
|
||||
}
|
||||
if (result.dismissPrompt) {
|
||||
setAutoRunFallbackRiskPromptDismissed(true);
|
||||
}
|
||||
}
|
||||
|
||||
btnAutoRun.disabled = true;
|
||||
inputRunCount.disabled = true;
|
||||
const delayEnabled = inputAutoDelayEnabled.checked;
|
||||
@@ -2599,7 +2579,7 @@ btnAutoRun.addEventListener('click', async () => {
|
||||
payload: {
|
||||
totalRuns,
|
||||
delayMinutes,
|
||||
autoRunSkipFailures,
|
||||
autoRunSkipFailures: true,
|
||||
mode,
|
||||
},
|
||||
});
|
||||
@@ -2869,21 +2849,8 @@ inputRunCount.addEventListener('blur', () => {
|
||||
});
|
||||
|
||||
inputAutoSkipFailures.addEventListener('change', async () => {
|
||||
if (inputAutoSkipFailures.checked && !isAutoSkipFailuresPromptDismissed()) {
|
||||
const result = await openAutoSkipFailuresConfirmModal();
|
||||
if (!result.confirmed) {
|
||||
inputAutoSkipFailures.checked = false;
|
||||
updateFallbackThreadIntervalInputState();
|
||||
return;
|
||||
}
|
||||
if (result.dismissPrompt) {
|
||||
setAutoSkipFailuresPromptDismissed(true);
|
||||
}
|
||||
}
|
||||
|
||||
inputAutoSkipFailures.checked = true;
|
||||
updateFallbackThreadIntervalInputState();
|
||||
markSettingsDirty(true);
|
||||
saveSettings({ silent: true }).catch(() => { });
|
||||
});
|
||||
|
||||
inputAutoSkipFailuresThreadIntervalMinutes.addEventListener('input', () => {
|
||||
@@ -3016,7 +2983,7 @@ chrome.runtime.onMessage.addListener((message) => {
|
||||
}
|
||||
}
|
||||
if (message.payload.autoRunSkipFailures !== undefined) {
|
||||
inputAutoSkipFailures.checked = Boolean(message.payload.autoRunSkipFailures);
|
||||
inputAutoSkipFailures.checked = true;
|
||||
updateFallbackThreadIntervalInputState();
|
||||
}
|
||||
if (message.payload.autoRunDelayEnabled !== undefined) {
|
||||
|
||||
Reference in New Issue
Block a user