feat(ack): support OMP workers

This commit is contained in:
2026-08-23 22:00:32 +08:00
parent 7dfdf80e9e
commit 02fafb4bf6
14 changed files with 530 additions and 18 deletions
+3 -2
View File
@@ -208,7 +208,7 @@ v0.10 自动 launcher 仅支持 `read-only` 与 `workspace-write`。full-access
Codex bypass、Cursor YOLO/force、Grok `--yolo` / bypassPermissions 和关闭
sandbox 都会 fail closed;在有可信平台审批或独立签发通道之前,不用项目文件
伪装成用户授权。Grok worker 由 launcher 固定带 `--always-approve`,避免工具调用
停在确认框,sandbox 仍必须启用。v0.17 起 `cli: grok` 是一等 worker CLI。旧任务板没有结构化
停在确认框,sandbox 仍必须启用。v0.17 起 `cli: grok` 是一等 worker CLI`cli: omp` 使用 OMP 的结构化模型、thinking 和 approval-mode 参数。旧任务板没有结构化
`project.orchestration` 时仍可读取和手动协作,但不得自动创建 worker。
持久化 `receiptHash` 是无密钥 checksum,不是 launcher 身份证明。ACK 只复用同一轮
@@ -262,6 +262,7 @@ ACK 会自动读取 `delivery.yaml`,无需再逐步提醒它构建、上传、
`select_tasks.py` 获取有预算的任务上下文,不再把完整任务板注入模型;从 `0.16.0` 起,
`delivery.yaml` 可用 `intents.testEnvironment``intents.release` 把测试环境部署和
版本发布写成用户可单独触发的操作;从 `0.17.0` 起,结构化 worker 路由支持
`cli: grok`(与 Codex、Cursor 并列);从 `0.17.1` Grok worker argv 固定带
`cli: grok`(与 Codex、Cursor 并列);从 `0.18.0`支持 OMP 的
`cli: omp` profile(精确 provider/model、thinking 与 approval-mode);从 `0.17.1` 起 Grok worker argv 固定带
`--always-approve`,sandbox 仍必开。旧项目可以不迁移而继续使用原闭环。旧项目的
`kitVersion` 可以继续读取,但建议迁移为 `ackVersion`
+1 -1
View File
@@ -247,7 +247,7 @@ description: >-
- 不猜测项目命令、服务地址、worker handle 或模型名称。
- 不把 full-access、bypass、YOLO/force、Grok `--yolo` / bypassPermissions、
关闭 sandbox 或项目内“授权”字段当成 v0.10 自动 worker 的合法配置;当前一律
fail closed。Grok worker 由 launcher 固定带 `--always-approve`,仍必须带 sandbox。
fail closed。Grok worker 由 launcher 固定带 `--always-approve`,仍必须带 sandbox。OMP worker 使用结构化 `--model``--thinking``--approval-mode` 参数;workspace-write 的 OMP profile 可按用户明确授权使用 yolo,仍禁止 `--auto-approve`
- 不把无密钥 `receiptHash` 或 Orca live metadata 当作旧终端的启动 attestation
没有可信空闲状态、配置匹配和历史消息清理证明时不复用既有 worker。
- launcher 返回 `indeterminate``reconcile required` 时,不直接重试;先按
+1 -1
View File
@@ -1 +1 @@
0.17.1
0.18.0
+1 -1
View File
@@ -1,6 +1,6 @@
# notes-web Agent 协作协议(示例,项目覆盖层)
> 本项目基于 ack v0.17.1
> 本项目基于 ack v0.18.0
> 通用规范由 `/ack` 从 Skill 自身的 `references/` 读取,本文件只填项目差异。
> 覆盖层文件放在 `docs/ack/project.md`,不占用 `AGENTS.md`
> ACK 不会自动修改 `AGENTS.md``CLAUDE.md` 或其它 Agent 指令文件。
+1 -1
View File
@@ -3,7 +3,7 @@
version: 1
updatedAt: "2026-07-06T09:40:00+08:00"
source: "Coordinator (PM) Agent"
ackVersion: "0.17.1"
ackVersion: "0.18.0"
project:
name: "notes-web"
baseUrl: "http://localhost:5173"
+6 -1
View File
@@ -73,7 +73,7 @@ worker 路由的机器可读事实只保存在 `docs/ack/tasks.yaml` 的
每个 profile 明确声明:
- `role``developer``test`
- `cli`:受支持的 Agent CLI`codex``cursor-agent``grok`);
- `cli`:受支持的 Agent CLI`codex``cursor-agent``grok``omp`);
- `tier`:角色模型档位;
- `model`:项目 allowlist 中的精确模型 ID
- `reasoningEffort`CLI 支持时显式声明;
@@ -87,6 +87,11 @@ worker 路由的机器可读事实只保存在 `docs/ack/tasks.yaml` 的
覆盖层或派发内容中保存自由 `command`、额外 argv、shell 片段、环境变量覆盖或隐式
CLI 默认值。具体 argv 只能由 ACK 的可信 launcher 按 allowlist 构造。
OMP profile 使用 `cli: omp``model` 必须是精确的 `provider/model` 选择器,
`reasoningEffort` 映射为 `--thinking``workspace-write` 映射为
`--approval-mode yolo``read-only` 映射为 `--approval-mode always-ask`
这是 OMP worker 的显式用户授权策略;launcher 仍不接受 `--auto-approve` 或会话复用。
### 安全默认
- 能在完全只读工作树完成的角色优先选择 `read-only`
+4 -1
View File
@@ -84,11 +84,13 @@ WORKER_CREDENTIAL_NAMES = {
"codex": frozenset({"AZURE_OPENAI_API_KEY", "OPENAI_API_KEY"}),
"cursor-agent": frozenset({"CURSOR_API_KEY"}),
"grok": frozenset({"XAI_API_KEY"}),
"omp": frozenset({"OPENCODE_API_KEY"}),
}
CLI_TITLE_LABELS = {
"codex": "CODEX",
"cursor-agent": "CURSOR",
"grok": "GROK",
"omp": "OMP",
}
INHERITED_ENVIRONMENT_PREFIXES = (
"LC_",
@@ -149,6 +151,7 @@ def trusted_path_entries() -> list[Path]:
candidates = [
home / ".local" / "bin",
home / ".local" / "share" / "mise" / "shims",
home / ".local" / "share" / "mise" / "installs" / "github-can1357-oh-my-pi" / "latest",
home / ".cargo" / "bin",
Path("/home/linuxbrew/.linuxbrew/bin"),
Path("/usr/local/go/bin"),
@@ -305,7 +308,7 @@ def _is_trusted_grok_executable(resolved: Path, metadata: os.stat_result) -> boo
def resolve_executable(name: str) -> Path:
supported = {"codex", "cursor-agent", "grok", "git", "orca"}
supported = {"codex", "cursor-agent", "grok", "omp", "git", "orca"}
if name not in supported:
raise LaunchError(f"不支持的可执行文件: {name}")
search_paths = trusted_path_entries()
+17 -2
View File
@@ -24,13 +24,13 @@ LAUNCH_PROTOCOL_VERSION = 1
MAX_ROUNDS = 3
ROLES = frozenset({"developer", "test"})
CLIS = frozenset({"codex", "cursor-agent", "grok"})
CLIS = frozenset({"codex", "cursor-agent", "grok", "omp"})
TIERS = frozenset({"standard", "strong"})
REASONING_EFFORTS = frozenset({"low", "medium", "high", "xhigh"})
PERMISSION_MODES = frozenset({"read-only", "workspace-write"})
ORCHESTRATION_MODES = frozenset({"orca", "manual"})
DEFAULT_KEYS = frozenset({"developer", "test", "developerUpgraded"})
CLI_REQUIRES_REASONING_EFFORT = frozenset({"codex", "grok"})
CLI_REQUIRES_REASONING_EFFORT = frozenset({"codex", "grok", "omp"})
CLI_REQUIRES_NULL_REASONING_EFFORT = frozenset({"cursor-agent"})
@@ -502,6 +502,21 @@ def render_worker_argv(
argv.extend(["--sandbox", "enabled", "--workspace", worktree])
return argv
if cli == "omp":
omp_approval = "always-ask" if permission == "read-only" else "yolo"
return [
executable,
"--model",
model,
"--thinking",
profile["reasoningEffort"],
"--approval-mode",
omp_approval,
"--cwd",
worktree,
"--no-session",
]
if cli != "grok":
raise ValueError(f"unsupported cli: {cli}")
grok_permission = "plan" if permission == "read-only" else "acceptEdits"
+2 -2
View File
@@ -360,7 +360,7 @@
},
"cli": {
"type": "string",
"enum": ["codex", "cursor-agent", "grok"]
"enum": ["codex", "cursor-agent", "grok", "omp"]
},
"tier": {
"type": "string",
@@ -518,7 +518,7 @@
"properties": {
"cli": {
"type": "string",
"enum": ["codex", "cursor-agent", "grok"]
"enum": ["codex", "cursor-agent", "grok", "omp"]
},
"tier": {
"type": "string",