跳转至

[ISSUE-0039] 任务控制按钮失败无反馈

自查发现(错误传播家族扫描)。 与 [[0036-create-task-toast-ok-but-not-listed|0036-创建任务-toast成功但任务未入列表]] 同源 — 用户主动操作的 sendMessage 静默吞错。

现象(潜在)

用户点任务的: - 暂停 / 继续 - 停止 - 删除 - 重命名

任一操作,如果 background task-control handler throw(如 batch 内部错误、storage 配额满),task-view.tsx:control() 的:

// v0.10.57 之前 ❌
const control = (taskId: string, action: string, payload?: any) => {
  browser.runtime
    .sendMessage({ type: 'task-control', taskId, action, payload })
    .catch(() => {});  // ❌ 吞错 — 用户毫不知情
};

用户看到的现象:点了按钮没反应,但 UI 状态可能已乐观更新(如 chip 变"已暂停")→ UI 与实际后台状态不一致

与 ISSUE-0036 同根

ISSUE 同款位置
0036 createTask sendMessage .catch(() => {})
0039 task-control sendMessage .catch(() => {})

统一模式:用户主动操作的 sendMessage 必须给用户失败反馈。

修复

1. 前端 control() 加 then + catch 反馈

const control = (taskId: string, action: string, payload?: any) => {
  const actionLabel: Record<string, string> = {
    pause: '暂停', resume: '继续', stop: '停止', delete: '删除', rename: '重命名',
  };
  const label = actionLabel[action] || action;
  browser.runtime
    .sendMessage({ type: 'task-control', taskId, action, payload })
    .then((r: any) => {
      if (r && r.success === false) {
        notice.error(`${label}失败:${r.message || '未知错误'}`);
      }
    })
    .catch((e: any) => {
      notice.error(`${label}失败:${e?.message || '消息发送失败(SW 可能未启动)'}`);
    });
};

2. background handler try-catch

if (type === 'task-control') {
  try {
    await controlTask(message.taskId, message.action, message.payload);
    return { success: true };
  } catch (e: any) {
    console.error('[bg] task-control failed:', e);
    return { success: false, message: e?.message || '任务控制失败...' };
  }
}

改动文件

文件 改了什么
src/sections/task/task-view.tsx control() 加 .then/.catch 错误反馈
src/entrypoints/background/index.ts task-control handler try-catch return success/error
package.json 0.10.56 → 0.10.57

验证

  • pnpm compile 0 错
  • pnpm build 8.84s
  • 📋 实测:触发 task-control 失败(如手动 throw 在 controlTask 内部)→ 应弹 toast "暂停失败:..."

audit_grep 防同款

audit_grep:
  - pattern: "sendMessage\\([\\s\\S]{0,200}'task-control'[\\s\\S]{0,200}\\)\\s*\\.\\s*catch\\(\\(\\)\\s*=>\\s*\\{\\}\\)"

元-观察:错误传播家族第 5 个(自查发现)

ISSUE-0034 unhandledrejection 未 preventDefault   ← 用户截图
ISSUE-0035 storage API 混用 silent             ← 用户截图
ISSUE-0036 writeChain 吞错 (createTask)        ← 用户截图
ISSUE-0037 API catch 吞错 (locations)          ← 用户截图
ISSUE-0038 overflow:auto 双轴吃滚轮             ← 用户截图(布局 family,不同家族)
ISSUE-0039 task-control 吞错 (本 issue)        ← 自查发现 ✅

4 + 1:错误传播家族 4 个(0034/0035/0036/0037 + 本 0039)+ 布局家族 1 个(0038)。

第 5 轮 agent 宣布 convergence 后,用户实测 + 自查发现的 6 个 bug,5 个属于"静默吞错"反模式。说明这套反模式在项目里系统性存在,仅修单点不够。

仍待办(自查同款扫描结果)

剩余 ~15 处 sendMessage(...).catch(() => {}),分两类:

类型 是否真 bug
fire-and-forget 通知(不需用户反馈) sendMessage({type: 'settings-changed'}) 🟢 可接受
用户主动操作(必须反馈) 任何用户点的按钮 🔴 应改

下次 todo:grep 所有用户主动操作按钮的 sendMessage,逐个加反馈。