fix(scheduler): preserve queued discard reasons - #3656
Conversation
Signed-off-by: AoHanBei <dongaohan21@gmail.com>
|
| Filename | Overview |
|---|---|
| apps/desktop/src/main/maker-ipc/agent-input-coordinator.ts | 为所有主要队列移除入口补充结构化 discard reason,并将其传给 host 回调。 |
| apps/desktop/src/main/maker-ipc/register.ts | 扩展 scheduler queue bridge 与 watcher,使 coordinator 的丢弃原因到达 runner,并记录脱敏诊断字段。 |
| apps/desktop/src/main/scheduler-host/runner.ts | 将 user-remove 转为结构化取消、其它原因转为失败,但该取消类型会触发 scheduler 的“不重排”终态语义。 |
| packages/maker-scheduler/src/interfaces/schedule-runner.ts | 新增 ScheduleRunCancellationError,明确 AbortSignal 与显式用户取消的结构化协议。 |
| packages/maker-scheduler/src/engine/scheduler.ts | 移除错误文本推断并识别结构化取消,但错误地让 active recurring schedule 的单项删除跳过重排,且未让真实 AbortSignal 优先决定文案。 |
Flowchart
%%{init: {'theme': 'neutral'}}%%
flowchart TD
A[排队的自动化输入] --> B{丢弃原因}
B -->|user-remove| C[ScheduleRunCancellationError]
B -->|其它原因| D[普通 Error]
B -->|pause/delete| E[AbortSignal]
C --> F[Scheduler 识别为 aborted]
E --> F
D --> G[Scheduler 识别为 failed]
F --> H{Schedule 是否仍 active}
H -->|user-remove 后仍 active| I[nextFireAt 未恢复]
H -->|pause/delete| J[保持暂停或删除]
G --> K[正常重新规划 recurring cadence]
Prompt To Fix All With AI
### Issue 1
packages/maker-scheduler/src/engine/scheduler.ts:818-823
**单项取消破坏周期重排**
当用户删除仍处于 active/recurring 状态的日程所排队的自动化输入时,`ScheduleRunCancellationError` 会将本轮归为 `aborted`;该分支不会恢复 `claimDueFire` 已清空的 `nextFireAt`,导致任务保持 active 却不再自动运行。
### Issue 2
packages/maker-scheduler/src/engine/scheduler.ts:821-823
**信号取消文案被覆盖**
当用户先删除排队输入、随后暂停或删除同一日程时,结构化队列取消会先 settle runner,但 scheduler 随后同时看到已触发的 `AbortSignal`;这里仍优先保存队列删除文案,导致运行历史将实际的 pause/delete 收口误报为删除排队输入。
---
For each issue above, determine whether it is valid and should be fixed. If so, fix it directly.Reviews (1): Last reviewed commit: "fix(scheduler): preserve queued discard ..." | Re-trigger Greptile
Signed-off-by: AoHanBei <dongaohan21@gmail.com>
|
@AoHanBei 👋 这个 PR 还有 2 条 review conversation 没 resolve(packages/maker-scheduler/src/engine/scheduler.ts),auto-review 因此暂时跳过、没法继续审查 / 合并。 如果你已经按评论改完或回应了,请到对应 thread 上点 Resolve conversation;全部 resolve 后,下一轮 auto-review 会自动重新审查这个 PR。 |
|
这条 PR 需要一次维护者确认(架构:跨包排队 discard 回调契约变了)。 讨论 issue:#3664 请维护者:
评论里表态不算通过。在确认完成前本流程不会合并。 |
|
@AoHanBei 👋 这个 PR 目前与 请在本地 merge 最新的 |
这次改了什么
摘要
修复自动化排队输入在实际派发前被丢弃时,运行历史误报为
cancelled by user (schedule deleted or paused)的问题。此前 coordinator 的多个队列丢弃入口共用无参数回调,scheduler runner 会统一生成包含
aborted的错误文本;scheduler 随后通过/abort/i匹配错误内容,并将真实原因覆盖为暂停或删除任务的固定文案。本 PR 将队列丢弃原因以结构化字段贯穿 coordinator、IPC bridge、scheduler runner 和 scheduler engine:
AbortSignal为准;abort,也不再被误判为用户取消;变更类型
feat新功能fix缺陷修复refactor/perf重构或性能优化docs/test/chore文档、测试或工程维护范围
AgentInputCoordinator贯穿到 scheduler runner;ScheduleRunCancellationError,区分用户显式删除排队消息和普通失败;/abort/i取消判断;AbortSignal的既有终态和文案;UI 变化
不涉及。本 PR 仅修改主进程队列协调、scheduler runner 和 scheduler engine 的终态归类及诊断信息,没有视觉、交互或 UI 文案结构变更。
怎么验证的
自动验证
以下命令在 Windows PowerShell、Node.js 22、pnpm 10.33.2 环境执行。
回归测试覆盖:
queue-replaced;abort时仍归类为failed,不会覆盖真实错误;aborted,但不会冒充 schedule pause/delete;手工验证
不涉及 UI 操作。
原问题依赖重叠运行结束与人工输入之间的毫秒级竞争,目前没有稳定的手工复现方法。本 PR 使用 coordinator、runner 和 scheduler 三层定向测试覆盖该竞争路径的关键终态,并验证在
AbortSignal未触发时不会显示 pause/delete 文案。未执行的验证
no-unused-vars错误;本次新增和修改代码没有产生新的 lint 诊断。风险
风险分类
影响与回滚
AbortSignal路径保持原有aborted终态和固定文案;aborted的运行改为failed;提交前检查
git commit -s,见 DCO)