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.
Files changed (131) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +428 -0
  3. package/dist/cli.d.ts +9 -0
  4. package/dist/cli.d.ts.map +1 -0
  5. package/dist/cli.js +56 -0
  6. package/dist/cli.js.map +1 -0
  7. package/dist/commands/prompts.d.ts +25 -0
  8. package/dist/commands/prompts.d.ts.map +1 -0
  9. package/dist/commands/prompts.js +249 -0
  10. package/dist/commands/prompts.js.map +1 -0
  11. package/dist/commands/tools.d.ts +47 -0
  12. package/dist/commands/tools.d.ts.map +1 -0
  13. package/dist/commands/tools.js +633 -0
  14. package/dist/commands/tools.js.map +1 -0
  15. package/dist/engine/check-bash.d.ts +121 -0
  16. package/dist/engine/check-bash.d.ts.map +1 -0
  17. package/dist/engine/check-bash.js +373 -0
  18. package/dist/engine/check-bash.js.map +1 -0
  19. package/dist/engine/check.d.ts +47 -0
  20. package/dist/engine/check.d.ts.map +1 -0
  21. package/dist/engine/check.js +298 -0
  22. package/dist/engine/check.js.map +1 -0
  23. package/dist/engine/core.d.ts +153 -0
  24. package/dist/engine/core.d.ts.map +1 -0
  25. package/dist/engine/core.js +1984 -0
  26. package/dist/engine/core.js.map +1 -0
  27. package/dist/engine/lock.d.ts +27 -0
  28. package/dist/engine/lock.d.ts.map +1 -0
  29. package/dist/engine/lock.js +121 -0
  30. package/dist/engine/lock.js.map +1 -0
  31. package/dist/engine/runner.d.ts +108 -0
  32. package/dist/engine/runner.d.ts.map +1 -0
  33. package/dist/engine/runner.js +510 -0
  34. package/dist/engine/runner.js.map +1 -0
  35. package/dist/engine/skills.d.ts +53 -0
  36. package/dist/engine/skills.d.ts.map +1 -0
  37. package/dist/engine/skills.js +109 -0
  38. package/dist/engine/skills.js.map +1 -0
  39. package/dist/engine/step-tools.d.ts +22 -0
  40. package/dist/engine/step-tools.d.ts.map +1 -0
  41. package/dist/engine/step-tools.js +45 -0
  42. package/dist/engine/step-tools.js.map +1 -0
  43. package/dist/engine/types.d.ts +136 -0
  44. package/dist/engine/types.d.ts.map +1 -0
  45. package/dist/engine/types.js +20 -0
  46. package/dist/engine/types.js.map +1 -0
  47. package/dist/headless.d.ts +57 -0
  48. package/dist/headless.d.ts.map +1 -0
  49. package/dist/headless.js +318 -0
  50. package/dist/headless.js.map +1 -0
  51. package/dist/pi/adapter.d.ts +135 -0
  52. package/dist/pi/adapter.d.ts.map +1 -0
  53. package/dist/pi/adapter.js +231 -0
  54. package/dist/pi/adapter.js.map +1 -0
  55. package/dist/pi/interactive.d.ts +28 -0
  56. package/dist/pi/interactive.d.ts.map +1 -0
  57. package/dist/pi/interactive.js +58 -0
  58. package/dist/pi/interactive.js.map +1 -0
  59. package/dist/pi/tui.d.ts +12 -0
  60. package/dist/pi/tui.d.ts.map +1 -0
  61. package/dist/pi/tui.js +12 -0
  62. package/dist/pi/tui.js.map +1 -0
  63. package/dist/tui/app.d.ts +25 -0
  64. package/dist/tui/app.d.ts.map +1 -0
  65. package/dist/tui/app.js +47 -0
  66. package/dist/tui/app.js.map +1 -0
  67. package/dist/tui/embed.d.ts +42 -0
  68. package/dist/tui/embed.d.ts.map +1 -0
  69. package/dist/tui/embed.js +38 -0
  70. package/dist/tui/embed.js.map +1 -0
  71. package/dist/tui/extension.d.ts +88 -0
  72. package/dist/tui/extension.d.ts.map +1 -0
  73. package/dist/tui/extension.js +114 -0
  74. package/dist/tui/extension.js.map +1 -0
  75. package/dist/tui/history-editor.d.ts +38 -0
  76. package/dist/tui/history-editor.d.ts.map +1 -0
  77. package/dist/tui/history-editor.js +55 -0
  78. package/dist/tui/history-editor.js.map +1 -0
  79. package/dist/tui/launcher.d.ts +24 -0
  80. package/dist/tui/launcher.d.ts.map +1 -0
  81. package/dist/tui/launcher.js +97 -0
  82. package/dist/tui/launcher.js.map +1 -0
  83. package/dist/tui/render.d.ts +87 -0
  84. package/dist/tui/render.d.ts.map +1 -0
  85. package/dist/tui/render.js +266 -0
  86. package/dist/tui/render.js.map +1 -0
  87. package/dist/tui/run-app.d.ts +49 -0
  88. package/dist/tui/run-app.d.ts.map +1 -0
  89. package/dist/tui/run-app.js +317 -0
  90. package/dist/tui/run-app.js.map +1 -0
  91. package/dist/tui/run-model.d.ts +162 -0
  92. package/dist/tui/run-model.d.ts.map +1 -0
  93. package/dist/tui/run-model.js +280 -0
  94. package/dist/tui/run-model.js.map +1 -0
  95. package/dist/tui/run-view.d.ts +71 -0
  96. package/dist/tui/run-view.d.ts.map +1 -0
  97. package/dist/tui/run-view.js +167 -0
  98. package/dist/tui/run-view.js.map +1 -0
  99. package/dist/tui/welcome-header.d.ts +40 -0
  100. package/dist/tui/welcome-header.d.ts.map +1 -0
  101. package/dist/tui/welcome-header.js +90 -0
  102. package/dist/tui/welcome-header.js.map +1 -0
  103. package/package.json +55 -0
  104. package/skills/c-to-rust-audit/SKILL.md +67 -0
  105. package/skills/c-to-rust-implement/SKILL.md +151 -0
  106. package/skills/c-to-rust-implement/references/c-to-rust-patterns.md +86 -0
  107. package/skills/c-to-rust-implement/references/conditional-compilation.md +47 -0
  108. package/skills/c-to-rust-implement/references/crate-reference.md +15 -0
  109. package/skills/c-to-rust-implement/references/error-strategies.md +80 -0
  110. package/skills/c-to-rust-implement/references/inline-asm.md +37 -0
  111. package/skills/c-to-rust-plan/SKILL.md +166 -0
  112. package/skills/c-to-rust-plan/references/detection-commands.md +66 -0
  113. package/skills/c-to-rust-test-gen/SKILL.md +130 -0
  114. package/skills/c-to-rust-test-gen/references/proptest-patterns.md +81 -0
  115. package/skills/c-to-rust-test-gen/references/test-porting.md +56 -0
  116. package/skills/c-to-rust-validate/SKILL.md +121 -0
  117. package/skills/everything2rust-audit/SKILL.md +69 -0
  118. package/skills/everything2rust-design/SKILL.md +121 -0
  119. package/skills/everything2rust-design/references/domain-playbooks.md +68 -0
  120. package/skills/everything2rust-design/references/paradigm-map.md +99 -0
  121. package/skills/everything2rust-implement/SKILL.md +101 -0
  122. package/skills/everything2rust-spec/SKILL.md +86 -0
  123. package/skills/everything2rust-spec/references/oracle-strategies.md +96 -0
  124. package/skills/everything2rust-survey/SKILL.md +99 -0
  125. package/skills/everything2rust-test-gen/SKILL.md +68 -0
  126. package/skills/everything2rust-test-gen/references/harness-patterns.md +186 -0
  127. package/skills/everything2rust-validate/SKILL.md +85 -0
  128. package/workflows/c-to-rust.yaml +202 -0
  129. package/workflows/everything2rust.yaml +259 -0
  130. package/workflows/loop.yaml +68 -0
  131. 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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"}