ralph-flow-pi 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +428 -0
- package/dist/cli.d.ts +9 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +56 -0
- package/dist/cli.js.map +1 -0
- package/dist/commands/prompts.d.ts +25 -0
- package/dist/commands/prompts.d.ts.map +1 -0
- package/dist/commands/prompts.js +249 -0
- package/dist/commands/prompts.js.map +1 -0
- package/dist/commands/tools.d.ts +47 -0
- package/dist/commands/tools.d.ts.map +1 -0
- package/dist/commands/tools.js +633 -0
- package/dist/commands/tools.js.map +1 -0
- package/dist/engine/check-bash.d.ts +121 -0
- package/dist/engine/check-bash.d.ts.map +1 -0
- package/dist/engine/check-bash.js +373 -0
- package/dist/engine/check-bash.js.map +1 -0
- package/dist/engine/check.d.ts +47 -0
- package/dist/engine/check.d.ts.map +1 -0
- package/dist/engine/check.js +298 -0
- package/dist/engine/check.js.map +1 -0
- package/dist/engine/core.d.ts +153 -0
- package/dist/engine/core.d.ts.map +1 -0
- package/dist/engine/core.js +1984 -0
- package/dist/engine/core.js.map +1 -0
- package/dist/engine/lock.d.ts +27 -0
- package/dist/engine/lock.d.ts.map +1 -0
- package/dist/engine/lock.js +121 -0
- package/dist/engine/lock.js.map +1 -0
- package/dist/engine/runner.d.ts +108 -0
- package/dist/engine/runner.d.ts.map +1 -0
- package/dist/engine/runner.js +510 -0
- package/dist/engine/runner.js.map +1 -0
- package/dist/engine/skills.d.ts +53 -0
- package/dist/engine/skills.d.ts.map +1 -0
- package/dist/engine/skills.js +109 -0
- package/dist/engine/skills.js.map +1 -0
- package/dist/engine/step-tools.d.ts +22 -0
- package/dist/engine/step-tools.d.ts.map +1 -0
- package/dist/engine/step-tools.js +45 -0
- package/dist/engine/step-tools.js.map +1 -0
- package/dist/engine/types.d.ts +136 -0
- package/dist/engine/types.d.ts.map +1 -0
- package/dist/engine/types.js +20 -0
- package/dist/engine/types.js.map +1 -0
- package/dist/headless.d.ts +57 -0
- package/dist/headless.d.ts.map +1 -0
- package/dist/headless.js +318 -0
- package/dist/headless.js.map +1 -0
- package/dist/pi/adapter.d.ts +135 -0
- package/dist/pi/adapter.d.ts.map +1 -0
- package/dist/pi/adapter.js +231 -0
- package/dist/pi/adapter.js.map +1 -0
- package/dist/pi/interactive.d.ts +28 -0
- package/dist/pi/interactive.d.ts.map +1 -0
- package/dist/pi/interactive.js +58 -0
- package/dist/pi/interactive.js.map +1 -0
- package/dist/pi/tui.d.ts +12 -0
- package/dist/pi/tui.d.ts.map +1 -0
- package/dist/pi/tui.js +12 -0
- package/dist/pi/tui.js.map +1 -0
- package/dist/tui/app.d.ts +25 -0
- package/dist/tui/app.d.ts.map +1 -0
- package/dist/tui/app.js +47 -0
- package/dist/tui/app.js.map +1 -0
- package/dist/tui/embed.d.ts +42 -0
- package/dist/tui/embed.d.ts.map +1 -0
- package/dist/tui/embed.js +38 -0
- package/dist/tui/embed.js.map +1 -0
- package/dist/tui/extension.d.ts +88 -0
- package/dist/tui/extension.d.ts.map +1 -0
- package/dist/tui/extension.js +114 -0
- package/dist/tui/extension.js.map +1 -0
- package/dist/tui/history-editor.d.ts +38 -0
- package/dist/tui/history-editor.d.ts.map +1 -0
- package/dist/tui/history-editor.js +55 -0
- package/dist/tui/history-editor.js.map +1 -0
- package/dist/tui/launcher.d.ts +24 -0
- package/dist/tui/launcher.d.ts.map +1 -0
- package/dist/tui/launcher.js +97 -0
- package/dist/tui/launcher.js.map +1 -0
- package/dist/tui/render.d.ts +87 -0
- package/dist/tui/render.d.ts.map +1 -0
- package/dist/tui/render.js +266 -0
- package/dist/tui/render.js.map +1 -0
- package/dist/tui/run-app.d.ts +49 -0
- package/dist/tui/run-app.d.ts.map +1 -0
- package/dist/tui/run-app.js +317 -0
- package/dist/tui/run-app.js.map +1 -0
- package/dist/tui/run-model.d.ts +162 -0
- package/dist/tui/run-model.d.ts.map +1 -0
- package/dist/tui/run-model.js +280 -0
- package/dist/tui/run-model.js.map +1 -0
- package/dist/tui/run-view.d.ts +71 -0
- package/dist/tui/run-view.d.ts.map +1 -0
- package/dist/tui/run-view.js +167 -0
- package/dist/tui/run-view.js.map +1 -0
- package/dist/tui/welcome-header.d.ts +40 -0
- package/dist/tui/welcome-header.d.ts.map +1 -0
- package/dist/tui/welcome-header.js +90 -0
- package/dist/tui/welcome-header.js.map +1 -0
- package/package.json +55 -0
- package/skills/c-to-rust-audit/SKILL.md +67 -0
- package/skills/c-to-rust-implement/SKILL.md +151 -0
- package/skills/c-to-rust-implement/references/c-to-rust-patterns.md +86 -0
- package/skills/c-to-rust-implement/references/conditional-compilation.md +47 -0
- package/skills/c-to-rust-implement/references/crate-reference.md +15 -0
- package/skills/c-to-rust-implement/references/error-strategies.md +80 -0
- package/skills/c-to-rust-implement/references/inline-asm.md +37 -0
- package/skills/c-to-rust-plan/SKILL.md +166 -0
- package/skills/c-to-rust-plan/references/detection-commands.md +66 -0
- package/skills/c-to-rust-test-gen/SKILL.md +130 -0
- package/skills/c-to-rust-test-gen/references/proptest-patterns.md +81 -0
- package/skills/c-to-rust-test-gen/references/test-porting.md +56 -0
- package/skills/c-to-rust-validate/SKILL.md +121 -0
- package/skills/everything2rust-audit/SKILL.md +69 -0
- package/skills/everything2rust-design/SKILL.md +121 -0
- package/skills/everything2rust-design/references/domain-playbooks.md +68 -0
- package/skills/everything2rust-design/references/paradigm-map.md +99 -0
- package/skills/everything2rust-implement/SKILL.md +101 -0
- package/skills/everything2rust-spec/SKILL.md +86 -0
- package/skills/everything2rust-spec/references/oracle-strategies.md +96 -0
- package/skills/everything2rust-survey/SKILL.md +99 -0
- package/skills/everything2rust-test-gen/SKILL.md +68 -0
- package/skills/everything2rust-test-gen/references/harness-patterns.md +186 -0
- package/skills/everything2rust-validate/SKILL.md +85 -0
- package/workflows/c-to-rust.yaml +202 -0
- package/workflows/everything2rust.yaml +259 -0
- package/workflows/loop.yaml +68 -0
- package/workflows/spec.yaml +183 -0
|
@@ -0,0 +1,298 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Adversarial Check (Independent Verification) — Pi adapter.
|
|
3
|
+
*
|
|
4
|
+
* Mirrors the contract of both plugin versions' adversarialCheck: same inputs,
|
|
5
|
+
* same `{ passed, infra?, reason }` result, same infra-vs-work-failure
|
|
6
|
+
* classification (an infra result pauses with check_error and does NOT burn a
|
|
7
|
+
* failure count, so `ralphflow_continue` re-verifies for free).
|
|
8
|
+
*
|
|
9
|
+
* The execution vehicle is what differs. The Claude version spawned
|
|
10
|
+
* `claude -p --allowedTools "…"`; the opencode version opened an SDK session
|
|
11
|
+
* with the read-only `ralph-check` agent. Here the verifier is a fresh Pi
|
|
12
|
+
* session that is read-only *structurally*: it gets Pi's read-only built-ins
|
|
13
|
+
* (read/grep/find/ls — no bash, no edit, no write) plus exactly two custom
|
|
14
|
+
* tools, `check_bash` (whitelist-enforced) and `verdict`. There is no host
|
|
15
|
+
* permission layer to misconfigure, and no prompt asking the model to please
|
|
16
|
+
* not write.
|
|
17
|
+
*
|
|
18
|
+
* The verdict likewise moved from prose to a tool call: the plugins parsed
|
|
19
|
+
* `<promise-check>true</promise-check>` off the last line, which meant a model
|
|
20
|
+
* that reasoned past its own tag, or fenced it, silently read as "false".
|
|
21
|
+
*
|
|
22
|
+
* Cancellation: the check session's JSONL path is written to the instance dir
|
|
23
|
+
* (.adversarial-session — counterpart of the Claude version's .adversarial-pid)
|
|
24
|
+
* and an abort handle is registered in-process so destroyInstance can reach it.
|
|
25
|
+
* A check owned by ANOTHER process cannot be reached from here; its result is
|
|
26
|
+
* discarded by the caller's post-check state re-read.
|
|
27
|
+
*/
|
|
28
|
+
import fs from "fs";
|
|
29
|
+
import { Type } from "typebox";
|
|
30
|
+
import { DEFAULT_ADVERSARIAL_SYSTEM_PROMPT, DEFAULT_ADVERSARIAL_TIMEOUT_MS, truncateCheckReason, } from "./core.js";
|
|
31
|
+
import { checkCommand, runApprovedCommand } from "./check-bash.js";
|
|
32
|
+
import { createCheckSession, defineTool, resolveModel, } from "../pi/adapter.js";
|
|
33
|
+
const activeChecks = new Map(); // instId -> handle
|
|
34
|
+
/** Abort a still-running check for an instance (in-process only). */
|
|
35
|
+
export function abortActiveCheck(instId) {
|
|
36
|
+
const active = activeChecks.get(instId);
|
|
37
|
+
if (!active)
|
|
38
|
+
return;
|
|
39
|
+
activeChecks.delete(instId);
|
|
40
|
+
try {
|
|
41
|
+
active.abort();
|
|
42
|
+
}
|
|
43
|
+
catch { }
|
|
44
|
+
// Fire-and-forget: the awaiting side resolves through its own abort flag.
|
|
45
|
+
const session = active.session;
|
|
46
|
+
if (session) {
|
|
47
|
+
Promise.resolve()
|
|
48
|
+
.then(() => session.abort())
|
|
49
|
+
.catch(() => { })
|
|
50
|
+
.then(() => session.dispose())
|
|
51
|
+
.catch(() => { });
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
export function hasActiveCheck(instId) {
|
|
55
|
+
return activeChecks.has(instId);
|
|
56
|
+
}
|
|
57
|
+
function makeVerdictTool(slot) {
|
|
58
|
+
return defineTool({
|
|
59
|
+
name: "verdict",
|
|
60
|
+
label: "Verdict",
|
|
61
|
+
description: "提交本次验证的最终结论。这是结束检查的唯一方式——只输出文字不调用本工具,等同于没有给出结论。",
|
|
62
|
+
parameters: Type.Object({
|
|
63
|
+
pass: Type.Boolean({ description: "检查依据中的每一项都满足时为 true;任何一项不满足为 false。" }),
|
|
64
|
+
reason: Type.String({
|
|
65
|
+
description: "结论的具体依据:引用你实际看到的文件内容、命令输出。不要只写“符合要求”。不通过时说明具体哪一项不满足。",
|
|
66
|
+
}),
|
|
67
|
+
}),
|
|
68
|
+
execute: async (_toolCallId, params) => {
|
|
69
|
+
slot.submitted = true;
|
|
70
|
+
slot.passed = !!params.pass;
|
|
71
|
+
slot.reason = truncateCheckReason(String(params.reason ?? ""));
|
|
72
|
+
return {
|
|
73
|
+
content: [{ type: "text", text: `结论已记录:${slot.passed ? "通过" : "不通过"}` }],
|
|
74
|
+
details: {},
|
|
75
|
+
};
|
|
76
|
+
},
|
|
77
|
+
});
|
|
78
|
+
}
|
|
79
|
+
/**
|
|
80
|
+
* The verifier's shell. Every command is whitelist-checked before it can spawn
|
|
81
|
+
* (see check-bash.ts) — a denial returns a normal tool result explaining why, so
|
|
82
|
+
* the model can pick a read-only alternative instead of derailing the check.
|
|
83
|
+
*/
|
|
84
|
+
function makeCheckBashTool(cwd, onEvent, extraAllowedBash) {
|
|
85
|
+
const extraNote = extraAllowedBash && extraAllowedBash.length > 0
|
|
86
|
+
? ` 本工作流额外允许:${extraAllowedBash.join("、")}。`
|
|
87
|
+
: "";
|
|
88
|
+
return defineTool({
|
|
89
|
+
name: "check_bash",
|
|
90
|
+
label: "Bash (只读)",
|
|
91
|
+
description: "运行只读的 shell 命令来验证工作(如 cat/grep/ls/git diff/cargo test/npm test/pytest)。" +
|
|
92
|
+
"任何会修改工作区的命令都会被拒绝:你只能审查,不能修改。" + extraNote,
|
|
93
|
+
parameters: Type.Object({
|
|
94
|
+
command: Type.String({ description: "要执行的 shell 命令(只读)" }),
|
|
95
|
+
}),
|
|
96
|
+
execute: async (_toolCallId, params, signal) => {
|
|
97
|
+
const command = String(params.command ?? "");
|
|
98
|
+
const decision = checkCommand(command, extraAllowedBash);
|
|
99
|
+
if (!decision.allowed) {
|
|
100
|
+
const detail = decision.offendingSegment ? `(问题片段:\`${decision.offendingSegment}\`)` : "";
|
|
101
|
+
onEvent(`denied: ${command}`);
|
|
102
|
+
// Returned as a normal result, not thrown: the model should read WHY and
|
|
103
|
+
// pick a read-only alternative, not treat the check itself as broken.
|
|
104
|
+
return {
|
|
105
|
+
content: [{
|
|
106
|
+
type: "text",
|
|
107
|
+
text: `命令被拒绝${detail}:${decision.reason}\n\n你是只读验证者,只能运行不修改工作区的命令。请改用只读方式验证。`,
|
|
108
|
+
}],
|
|
109
|
+
details: { denied: true, exitCode: null, timedOut: false },
|
|
110
|
+
};
|
|
111
|
+
}
|
|
112
|
+
onEvent(`run: ${command}`);
|
|
113
|
+
const result = await runApprovedCommand(command, cwd, signal);
|
|
114
|
+
const status = result.exitCode === 0 ? "" : `\n(exit code: ${result.exitCode})`;
|
|
115
|
+
return {
|
|
116
|
+
content: [{ type: "text", text: (result.output || "(无输出)") + status }],
|
|
117
|
+
details: { denied: false, exitCode: result.exitCode, timedOut: result.timedOut },
|
|
118
|
+
};
|
|
119
|
+
},
|
|
120
|
+
});
|
|
121
|
+
}
|
|
122
|
+
/**
|
|
123
|
+
* Run the independent verification for a step. `checkPrompt` is built by the
|
|
124
|
+
* caller (with the explicit instId) and passed in, so this function needs no
|
|
125
|
+
* instance binding of its own.
|
|
126
|
+
*/
|
|
127
|
+
export async function adversarialCheck(engine, instId, step, checkPrompt, userTask, adversarialConfig, onBashEvent, deps,
|
|
128
|
+
/** Live stream of the verifier session (reasoning / text / tool calls) for the run view. */
|
|
129
|
+
onEvent) {
|
|
130
|
+
const createSession = deps?.createSession ?? createCheckSession;
|
|
131
|
+
const systemPrompt = adversarialConfig?.system_prompt || DEFAULT_ADVERSARIAL_SYSTEM_PROMPT;
|
|
132
|
+
const timeout = adversarialConfig?.timeout_ms || DEFAULT_ADVERSARIAL_TIMEOUT_MS;
|
|
133
|
+
if (!engine.instanceExists(instId)) {
|
|
134
|
+
return { passed: false, reason: "工作流实例已被取消。" };
|
|
135
|
+
}
|
|
136
|
+
// Re-validate extra_dirs here, not just at start: a dir deleted mid-workflow
|
|
137
|
+
// would otherwise surface as a cryptic failure. Infra error → check_error
|
|
138
|
+
// pause, no fail burn; continue re-verifies once the dir is restored.
|
|
139
|
+
const extraDirs = engine.readExtraDirs(instId);
|
|
140
|
+
const missingDirs = extraDirs.filter((d) => {
|
|
141
|
+
try {
|
|
142
|
+
return !fs.statSync(d).isDirectory();
|
|
143
|
+
}
|
|
144
|
+
catch {
|
|
145
|
+
return true;
|
|
146
|
+
}
|
|
147
|
+
});
|
|
148
|
+
if (missingDirs.length > 0) {
|
|
149
|
+
return { passed: false, infra: true, reason: `启动时通过 extra_dirs 声明的目录已不存在:${missingDirs.map((d) => `\`${d}\``).join("、")}。恢复该目录(或重新启动工作流)后调用 ralphflow_continue 重新验证。` };
|
|
150
|
+
}
|
|
151
|
+
// Resolve the verifier model. An unresolvable spec is a warning, not a
|
|
152
|
+
// failure: fall back to the default model, same as both plugin versions.
|
|
153
|
+
let model;
|
|
154
|
+
let modelLabel = "default";
|
|
155
|
+
if (adversarialConfig?.model) {
|
|
156
|
+
const resolved = await resolveModel(adversarialConfig.model);
|
|
157
|
+
if (resolved.error || !resolved.model) {
|
|
158
|
+
engine.logEvent(instId, "warn", "adversarial_check_model_unresolved", { stepId: step.id, model: adversarialConfig.model, error: resolved.error });
|
|
159
|
+
}
|
|
160
|
+
else {
|
|
161
|
+
model = resolved.model;
|
|
162
|
+
modelLabel = adversarialConfig.model;
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
engine.logEvent(instId, "info", "adversarial_check_start", { stepId: step.id, model: modelLabel, timeout_ms: timeout, extra_dirs: extraDirs });
|
|
166
|
+
// Log the (near-)full prompts sent to the verifier, so the execution log is a
|
|
167
|
+
// faithful record of exactly what was checked. Truncated to bound the line.
|
|
168
|
+
const truncate = (t) => (t.length > 3000 ? t.substring(0, 3000) + "…(截断)" : t);
|
|
169
|
+
engine.logEvent(instId, "info", "adversarial_check_prompt", { stepId: step.id, systemPrompt: truncate(systemPrompt), checkPrompt: truncate(checkPrompt) });
|
|
170
|
+
const slot = { submitted: false, passed: false, reason: "" };
|
|
171
|
+
let aborted = false;
|
|
172
|
+
const handle = { session: null, abort: () => { aborted = true; } };
|
|
173
|
+
activeChecks.set(instId, handle);
|
|
174
|
+
let session;
|
|
175
|
+
try {
|
|
176
|
+
session = await createSession({
|
|
177
|
+
cwd: engine.projectDir,
|
|
178
|
+
model,
|
|
179
|
+
systemPrompt,
|
|
180
|
+
customTools: [
|
|
181
|
+
makeCheckBashTool(engine.projectDir, (line) => onBashEvent?.(line), adversarialConfig?.extra_allowed_bash),
|
|
182
|
+
makeVerdictTool(slot),
|
|
183
|
+
],
|
|
184
|
+
// The check transcript is disposable — the verdict and its reason are what
|
|
185
|
+
// survive, in state.last_failure_reason and the final report.
|
|
186
|
+
disableCompaction: true,
|
|
187
|
+
});
|
|
188
|
+
handle.session = session;
|
|
189
|
+
// Forward the verifier's live stream (reasoning, bash commands, verdict tool)
|
|
190
|
+
// so the run view shows CHECK as a first-class visible phase, not a black box.
|
|
191
|
+
if (onEvent)
|
|
192
|
+
session.subscribe(onEvent);
|
|
193
|
+
}
|
|
194
|
+
catch (err) {
|
|
195
|
+
activeChecks.delete(instId);
|
|
196
|
+
engine.logEvent(instId, "error", "adversarial_check_session_create_failed", { stepId: step.id, error: err.message });
|
|
197
|
+
return { passed: false, infra: true, reason: `验证会话创建失败:${err.message}` };
|
|
198
|
+
}
|
|
199
|
+
// Close the cancel race: a cross-process cancel between the pre-check above
|
|
200
|
+
// and the registration here finds nothing to abort and deletes the instance
|
|
201
|
+
// dir. If the instance is gone now, nobody else can reach this session —
|
|
202
|
+
// clean it up ourselves.
|
|
203
|
+
if (!engine.instanceExists(instId)) {
|
|
204
|
+
activeChecks.delete(instId);
|
|
205
|
+
session.dispose();
|
|
206
|
+
engine.logEvent(instId, "warn", "adversarial_check_cancelled_before_start", { stepId: step.id });
|
|
207
|
+
return { passed: false, reason: "工作流实例已被取消。" };
|
|
208
|
+
}
|
|
209
|
+
if (session.jsonlPath)
|
|
210
|
+
engine.writeAdversarialSession(session.jsonlPath, instId);
|
|
211
|
+
const startTime = Date.now();
|
|
212
|
+
// Liveness watchdog: one log line a minute, so a stuck check is visible in the
|
|
213
|
+
// execution log rather than looking like a hang.
|
|
214
|
+
const keepalive = setInterval(() => {
|
|
215
|
+
engine.logEvent(instId, "info", "adversarial_check_keepalive", { stepId: step.id, elapsed_ms: Date.now() - startTime });
|
|
216
|
+
}, 60_000);
|
|
217
|
+
try {
|
|
218
|
+
let timeoutTimer;
|
|
219
|
+
const deadline = new Promise((_, reject) => {
|
|
220
|
+
timeoutTimer = setTimeout(() => reject(new Error("Adversarial check timeout")), timeout);
|
|
221
|
+
});
|
|
222
|
+
try {
|
|
223
|
+
const run = session.prompt(checkPrompt);
|
|
224
|
+
// If the timeout wins the race, this promise stays pending and may reject
|
|
225
|
+
// later (most reliably right after abort()). An unhandled late rejection
|
|
226
|
+
// would take the process down, so neutralize it here; the race below still
|
|
227
|
+
// decides the outcome.
|
|
228
|
+
Promise.resolve(run).catch(() => { });
|
|
229
|
+
await Promise.race([run, deadline]);
|
|
230
|
+
// No verdict yet? Ask once. A check that reasoned to a conclusion but
|
|
231
|
+
// forgot the tool call is the common case, and re-prompting is far cheaper
|
|
232
|
+
// than an infra pause. (The plugins had no equivalent: a missing tag just
|
|
233
|
+
// read as "false" — a silent wrong verdict.)
|
|
234
|
+
if (!slot.submitted && !aborted && engine.instanceExists(instId)) {
|
|
235
|
+
engine.logEvent(instId, "info", "adversarial_check_verdict_missing_retry", { stepId: step.id });
|
|
236
|
+
const retry = session.followUp("你还没有提交结论。请立即调用 `verdict` 工具,给出 pass 与具体的 reason。");
|
|
237
|
+
Promise.resolve(retry).catch(() => { });
|
|
238
|
+
await Promise.race([retry, deadline]);
|
|
239
|
+
}
|
|
240
|
+
}
|
|
241
|
+
catch (err) {
|
|
242
|
+
if (aborted || !engine.instanceExists(instId)) {
|
|
243
|
+
return { passed: false, infra: true, reason: "工作流实例已被取消。" };
|
|
244
|
+
}
|
|
245
|
+
if (String(err.message).includes("timeout")) {
|
|
246
|
+
// Abort the runaway generation before reporting.
|
|
247
|
+
await session.abort();
|
|
248
|
+
engine.logEvent(instId, "warn", "adversarial_check_timeout", { stepId: step.id });
|
|
249
|
+
return {
|
|
250
|
+
passed: false,
|
|
251
|
+
infra: true,
|
|
252
|
+
reason: `检查阶段超时(${Math.round(timeout / 60000)} 分钟)。验证耗时过长。
|
|
253
|
+
|
|
254
|
+
可能原因:
|
|
255
|
+
- 验证会话响应缓慢或无响应
|
|
256
|
+
- 任务对于验证模型过于复杂
|
|
257
|
+
- API 端点未响应
|
|
258
|
+
|
|
259
|
+
建议:
|
|
260
|
+
1. 使用 /ralphflow-status 查看当前状态
|
|
261
|
+
2. 使用 /ralphflow-continue 重试
|
|
262
|
+
3. 或使用 /ralphflow-cancel 取消工作流
|
|
263
|
+
4. 如果任务确实需要更长时间,可以在工作流配置中增加 timeout_ms`,
|
|
264
|
+
};
|
|
265
|
+
}
|
|
266
|
+
engine.logEvent(instId, "error", "adversarial_check_error", { stepId: step.id, error: err.message });
|
|
267
|
+
return { passed: false, infra: true, reason: `验证会话执行失败:${err.message}` };
|
|
268
|
+
}
|
|
269
|
+
finally {
|
|
270
|
+
if (timeoutTimer)
|
|
271
|
+
clearTimeout(timeoutTimer);
|
|
272
|
+
}
|
|
273
|
+
if (aborted) {
|
|
274
|
+
return { passed: false, infra: true, reason: "工作流实例已被取消。" };
|
|
275
|
+
}
|
|
276
|
+
if (!slot.submitted) {
|
|
277
|
+
// Still nothing after the nudge. This is an infra failure, NOT a work
|
|
278
|
+
// failure: we have no verdict, so we must not burn the step's fail count.
|
|
279
|
+
engine.logEvent(instId, "warn", "adversarial_check_no_verdict", { stepId: step.id });
|
|
280
|
+
return { passed: false, infra: true, reason: "验证者没有提交结论(未调用 verdict 工具)。调用 ralphflow_continue 可重新验证。" };
|
|
281
|
+
}
|
|
282
|
+
const reason = slot.reason || (slot.passed ? "检查通过。" : "检查失败(验证者未说明原因)。");
|
|
283
|
+
// One clear line per check (verdict + a short reason snippet). The full
|
|
284
|
+
// reason lives in state.last_failure_reason and the final report.
|
|
285
|
+
engine.logEvent(instId, "info", "adversarial_check_result", { stepId: step.id, passed: slot.passed, len: reason.length, reason: reason.substring(0, 160) });
|
|
286
|
+
return { passed: slot.passed, reason };
|
|
287
|
+
}
|
|
288
|
+
finally {
|
|
289
|
+
clearInterval(keepalive);
|
|
290
|
+
if (activeChecks.get(instId) === handle)
|
|
291
|
+
activeChecks.delete(instId);
|
|
292
|
+
if (session.jsonlPath && engine.readAdversarialSession(instId) === session.jsonlPath) {
|
|
293
|
+
engine.clearAdversarialSession(instId);
|
|
294
|
+
}
|
|
295
|
+
session.dispose();
|
|
296
|
+
}
|
|
297
|
+
}
|
|
298
|
+
//# sourceMappingURL=check.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"check.js","sourceRoot":"","sources":["../../src/engine/check.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,153 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Ralph Flow engine core — the host-independent semantic core.
|
|
3
|
+
*
|
|
4
|
+
* The WORKFLOW LOGIC (YAML schema + validation, prompt building, the
|
|
5
|
+
* check-result state machine, the sub-workflow stack, lint/doctor, reports)
|
|
6
|
+
* is a verbatim mirror of the opencode plugin's engine.ts so existing user
|
|
7
|
+
* workflows keep running unchanged; see SYNC.md for the mirror boundary.
|
|
8
|
+
*
|
|
9
|
+
* The RUNTIME PLUMBING is NOT a mirror. ralph-flow-pi owns its sessions: the
|
|
10
|
+
* engine creates a fresh AgentSession per DO step instead of borrowing a host
|
|
11
|
+
* chat session. Three consequences show up in this file:
|
|
12
|
+
*
|
|
13
|
+
* - Completion signalling is structured. The opencode/Claude versions asked the
|
|
14
|
+
* model to emit `<promise>done</promise>` / `<promise-check>true</promise-check>`
|
|
15
|
+
* and parsed the text back out. Here the DO session gets a `report_done` tool
|
|
16
|
+
* and the CHECK session a `verdict` tool, so the tag-parsing helpers (and
|
|
17
|
+
* their last-line/100-char/code-fence tolerance rules) are gone.
|
|
18
|
+
* - The driver's idle-dedup markers (.last-phase-report/.post-tool-active) are
|
|
19
|
+
* gone with the idle event that needed them; the runner awaits turns directly.
|
|
20
|
+
* - Data lives under `.ralph-flow/` (no host dir), and there is no pre-2.0
|
|
21
|
+
* legacy layout to migrate — this package starts fresh.
|
|
22
|
+
*/
|
|
23
|
+
import { type InstanceInfo, type NormalStepDef, type PermissionAction, type Platform, type RalphFlowState, type StepDef, type StepExecutionRecord, type SubWorkflowStepDef, type TransitionResult, type WorkflowDef } from "./types.js";
|
|
24
|
+
export * from "./types.js";
|
|
25
|
+
/** Project-relative data root. Unlike the plugin versions this is not nested
|
|
26
|
+
* under a host's config dir (.opencode/ / .claude/) — we are the host. */
|
|
27
|
+
export declare const RALPH_FLOW_DIRNAME = ".ralph-flow";
|
|
28
|
+
/** Global config home basename under ~/.config. */
|
|
29
|
+
export declare const GLOBAL_CONFIG_DIRNAME = "ralph-flow-pi";
|
|
30
|
+
export declare const MANUAL_STEP_MARKER = ".manual-step-active";
|
|
31
|
+
export declare const MANUAL_GATE_MARKER = ".manual-gate";
|
|
32
|
+
/** Written by the DO session's `report_done` tool (was .done-tag-detected, set
|
|
33
|
+
* by text-tag detection). */
|
|
34
|
+
export declare const DONE_REPORTED_MARKER = ".done-reported";
|
|
35
|
+
export declare const REINJECT_COUNT_MARKER = ".do-reinject-count";
|
|
36
|
+
export declare const DO_PROMPT_CACHE_MARKER = ".do-prompt-cache";
|
|
37
|
+
/** PID of the process currently driving this instance's runner loop. */
|
|
38
|
+
export declare const RUNNER_PID_MARKER = ".runner-pid";
|
|
39
|
+
export declare const MAX_NESTING_DEPTH = 5;
|
|
40
|
+
export declare const MAX_ADVERSARIAL_TIMEOUT_MS = 3600000;
|
|
41
|
+
export interface Engine extends ReturnType<typeof createEngine> {
|
|
42
|
+
}
|
|
43
|
+
export declare function createEngine(projectDir: string, platform?: Platform): {
|
|
44
|
+
projectDir: string;
|
|
45
|
+
diag: (...args: unknown[]) => void;
|
|
46
|
+
setAbortActiveStep: (fn: (instId: string) => void) => void;
|
|
47
|
+
getRalphFlowDir: () => string;
|
|
48
|
+
getInstancesRoot: () => string;
|
|
49
|
+
getReportsDir: () => string;
|
|
50
|
+
getInstanceDir: (instId: string) => string;
|
|
51
|
+
instPath: (name: string, instId: string) => string;
|
|
52
|
+
getArtifactsDir: (instId: string) => string;
|
|
53
|
+
getArtifactsRelDir: (instId: string) => string;
|
|
54
|
+
getBuiltinWorkflowsDir: () => string;
|
|
55
|
+
getProjectWorkflowsDir: () => string;
|
|
56
|
+
getGlobalWorkflowsDir: () => string | null;
|
|
57
|
+
getGlobalConfigHome: () => string | null;
|
|
58
|
+
getSessionsDir: (instId: string) => string;
|
|
59
|
+
getStepSessionDir: (instId: string, stepId: string, phase: "do" | "check", attempt: number) => string;
|
|
60
|
+
listStepSessionDirs: (instId: string, stepId: string, phase: "do" | "check") => string[];
|
|
61
|
+
generateInstanceId: (workflowName: string) => string;
|
|
62
|
+
isValidInstanceId: (id: unknown) => id is string;
|
|
63
|
+
instanceExists: (instId: string) => boolean;
|
|
64
|
+
writeArtifactsDirName: (instId: string, task: string) => void;
|
|
65
|
+
writeExtraDirs: (instId: string, dirs: string[]) => void;
|
|
66
|
+
readExtraDirs: (instId: string) => string[];
|
|
67
|
+
readOwnerSession: (instId: string) => string | null;
|
|
68
|
+
claimOwnership: (instId: string, sessionId: string | null) => void;
|
|
69
|
+
listInstances: () => InstanceInfo[];
|
|
70
|
+
resolveInstance: (explicitId: string | null | undefined, sessionId: string | null) => {
|
|
71
|
+
ok: true;
|
|
72
|
+
id: string;
|
|
73
|
+
attached: boolean;
|
|
74
|
+
} | {
|
|
75
|
+
ok: false;
|
|
76
|
+
text: string;
|
|
77
|
+
};
|
|
78
|
+
bindInstance: (instId: string, sessionId: string | null) => void;
|
|
79
|
+
destroyInstance: (instId: string, status: string) => string | null;
|
|
80
|
+
instanceStatusLabel: (info: InstanceInfo) => string;
|
|
81
|
+
formatInstanceList: (instances: InstanceInfo[], actionHint?: string) => string;
|
|
82
|
+
formatLastActivity: (date: Date | null) => string;
|
|
83
|
+
writeRunnerPid: (instId: string) => void;
|
|
84
|
+
clearRunnerPid: (instId: string) => void;
|
|
85
|
+
readRunnerPid: (instId: string) => number | null;
|
|
86
|
+
foreignRunnerPid: (instId: string) => number | null;
|
|
87
|
+
readState: (instId: string) => RalphFlowState | null;
|
|
88
|
+
writeState: (state: RalphFlowState, instId: string) => void;
|
|
89
|
+
isValidState: (s: any) => s is RalphFlowState;
|
|
90
|
+
writeMarker: (name: string, content: string, instId: string) => void;
|
|
91
|
+
clearMarker: (name: string, instId: string) => void;
|
|
92
|
+
markerExists: (name: string, instId: string) => boolean;
|
|
93
|
+
writeManualStepMarker: (instId: string) => void;
|
|
94
|
+
clearManualStepMarker: (instId: string) => void;
|
|
95
|
+
writeManualGate: (instId: string) => void;
|
|
96
|
+
clearManualGate: (instId: string) => void;
|
|
97
|
+
clearReinjectCounter: (instId: string) => void;
|
|
98
|
+
clearDoPromptCache: (instId: string) => void;
|
|
99
|
+
writeDoneReported: (instId: string) => void;
|
|
100
|
+
clearDoneReported: (instId: string) => void;
|
|
101
|
+
doneReported: (instId: string) => boolean;
|
|
102
|
+
readReinjectCount: (instId: string, key: string) => number;
|
|
103
|
+
incrementReinjectCount: (instId: string, key: string) => number;
|
|
104
|
+
writeDoPromptCache: (prompt: string, instId: string) => void;
|
|
105
|
+
readDoPromptCache: (instId: string) => string | null;
|
|
106
|
+
writeAdversarialSession: (checkSessionRef: string, instId: string) => void;
|
|
107
|
+
clearAdversarialSession: (instId: string) => void;
|
|
108
|
+
readAdversarialSession: (instId: string) => string | null;
|
|
109
|
+
parseWorkflowFile: (filePath: string, workflowName: string, problems?: string[]) => WorkflowDef | null;
|
|
110
|
+
loadWorkflow: (workflowName: string, problems?: string[]) => WorkflowDef | null;
|
|
111
|
+
listWorkflows: () => Array<{
|
|
112
|
+
name: string;
|
|
113
|
+
desc: string;
|
|
114
|
+
invalid?: boolean;
|
|
115
|
+
}>;
|
|
116
|
+
lintWorkflow: (wf: WorkflowDef, rawParsed: any) => string[];
|
|
117
|
+
buildDoctorReport: () => string;
|
|
118
|
+
isValidWorkflowName: (name: unknown) => name is string;
|
|
119
|
+
getStep: (workflow: WorkflowDef, stepId: string) => StepDef | null;
|
|
120
|
+
buildDoPrompt: (instId: string, step: NormalStepDef, userTask?: string, retryContext?: string, retryCount?: number) => string;
|
|
121
|
+
buildCheckPrompt: (instId: string, step: NormalStepDef, userTask?: string) => string;
|
|
122
|
+
buildSubWorkflowUserTask: (instId: string, step: SubWorkflowStepDef, parentUserTask: string) => string;
|
|
123
|
+
resolveSubWorkflowEntry: (instId: string, subWorkflowName: string, parentUserTask: string, parentStep: SubWorkflowStepDef, maxDepth?: number, retryContext?: string, retryCount?: number) => {
|
|
124
|
+
text: string;
|
|
125
|
+
error?: boolean;
|
|
126
|
+
};
|
|
127
|
+
renderStepText: (instId: string, text: string) => string;
|
|
128
|
+
pushState: (state: RalphFlowState, instId: string) => void;
|
|
129
|
+
popState: (instId: string) => RalphFlowState | null;
|
|
130
|
+
getStackDepth: (instId: string) => number;
|
|
131
|
+
logEvent: (instId: string, level: string, event: string, extra?: Record<string, unknown>) => void;
|
|
132
|
+
recordStepStart: (instId: string, stepId: string, phase: string) => void;
|
|
133
|
+
addStepRecord: (instId: string, stepId: string, phase: string, status: "passed" | "failed", failCount: number, reason?: string) => void;
|
|
134
|
+
loadStepRecords: (instId: string) => StepExecutionRecord[];
|
|
135
|
+
buildReportText: (workflowName: string, status: string, stepRecords: StepExecutionRecord[]) => string;
|
|
136
|
+
archiveReport: (instId: string, workflowName: string, status: string, records: StepExecutionRecord[]) => string | null;
|
|
137
|
+
handleCheckPassed: (instId: string, state: RalphFlowState, workflow: WorkflowDef, step: StepDef, checkResult: {
|
|
138
|
+
reason?: string;
|
|
139
|
+
}) => TransitionResult;
|
|
140
|
+
handleCheckFailed: (instId: string, state: RalphFlowState, workflow: WorkflowDef, step: StepDef, checkResult: {
|
|
141
|
+
reason?: string;
|
|
142
|
+
}) => TransitionResult;
|
|
143
|
+
ensureProjectWorkflows: () => void;
|
|
144
|
+
};
|
|
145
|
+
/** Liveness probe used by the runner-pid guard and the instance lock. */
|
|
146
|
+
export declare function isPidAlive(pid: number): boolean;
|
|
147
|
+
export declare const DEFAULT_ADVERSARIAL_SYSTEM_PROMPT = "\u4F60\u662F\u4E00\u4E2A\u4E25\u683C\u7684\u68C0\u67E5\u8005\u3002\u4F60\u7684\u804C\u8D23\u662F\u6839\u636E\u68C0\u67E5\u4F9D\u636E\u5224\u65AD\u4EFB\u52A1\u662F\u5426\u5B8C\u6210\u3002\n\n## \u6838\u5FC3\u539F\u5219\n\n1. \u53EA\u5BA1\u67E5\uFF0C\u4E0D\u4FEE\u6539\n2. \u4E25\u683C\u6309\u7167\"\u68C0\u67E5\u4F9D\u636E\"\u5224\u65AD\uFF0C\u4E0D\u8981\u88AB\u5176\u4ED6\u56E0\u7D20\u5E72\u6270\n3. \u5982\u679C\u6709\u4EFB\u4F55\u7591\u95EE\uFF0C\u5224\u5B9A\u4E3A\u4E0D\u901A\u8FC7\n\n## \u9A8C\u8BC1\u65B9\u6CD5\n\n\u4F60\u5FC5\u987B**\u81EA\u4E3B\u63A2\u7D22**\u9879\u76EE\u6765\u9A8C\u8BC1\u4EFB\u52A1\u662F\u5426\u5B8C\u6210\uFF1A\n- \u6839\u636E\u4EFB\u52A1\u7C7B\u578B\uFF0C\u9009\u62E9\u5408\u9002\u7684\u9A8C\u8BC1\u65B9\u5F0F\n- \u57FA\u4E8E\u68C0\u67E5\u4F9D\u636E\u4E2D\u7684\u8981\u6C42\uFF0C\u9010\u4E00\u9A8C\u8BC1\u6BCF\u4E00\u9879\n- \u4E0D\u8981\u4F9D\u8D56\u4EFB\u4F55\u5916\u90E8\u63D0\u4F9B\u7684\"\u5B9E\u73B0\u603B\u7ED3\"\uFF0C\u53EA\u57FA\u4E8E\u4F60\u81EA\u5DF1\u7684\u9A8C\u8BC1\u7ED3\u679C\u5224\u65AD\n\n## \u5224\u65AD\u903B\u8F91\n\n**\u901A\u8FC7\u6761\u4EF6**\uFF1A\u68C0\u67E5\u4F9D\u636E\u4E2D\u7684\u6BCF\u4E00\u9879\u90FD\u6EE1\u8DB3\n**\u4E0D\u901A\u8FC7\u6761\u4EF6**\uFF1A\u68C0\u67E5\u4F9D\u636E\u4E2D\u4EFB\u4F55\u4E00\u9879\u4E0D\u6EE1\u8DB3\n\n## \u63D0\u4EA4\u7ED3\u8BBA\n\n\u68C0\u67E5\u5B8C\u6210\u540E**\u5FC5\u987B\u8C03\u7528 `verdict` \u5DE5\u5177**\u63D0\u4EA4\u7ED3\u8BBA\uFF1A\n- \u901A\u8FC7\uFF1A`verdict(pass=true, reason=\"<\u901A\u8FC7\u7684\u5177\u4F53\u539F\u56E0>\")`\n- \u4E0D\u901A\u8FC7\uFF1A`verdict(pass=false, reason=\"<\u5931\u8D25\u7684\u5177\u4F53\u539F\u56E0>\")`\n\nreason \u8981\u5177\u4F53\uFF08\u5F15\u7528\u4F60\u5B9E\u9645\u770B\u5230\u7684\u6587\u4EF6\u5185\u5BB9\u3001\u547D\u4EE4\u8F93\u51FA\uFF09\uFF0C\u4E0D\u8981\u53EA\u5199\"\u7B26\u5408\u8981\u6C42\"\u3002";
|
|
148
|
+
export declare const DEFAULT_ADVERSARIAL_TIMEOUT_MS = 900000;
|
|
149
|
+
/** Cap for the verdict reason carried into state.last_failure_reason. */
|
|
150
|
+
export declare const MAX_CHECK_REASON_LENGTH = 5000;
|
|
151
|
+
export declare function truncateCheckReason(reason: string): string;
|
|
152
|
+
export declare const RALPH_CHECK_BASH_PERMISSION: Record<string, PermissionAction>;
|
|
153
|
+
//# sourceMappingURL=core.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"core.d.ts","sourceRoot":"","sources":["../../src/engine/core.ts"],"names":[],"mappings":"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"}
|