Workflow 执行与恢复#
本页描述 OMD 0.2.0 的 Ultracode 与 Workflow 扩展。正式安装以对应 Release 为准。
Workflow 复用 DSH 原生子代理、工具循环、会话和 Jobs。可以让代理用脚本组织读取、实现、验证等阶段,子代理能够直接修改代码。普通模式下需要用户授权工作流或多代理协作。
Ultracode 与模型面板#
输入框的模型入口提供模型搜索、推理滑杆和恢复默认。Ultracode 是滑杆最后一档,模式状态保存在插件的会话存档,实际推理参数保存在原生模型选择日志;回到普通最高档会关闭 Ultracode。面板没有 Fast。开启模式后切换模型会保留模式,并使用新模型声明支持的最高推理档;未声明推理档位的模型沿用提供方默认设置。
Ultracode 在实质任务上提供持续的工作流授权,自动加入完整的工作流编写参考,包含实现委派、完整性检查、对抗验证、候选方案比较和迭代改进。提示词、工具与执行机制共同工作;模型是否遵循策略仍取决于其能力。模式不会改变宿主权限。
开启后的首次实际请求使用完整提醒,之后每十条先前普通人类消息后,在下条普通输入使用续提醒;后台消息不推进间隔。人类消息中的独立关键词 ultracode 仅为该回合启用工作流提示,不修改已保存模式或推理档位。关闭模式时移除编写参考并恢复普通授权规则。
提醒原文与参考固定对照 CC 2.1.265、2.1.266、2.1.280 的实际本地请求。DSH 采用完整系统提示词段装配,以便关闭或停用插件时清除旧指令,消息位置与 CC 不同。DSH 当前没有 /clear 命令;上下文压缩使用既有 /compact-p、/compact-f,不会改变已保存模式。
停用插件后,普通 DSH 会话继续可用,原生读取器仍可读取已有 OMD 历史;OMD preset 自身已卸载,因此该 preset 的会话需重新启用插件后才能继续,已保存模式届时恢复。
界面保留蓝色填充、粒子、拖动时滑块放大、档位过渡,以及 Ultracode 的渐变与缓慢光晕;遵循系统减少动态效果设置。模型与模式变更按原生规则作用于下次请求,已开始的请求继续使用其捕获的设置。
脚本与输入#
模型调用 workflow 时,在 script 中直接传入 JavaScript;无需先写文件:
export const meta = {
name: 'review-modules',
description: '按模块查找并验证问题',
phases: [{ title: 'Review' }],
};
phase('Review');
return await pipeline(args, name => agent(`检查模块 ${name}`, { label: name }));
args 可直接传数组或对象,例如 ['auth', 'storage']。元数据必须是纯字面量;也兼容单独的 meta 参数。脚本支持顶层 await,以 return 返回 JSON 值。代理默认继承主会话的模型;需要时可独立指定 provider、model、effort。
pipeline 让每项工作独立经过后续阶段;parallel 等待全部分支汇合。子代理失败返回 null,参数错误和运行上限会使脚本失败。结构化结果沿用宿主支持的 object-root JSON Schema 子集。
隔离与代理类型#
agent(prompt, {isolation: 'worktree'}) 在当前仓库 HEAD 创建独立工作区,位置为工作区内的 .omd/worktrees/。父目录的未提交改动不会复制过去。代理停止后,无变化的目录自动移除;文件改动、未跟踪文件、忽略文件或新提交都会保留,返回 worktrees 中的路径供检查和合并。不会自动合并或覆盖父工作区。
隔离工作区继承发起项目的上下文范围;选择私有会话范围时,仍归属原来的私有会话,不扩大为项目共享。
隔离要求本地 Git 仓库与可写权限;原有沙箱限制继续生效。无法确认目录干净时保留目录并报告原因。
agentType 使用 DSH 已注册的 agent preset id;general-purpose 继承当前 preset。例如 omd-ptc 使用 PTC 工具界面。未注册或无法启动的 preset 会明确报错。
保存、嵌套与续跑#
每次调用返回 runId、scriptPath 和 transcriptDir。可编辑返回的脚本,再以 scriptPath 调用。放在工作区 .omd/workflows/<name>.js 的脚本可通过 name 调用。三种入口 script、scriptPath、name 每次只选一种。
脚本内的 workflow('name', args) 或 workflow({scriptPath}, args) 支持一层嵌套,共享并发数、总代理数、取消信号与预算。Date.now()、Math.random() 和无参数 new Date() 不可用;需要时间或随机输入时通过 args 显式传入。
取消、失败或编辑脚本后,可带 resumeFromRunId 重放同一会话内的运行。按调用开始顺序复用最长的、未变化且成功完成的前缀;第一处变化、新调用、失败或未完成调用及后续部分重新执行。结果为空字符串也可能是有效缓存,可查看 transcriptDir 下的 journal.jsonl 核对。
仍在运行或正在被另一轮恢复的源运行不能并发重放。取消会等待已经开始的子代理启动和清理;清理无法完成时保持恢复锁,直到进程退出。进程崩溃后可以从已持久保存的成功前缀恢复,不把未完成调用当作成功。
输出 token 目标#
在人类消息末尾添加 +500k,可将本回合的共享输出目标设为 500,000 token。脚本通过 budget.total、budget.spent()、budget.remaining() 读取。未设置时没有目标上限;仍有防止失控的原生并发与总调用数限制。
达到目标后停止启动新的代理,正在运行的调用可以继续结束,因此最终数值可能超过目标。主会话与代理的输出一并计入,不重复计算推理 token;已完成缓存不产生新的模型调用。用量缺失时明确标记,已设置目标的运行停止继续派发。后台工作保留发起时的预算,新一轮用户输入不会重置旧后台工作的计数。
这个输出目标与 /预算 的会话用量提示分别保存;后者仍按原有规则统计输入、缓存、输出、轮次和时间。
开发分支:普通 fork 独立设置输出目标并统计用量,不消耗父会话的预算;fork 发起的真正子代理共享该 fork 的预算。修复也会停止沿用旧版误挂接到父会话的预算归属。
后台运行#
run_in_background: true 返回原生 job id 和已保存的脚本路径。用 job_output 读取结果,job_kill 请求取消;完成通知沿用 DSH Jobs。运行完成、结果已读取和验证通过是不同状态。