Skip to content

Commit 0269bef

Browse files
committed
release: prepare 0.1.32-rc.1
1 parent 143e705 commit 0269bef

35 files changed

Lines changed: 2729 additions & 345 deletions

.github/workflows/ci.yml

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,3 +29,11 @@ jobs:
2929

3030
- name: Build
3131
run: bun run build
32+
33+
- name: Setup minimum supported Bun
34+
uses: oven-sh/setup-bun@v2
35+
with:
36+
bun-version: 1.1.45
37+
38+
- name: Verify launcher IPC on minimum Bun
39+
run: bun scripts/launcher-ipc-smoke.ts dist/worker/launcher.js

.github/workflows/publish.yml

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,14 @@ jobs:
4747
- name: Build
4848
run: bun run build
4949

50+
- name: Setup minimum supported Bun
51+
uses: oven-sh/setup-bun@v2
52+
with:
53+
bun-version: 1.1.45
54+
55+
- name: Verify launcher IPC on minimum Bun
56+
run: bun scripts/launcher-ipc-smoke.ts dist/worker/launcher.js
57+
5058
- name: Publish to npm
5159
env:
5260
PACKAGE_VERSION: ${{ github.event.release.tag_name || inputs.version }}

AGENTS.md

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ Gateway ─ Worker + Scheduler + Watchdog + Dashboard
1818

1919
- 插件在 `plugin/supertask.ts` 注册 8 个 `supertask_*` 工具:`add/next/status/retry/list/get/schedule/upgrade`;运行态与执行终态只允许 Gateway 写入,不得恢复外部 `start/done/fail`
2020
- Worker 先启动等待握手的 launcher,持久化 launcher PID 后才通过参数数组执行 `opencode run --agent <task.agent> --format json <task.prompt>`;新 run 使用 `gated-v3-token-guardian`,每 run UUID 必须同时写入 `task_runs.locked_by` 和 launcher argv。launcher 只能在整个进程组排空后通过不传递给 OpenCode 的 IPC 发回绑定 UUID 的证明;无证明退出必须隔离,不得结算或释放批次。退出码决定成功或失败,Gateway 统一写任务状态和执行记录。当前只有 Unix 独立进程组能提供可恢复的整树退出证明;Windows 在引入 Job Object 前必须拒绝启动 Worker,不得退回不完整的父子 PID 扫描。
21+
- Worker 校验 drain proof 后必须通过同一 IPC 回送绑定 UUID 的确认,launcher 收件后才退出;不得依赖旧 Bun 不可靠的 `process.send` callback。最低支持 Bun 1.1.45,CI 必须用该版本真实执行构建后的 launcher IPC smoke test。
2122
- Worker 启动的受管 OpenCode 进程设置 `SUPERTASK_MANAGED_RUN=1`;该上下文必须拒绝 `supertask_upgrade`,避免升级流程删除并等待承载自己的 Gateway。升级只能从外部 CLI 或非队列 OpenCode 会话发起。
2223
- `agents/supertask-runner.md``plugin/task.ts` 是旧架构遗留,不是当前 npm 运行链路;不得重新接入嵌套 runner。
2324
- pm2 是可选守护层:仅显式运行 `supertask install` 时允许安装;插件加载不得静默安装全局依赖。前台运行使用 `supertask gateway`
@@ -57,10 +58,11 @@ bun run dev -- db check # 检查数据库完整性与业务统计
5758
- PM2 替换已有 Gateway 前必须先用保存的运行环境验证管理命令可执行;若新旧进程无法共用同一可回滚的 PM2 管理路径,必须在删除旧进程前失败关闭。
5859
- PM2 替换、数据库维护、卸载与 macOS supervisor 检查必须先共用 `PM2_HOME/supertask-gateway.manage.sqlite` canonical SQLite 事务锁;兼容旧 custom lock 时还必须从 PM2 dump/运行环境和 LaunchAgent 恢复全部旧路径,并按固定顺序同时持有,不能因后续 CLI 缺少旧环境变量而绕过旧 supervisor。已安装 LaunchAgent 的 `PM2_HOME` 与当前 CLI 不同必须在任何修改前失败关闭,避免两个 PM2 daemon 争用同一 Gateway。不得恢复 PID/stale 文件锁。PM2 kill timeout 不得低于 Worker shutdown grace 加 15 秒,`stop/delete` 命令 timeout 不得低于实际 kill timeout 加 5 秒,管理锁必须持有到命令返回;显式低值必须在删除旧进程前失败关闭。
5960
- macOS supervisor 只有在 `jlist` 成功且确认 Gateway 缺失、同时 `dump.pm2` 明确包含 Gateway 时才可 `resurrect`;状态未知、`errored``stopped` 和卸载后的空 dump 都不得触发重启。卸载必须停止并移除项目 LaunchAgent。
60-
- `/health` 必须分别反映 Worker、Scheduler、Watchdog 和历史清理的活跃度与连续失败;`supertask doctor` 还要验证 macOS LaunchAgent 与 PM2 dump 可恢复性。PM2 替换/回滚必须保留既有 Bun 路径、完整运行环境和数据库作用域。
61+
- `/health` 必须分别反映 Worker、Scheduler、Watchdog 和历史清理的活跃度与连续失败;`supertask doctor` 还要解析 OpenCode 最终配置,要求唯一的精确插件版本,核对对应缓存、PM2 实际 Gateway 入口包和 ready 锁版本,并验证 macOS LaunchAgent 与 PM2 dump 可恢复性。浮动 `@latest`/`@next` Gateway 入口必须失败;全局 CLI 版本不同只提示按原包管理器更新。PM2 替换/回滚必须保留既有 Bun 路径、完整运行环境和数据库作用域。
6162
- 数据库检查、备份、清空和恢复统一经过 `DatabaseMaintenanceService`;CLI 清空/恢复必须显式确认并拒绝运行中任务,且只可自动停启 PID 与当前数据库新鲜 ready 锁一致的 PM2 Gateway;前台或无法确认归属的进程必须拒绝误杀。清空/恢复前必须自动创建校验通过的安全备份;清空必须动态删除全部业务表数据(包括 N+1 expand-only 表),通过延迟外键检查支持循环依赖,并保留 `gateway_lock` 与 migration 元数据。恢复来源必须从已打开的 SQLite 连接生成包含已提交 WAL 页的一致快照,并拒绝当前数据库的符号链接/硬链接别名。恢复必须动态校验 source/live 业务表和可写列:source-only 未知表/列在删除前失败关闭,共有未来列完整复制,live-only 列只允许可空/默认值且 live-only 新表必须清空,避免 N/N-1 形成混合时间点;随后在当前连接的排他事务内原位替换,不得关闭连接后 rename 换库。默认在操作失败时也恢复原 Gateway 状态,`--keep-stopped` 除外。
6263
- Dashboard 清空只能豁免当前 Gateway PID,仍必须服务端确认、拒绝运行中任务并在同一事务内先备份后动态删除全部业务表;不得恢复为路由内直接 `DELETE` 的实现。
6364
- Dashboard 的浏览器写请求必须通过同源检查,数据库字符串进入 HTML 前必须调用 `esc`;API 的 ID、状态和配置不得直接断言类型。
65+
- Dashboard 必须区分配置文件中的保存值和 Gateway 启动时的运行值;网页自动重启只允许当前 PID、新鲜 ready 锁和运行作用域均匹配的 PM2 Gateway,并必须先返回 HTTP 响应再触发既有优雅退出,由 PM2 自动拉起。前台 Gateway 不得显示可用的自动重启入口。
6466

6567
## 文档维护
6668

@@ -71,7 +73,7 @@ bun run dev -- db check # 检查数据库完整性与业务统计
7173
## 核心业务约束
7274

7375
- 任务状态:`pending | running | done | failed | dead_letter | cancelled`;执行记录状态:`running | done | failed`
74-
- `cwd` 是任务的项目隔离键;插件必须使用 OpenCode 工具上下文的 `directory`,不得信任模型传入的 `cwd`,查询和状态变更必须保持同一作用域。
76+
- `cwd` 是任务的项目分组、隔离键和 OpenCode 工作目录;插件必须使用 OpenCode 工具上下文的 `directory`,不得信任模型传入的 `cwd`,查询和状态变更必须保持同一作用域。任务/模板入库前必须验证非空 `cwd` 是已存在的绝对目录;Worker 取到非法遗留目录时必须记录失败并直接进入 `dead_letter`,不得启动 OpenCode 或自动重试刷错。Dashboard 分组保持 `cwd → batchId → tasks`,不得另建会与任务漂移的项目表
7577
- 队列顺序保持 `urgency DESC → importance DESC → createdAt ASC → id ASC`;全局并发和同一 `batchId` 串行必须依据数据库运行态,在 Gateway 重启后仍成立;不同批次可并行,依赖任务仅在同 cwd 的 `dependsOn` 完成后运行。
7678
- `maxRetries` 表示首次执行之外允许的重试次数;失败任务按指数退避,耗尽后进入 `dead_letter`。手动重试必须在同一写事务内确认依赖仍存在、同 `cwd` 且可恢复或已完成,才可重置重试预算,避免和历史清理并发制造悬空 `pending`
7779
- `retryBackoffMs``timeoutMs` 可按任务覆盖;调度模板克隆时必须保留 `cwd/batchId/maxRetries/retryBackoffMs/timeoutMs`
@@ -80,7 +82,11 @@ bun run dev -- db check # 检查数据库完整性与业务统计
8082
- Watchdog 处理当前 guardian PID 前必须同时校验 launcher 路径、配置的 OpenCode 参数和 `locked_by` 中的每 run UUID;旧 v2/legacy 记录只要 PID/PGID 仍存活或无法确认就必须隔离且不得发信号,只有二者均明确消失才可恢复。组长已退出但进程组仍存活时不得按 `not-running` 恢复。旧版 `started_at`/`heartbeat_at` 同时为 NULL 的 running run 必须视为 stale 并按协议隔离,不得永久占用并发且逃逸诊断。Unix 使用独立进程组;Windows 在 Job Object 隔离完成前禁止启动 Worker。
8183
- 旧版无 child PID 的 run 默认保持隔离;`run abandon` 只允许 `launch_protocol IS NULL`、owner PID 已退出、child PID 为空且关联任务已取消的记录,并要求显式 `ABANDON` 确认。未知非空协议和当前 guardian 协议必须 fail-closed。
8284
- Watchdog 的 `checkIntervalMs` 是心跳检查间隔,`cleanupIntervalMs` 是数据清理间隔,两者不可混用;配置经 `validateConfig` 校验后才允许运行或保存。
83-
- 调度模板支持 `cron | delayed | recurring`,Scheduler 将模板克隆为普通任务并受 `maxInstances` 限制;`delayed` 成功生成一次后必须自动禁用。
85+
- 调度模板支持 `cron | delayed | recurring`,Scheduler 自动克隆普通任务时受 `maxInstances` 限制;Dashboard 手动“立即运行一次”必须始终入队,但创建的任务仍计入后续自动调度的活跃实例数,并受 Worker 全局并发限制;`delayed` 自动生成一次后必须自动禁用。
86+
- Dashboard 可创建和编辑定时任务,写入必须复用 `TaskTemplateService` 校验;编辑必须在即时事务内重算 `nextRunAt`,保留启用状态和历史执行时间,只影响以后生成的任务。Scheduler 克隆前必须核对扫描到的触发时间,防止并发编辑后按旧时间提前执行。
87+
- Dashboard 可创建普通任务,必须暴露项目目录、模型、Agent、提示词、重要/紧急程度、批次、重试和超时,并在项目分组中显示运行、排队和异常数量;创建只负责持久入队,不得因 Worker 并发已满而拒绝。
88+
- 普通任务编辑必须经 `TaskService` 同时服务 Dashboard 与 CLI,只允许 `pending/failed/dead_letter`,且不得修改 `cwd/dependsOn`;运行中和完成/取消终态拒绝修改。降低失败任务重试预算导致现有次数超限时必须立即收敛到 `dead_letter`
89+
- Dashboard 继续会话命令必须按 run ID 从服务端读取并校验 Session ID 后生成,不得把完整 Session ID 直接写入 HTML 或未经校验拼接成终端命令。
8490
- `cron/recurring` 达到 `maxInstances` 时必须推进下一触发点,`delayed` 保持等待;到期模板扫描必须有界。不可恢复依赖应在状态事件中递归收敛,下游链不得在每个 Worker poll 全局扫描。
8591

8692
## 代码规范

0 commit comments

Comments
 (0)