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,318 @@
1
+ /**
2
+ * Non-interactive CLI verbs: `ralphflow status|list|doctor|cancel|continue`.
3
+ *
4
+ * These reach the same state machine as the ralphflow_* tools without
5
+ * starting the chat, so scripts and CI can inspect, unblock, and stop
6
+ * workflows. The formatting helpers are the engine's own, so headless output
7
+ * and the in-chat tool responses stay in sync. `continue` is the one verb
8
+ * that also drives the instance afterward (via a real runner, blocking until
9
+ * the next stopping point) rather than being a pure read/mutate-and-return —
10
+ * see its own doc comment for why that's still a bounded, one-shot operation
11
+ * and not a background daemon.
12
+ *
13
+ * There is no session id out here — every instance looks "owned by someone
14
+ * else", which is exactly right: a headless invocation is not a chat session.
15
+ */
16
+ import fs from "fs";
17
+ import path from "path";
18
+ import { createEngine, MANUAL_GATE_MARKER } from "./engine/core.js";
19
+ import { abortActiveCheck, adversarialCheck } from "./engine/check.js";
20
+ import { isInstanceGone, withInstanceLock } from "./engine/lock.js";
21
+ import { createRunner } from "./engine/runner.js";
22
+ import { formatSkillReport, loadSkillIndex } from "./engine/skills.js";
23
+ import { isSubWorkflowStep } from "./engine/types.js";
24
+ import { resolveContinueAction } from "./commands/tools.js";
25
+ export function runStatus(engine, explicit) {
26
+ const instances = engine.listInstances();
27
+ let target = null;
28
+ if (explicit) {
29
+ const wanted = String(explicit).trim();
30
+ const exact = instances.filter((i) => i.id === wanted);
31
+ const matches = exact.length > 0 ? exact : instances.filter((i) => i.id.startsWith(wanted));
32
+ if (matches.length === 1)
33
+ target = matches[0];
34
+ else if (matches.length === 0) {
35
+ return {
36
+ code: 1,
37
+ text: instances.length === 0
38
+ ? `没有找到实例 "${wanted}"。当前没有活跃的工作流实例。`
39
+ : `没有找到匹配 "${wanted}" 的实例。\n\n${engine.formatInstanceList(instances)}`,
40
+ };
41
+ }
42
+ else {
43
+ return { code: 1, text: `前缀 "${wanted}" 匹配到多个实例:\n\n${engine.formatInstanceList(matches)}` };
44
+ }
45
+ }
46
+ else if (instances.length === 1) {
47
+ target = instances[0];
48
+ }
49
+ if (!target) {
50
+ if (instances.length === 0)
51
+ return { code: 0, text: "没有活跃的工作流实例。运行 `ralphflow` 进入交互界面后用 /ralphflow-start 启动一个。" };
52
+ return {
53
+ code: 0,
54
+ text: engine.formatInstanceList(instances, "查看某个实例详情:`ralphflow status <实例ID>`(支持唯一前缀)。"),
55
+ };
56
+ }
57
+ const state = target.state;
58
+ const workflow = engine.loadWorkflow(state.workflow_name);
59
+ const currentStep = workflow ? engine.getStep(workflow, state.current_step) : null;
60
+ const driver = engine.foreignRunnerPid(target.id);
61
+ let status = `## 工作流状态
62
+
63
+ - **实例**: \`${target.id}\`
64
+ - **工作流**: ${state.workflow_name}
65
+ - **状态**: ${engine.instanceStatusLabel(target)}
66
+ - **当前步骤**: ${state.current_step}
67
+ - **当前阶段**: ${state.current_phase}
68
+ - **失败次数**: ${state.fail_count}
69
+ - **属主会话**: ${target.owner ? `\`${target.owner.slice(0, 8)}\`` : "无"}
70
+ - **最后活动**: ${engine.formatLastActivity(target.lastActivity)}`;
71
+ if (driver)
72
+ status += `\n- **驱动进程**: pid ${driver}(正在执行中)`;
73
+ if (state.last_failure_reason)
74
+ status += `\n- **上次失败原因**: ${state.last_failure_reason}`;
75
+ if (target.manualGate) {
76
+ status += `\n\n> 📋 该实例正在等待手动审查。审查完成后在 TUI 中调用 \`/ralphflow-continue\` 进入验证阶段。`;
77
+ }
78
+ if (currentStep) {
79
+ if (isSubWorkflowStep(currentStep)) {
80
+ status += `
81
+
82
+ ## 当前步骤详情
83
+
84
+ - **描述**: ${currentStep.desc}
85
+ - **类型**: 子工作流
86
+ - **子工作流**: ${currentStep.workflow}
87
+ - **输入**: ${currentStep.inputs ? JSON.stringify(currentStep.inputs) : "无"}
88
+ - **最大失败次数**: ${currentStep.max_fail_count}`;
89
+ }
90
+ else {
91
+ status += `
92
+
93
+ ## 当前步骤详情
94
+
95
+ - **描述**: ${currentStep.desc}
96
+ - **任务**: ${currentStep.do}
97
+ - **输入**: ${currentStep.input || "无"}
98
+ - **输出**: ${currentStep.output || "无"}
99
+ - **检查**: ${currentStep.check}
100
+ - **最大失败次数**: ${currentStep.max_fail_count}`;
101
+ }
102
+ }
103
+ if (instances.length > 1) {
104
+ status += `\n\n> ℹ️ 本目录共有 ${instances.length} 个活跃实例。\`ralphflow status\` 不带参数会列出全部。`;
105
+ }
106
+ return { code: 0, text: status };
107
+ }
108
+ export function runList(engine) {
109
+ const workflows = engine.listWorkflows();
110
+ let text = workflows.length > 0
111
+ ? `## 可用工作流\n\n${workflows.map((w) => `- **${w.name}**: ${w.desc}`).join("\n")}`
112
+ : "没有找到工作流。请在 .ralph-flow/workflows/ 目录创建工作流定义文件。";
113
+ const instances = engine.listInstances();
114
+ if (instances.length > 0) {
115
+ text += `\n\n---\n\n${engine.formatInstanceList(instances)}`;
116
+ }
117
+ return { code: 0, text };
118
+ }
119
+ export function runDoctor(engine) {
120
+ // Skills get the same treatment as workflows: a shadowed skill is exactly as
121
+ // confusing as a shadowed workflow ("I edited it and nothing changed").
122
+ const index = loadSkillIndex(engine.getRalphFlowDir(), engine.getGlobalConfigHome());
123
+ return { code: 0, text: `${engine.buildDoctorReport()}\n\n## Skill\n\n${formatSkillReport(index)}` };
124
+ }
125
+ /**
126
+ * Cancel an instance. Takes the cross-process lock so a cancel can't interleave
127
+ * with a runner committing a check verdict in another process. The runner there
128
+ * notices the instance is gone on its next state read and discards its result.
129
+ */
130
+ export async function runCancel(engine, explicit) {
131
+ const instances = engine.listInstances();
132
+ if (instances.length === 0)
133
+ return { code: 1, text: "没有活跃的工作流实例。" };
134
+ let target = null;
135
+ if (explicit) {
136
+ const wanted = String(explicit).trim();
137
+ const exact = instances.filter((i) => i.id === wanted);
138
+ const matches = exact.length > 0 ? exact : instances.filter((i) => i.id.startsWith(wanted));
139
+ if (matches.length === 1)
140
+ target = matches[0];
141
+ else if (matches.length === 0)
142
+ return { code: 1, text: `没有找到匹配 "${wanted}" 的实例。\n\n${engine.formatInstanceList(instances)}` };
143
+ else
144
+ return { code: 1, text: `前缀 "${wanted}" 匹配到 ${matches.length} 个实例,请提供更长的前缀:\n\n${engine.formatInstanceList(matches)}` };
145
+ }
146
+ else if (instances.length === 1) {
147
+ target = instances[0];
148
+ }
149
+ else {
150
+ return { code: 1, text: engine.formatInstanceList(instances, "存在多个实例,请指定要取消的实例:`ralphflow cancel <实例ID>`(支持唯一前缀)。") };
151
+ }
152
+ const instId = target.id;
153
+ const state = engine.readState(instId);
154
+ const workflowName = state ? state.workflow_name : instId;
155
+ const driver = engine.foreignRunnerPid(instId);
156
+ try {
157
+ const reportPath = await withInstanceLock(engine.getInstanceDir(instId), instId, () => {
158
+ engine.logEvent(instId, "info", "workflow_cancelled", { workflow: workflowName, instance: instId });
159
+ return engine.destroyInstance(instId, "cancelled");
160
+ });
161
+ let text = `工作流 "${workflowName}"(实例 \`${instId}\`)已取消。`;
162
+ if (reportPath)
163
+ text += `\n执行报告:${path.relative(engine.projectDir, reportPath)}`;
164
+ if (driver) {
165
+ // destroyInstance's abort handles only reach sessions in THIS process.
166
+ text += `\n\n> ⚠️ 该实例正被 pid ${driver} 的 ralph 进程驱动。它在下一次读取状态时会发现实例已消失并停止;已在途的模型调用可能还会跑完当前一轮。`;
167
+ }
168
+ return { code: 0, text };
169
+ }
170
+ catch (e) {
171
+ if (isInstanceGone(e))
172
+ return { code: 0, text: `实例 \`${instId}\` 已经不存在(可能刚被其他进程取消或完成)。` };
173
+ return { code: 1, text: `取消失败:${e.message}` };
174
+ }
175
+ }
176
+ /**
177
+ * `ralphflow continue [实例ID]` — approve a manual review / resume a paused
178
+ * workflow / recover from a crash, without an interactive session. Reuses
179
+ * ralphflow_continue's exact state machine (`resolveContinueAction`,
180
+ * commands/tools.ts) — the only difference is what happens after: an
181
+ * interactive session hands off to the run view; this drives the instance
182
+ * with a real runner and blocks until it reaches its NEXT stopping point
183
+ * (another gate/pause, or completion) instead of returning immediately.
184
+ * That is a deliberate, bounded scope for "headless" — it does not turn this
185
+ * into a background daemon; the process exits once the instance stops moving
186
+ * on its own again, exactly as if a human were watching it.
187
+ *
188
+ * `attached: true` always — a one-shot CLI invocation has no standing session
189
+ * identity to already "be" the owner of anything, so the crash-recovery
190
+ * re-attach branch (resolveContinueAction's #5) is always reachable here,
191
+ * which is the right default for a headless caller.
192
+ *
193
+ * `runnerDeps` is a test seam (real callers never pass it) — same shape as
194
+ * `RunnerDeps` in engine/runner.ts, so a test can inject `createSession`/
195
+ * `checkDeps` fakes to drive the "runs to the next stop" behavior without
196
+ * API credentials, the same way runner.test.ts already does for the runner
197
+ * itself.
198
+ */
199
+ export async function runContinue(engine, explicit, runnerDeps) {
200
+ const instances = engine.listInstances();
201
+ if (instances.length === 0)
202
+ return { code: 1, text: "没有活跃的工作流实例。" };
203
+ let target = null;
204
+ if (explicit) {
205
+ const wanted = String(explicit).trim();
206
+ const exact = instances.filter((i) => i.id === wanted);
207
+ const matches = exact.length > 0 ? exact : instances.filter((i) => i.id.startsWith(wanted));
208
+ if (matches.length === 1)
209
+ target = matches[0];
210
+ else if (matches.length === 0)
211
+ return { code: 1, text: `没有找到匹配 "${wanted}" 的实例。\n\n${engine.formatInstanceList(instances)}` };
212
+ else
213
+ return { code: 1, text: `前缀 "${wanted}" 匹配到 ${matches.length} 个实例,请提供更长的前缀:\n\n${engine.formatInstanceList(matches)}` };
214
+ }
215
+ else if (instances.length === 1) {
216
+ target = instances[0];
217
+ }
218
+ else {
219
+ return { code: 1, text: engine.formatInstanceList(instances, "存在多个实例,请指定要继续的实例:`ralphflow continue <实例ID>`(支持唯一前缀)。") };
220
+ }
221
+ const instId = target.id;
222
+ const driver = engine.foreignRunnerPid(instId);
223
+ if (driver) {
224
+ return { code: 1, text: `实例 \`${instId}\` 正被另一个 ralph 进程(pid ${driver})驱动。请在那个进程里操作它,或先结束该进程。` };
225
+ }
226
+ const sessionId = `ralphflow-headless-${process.pid}-${Date.now().toString(36)}`;
227
+ let response;
228
+ try {
229
+ response = await withInstanceLock(engine.getInstanceDir(instId), instId, () => resolveContinueAction(engine, instId, sessionId, /* attached */ true));
230
+ }
231
+ catch (e) {
232
+ if (isInstanceGone(e))
233
+ return { code: 0, text: `实例 \`${instId}\` 已经不存在(可能刚被其他进程取消或完成)。` };
234
+ return { code: 1, text: `继续失败:${e.message}` };
235
+ }
236
+ if (!engine.instanceExists(instId)) {
237
+ return { code: 0, text: response };
238
+ }
239
+ // Drive it to its next stopping point — same bounded semantics as watching
240
+ // it in an interactive session, just without a UI.
241
+ const runner = createRunner(engine, {}, {
242
+ skillPaths: () => loadSkillIndex(engine.getRalphFlowDir(), engine.getGlobalConfigHome()).paths,
243
+ ...runnerDeps,
244
+ });
245
+ engine.setAbortActiveStep?.(runner.abortActiveStep);
246
+ runner.ensureRunning(instId);
247
+ await runner.idle();
248
+ let outcome;
249
+ if (!engine.instanceExists(instId)) {
250
+ outcome = "工作流已完成。";
251
+ const reports = fs.readdirSync(engine.getReportsDir()).filter((f) => f.startsWith(instId)).sort();
252
+ if (reports.length > 0)
253
+ outcome += `\n执行报告:${path.relative(engine.projectDir, path.join(engine.getReportsDir(), reports[reports.length - 1]))}`;
254
+ }
255
+ else if (engine.markerExists(MANUAL_GATE_MARKER, instId)) {
256
+ outcome = "工作流到达人工审查门,等待审查。再次运行 `ralphflow continue` 通过。";
257
+ }
258
+ else {
259
+ const finalState = engine.readState(instId);
260
+ outcome = finalState?.paused
261
+ ? `工作流再次暂停(${finalState.pause_reason || "未知原因"}):${finalState.last_failure_reason || "(无详情)"}`
262
+ : "工作流仍在运行中。";
263
+ }
264
+ return { code: 0, text: `${response}\n\n---\n\n${outcome}` };
265
+ }
266
+ /**
267
+ * `ralphflow _check-once <workflow> <step> [task]` — run ONE real CHECK against the
268
+ * current directory and print the verdict. Hidden and underscore-prefixed: it is
269
+ * the vertical smoke test for the check path (real model, real sandbox) without
270
+ * needing a whole workflow run. Creates a throwaway instance and destroys it.
271
+ */
272
+ async function runCheckOnce(engine, args) {
273
+ const [workflowName, stepId, ...taskParts] = args;
274
+ if (!workflowName || !stepId) {
275
+ return { code: 1, text: "用法:ralphflow _check-once <工作流> <步骤ID> [任务描述]" };
276
+ }
277
+ const problems = [];
278
+ const workflow = engine.loadWorkflow(workflowName, problems);
279
+ if (!workflow)
280
+ return { code: 1, text: `工作流 "${workflowName}" 无法加载:${problems[0] || "未找到"}` };
281
+ const step = engine.getStep(workflow, stepId);
282
+ if (!step)
283
+ return { code: 1, text: `工作流 "${workflowName}" 中没有步骤 "${stepId}"` };
284
+ if (isSubWorkflowStep(step))
285
+ return { code: 1, text: `步骤 "${stepId}" 是子工作流步骤,没有 check 阶段` };
286
+ const task = taskParts.join(" ") || "check-once 冒烟测试";
287
+ const instId = engine.generateInstanceId(workflowName);
288
+ fs.mkdirSync(engine.getInstanceDir(instId), { recursive: true });
289
+ engine.writeArtifactsDirName(instId, task);
290
+ engine.writeState({
291
+ active: true, workflow_name: workflowName, current_step: stepId, current_phase: "check",
292
+ fail_count: 0, user_task: task, paused: false,
293
+ }, instId);
294
+ try {
295
+ const prompt = engine.buildCheckPrompt(instId, step, task);
296
+ process.stderr.write(`[check-once] 实例 ${instId},模型 ${workflow.adversarial_check?.model || "默认"}\n`);
297
+ const result = await adversarialCheck(engine, instId, step, prompt, task, workflow.adversarial_check, (line) => process.stderr.write(`[bash] ${line}\n`));
298
+ const verdict = result.infra ? "INFRA(验证未能运行,不计失败次数)" : result.passed ? "PASS" : "FAIL";
299
+ return { code: result.passed ? 0 : 1, text: `## 检查结论:${verdict}\n\n${result.reason}` };
300
+ }
301
+ finally {
302
+ engine.destroyInstance(instId, "cancelled");
303
+ }
304
+ }
305
+ export async function runHeadless(verb, args, cwd) {
306
+ const engine = createEngine(cwd, { abortActiveCheck });
307
+ switch (verb) {
308
+ case "status": return runStatus(engine, args[0]);
309
+ case "list": return runList(engine);
310
+ case "doctor": return runDoctor(engine);
311
+ case "cancel": return await runCancel(engine, args[0]);
312
+ case "continue": return await runContinue(engine, args[0]);
313
+ case "_check-once": return await runCheckOnce(engine, args);
314
+ default:
315
+ return { code: 1, text: `未知命令:${verb}\n\n可用命令:status、list、doctor、cancel、continue。不带命令运行 \`ralphflow\` 进入交互界面。` };
316
+ }
317
+ }
318
+ //# sourceMappingURL=headless.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"headless.js","sourceRoot":"","sources":["../src/headless.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,135 @@
1
+ /**
2
+ * Anti-corruption layer over the Pi SDK.
3
+ *
4
+ * This is the ONLY file in the package allowed to import @earendil-works/*.
5
+ * Pi is on 0.x with a fast release cadence (244 releases by v0.80.7), so the
6
+ * blast radius of an API change has to stay inside these ~250 lines: everything
7
+ * else talks to the narrow interfaces below and to our own normalized event
8
+ * type, never to Pi's.
9
+ *
10
+ * Upgrade drill: bump the pinned version → fix this file → run the adapter
11
+ * contract tests → run the CHECK smoke (`ralph _check-once`).
12
+ */
13
+ import { defineTool, CURRENT_SESSION_VERSION, loadSkillsFromDir, type Skill, type ToolDefinition } from "@earendil-works/pi-coding-agent";
14
+ export { defineTool, loadSkillsFromDir, CURRENT_SESSION_VERSION, type Skill, type ToolDefinition };
15
+ /** Pi's read-only built-in tool set. Deliberately excludes bash: the verifier's
16
+ * only shell access is our whitelisted check_bash custom tool. This matches the
17
+ * Claude version's `--allowedTools "Read(*) Glob(*) Grep(*) …"` allow-list. */
18
+ export declare const READ_ONLY_TOOL_NAMES: readonly ["read", "grep", "find", "ls"];
19
+ /** Full coding tool set for DO steps. */
20
+ export declare const CODING_TOOL_NAMES: readonly ["read", "bash", "edit", "write", "grep", "find", "ls"];
21
+ export type StepEvent = {
22
+ type: "text";
23
+ delta: string;
24
+ } | {
25
+ type: "reasoning";
26
+ delta: string;
27
+ } | {
28
+ type: "tool_start";
29
+ toolCallId: string;
30
+ toolName: string;
31
+ args: unknown;
32
+ } | {
33
+ type: "tool_end";
34
+ toolCallId: string;
35
+ toolName: string;
36
+ isError: boolean;
37
+ text: string;
38
+ } | {
39
+ type: "turn_end";
40
+ } | {
41
+ type: "agent_end";
42
+ } | {
43
+ type: "compaction_end";
44
+ } | {
45
+ type: "error";
46
+ message: string;
47
+ };
48
+ export type StepEventListener = (event: StepEvent) => void;
49
+ export interface SessionHandle {
50
+ /** Send a prompt and resolve when the agent settles (turn complete). */
51
+ prompt(text: string): Promise<void>;
52
+ /** Queue a message for the next turn. */
53
+ followUp(text: string): Promise<void>;
54
+ /** Redirect the turn currently streaming. */
55
+ steer(text: string): Promise<void>;
56
+ /** Subscribe to normalized events; returns an unsubscribe function. */
57
+ subscribe(listener: StepEventListener): () => void;
58
+ /** Abort whatever is in flight. */
59
+ abort(): Promise<void>;
60
+ /** Release resources. Safe to call twice. */
61
+ dispose(): void;
62
+ /** Absolute path of this session's JSONL, when persisted. */
63
+ readonly jsonlPath: string | null;
64
+ }
65
+ export interface ResolvedModel {
66
+ /** Opaque to callers — only ever handed back to createStepSession/createCheckSession. */
67
+ model: unknown;
68
+ thinkingLevel?: string;
69
+ warning?: string;
70
+ error?: string;
71
+ }
72
+ /**
73
+ * Resolve a "provider/model" or "provider/model:thinking" string.
74
+ *
75
+ * This is where adversarial_check.model gets its cross-provider superpower for
76
+ * free: pi-ai resolves any provider, so a workflow can verify Claude's work with
77
+ * GPT without the engine knowing anything about either.
78
+ *
79
+ * Returns `{ error }` rather than throwing — callers fall back to the session's
80
+ * default model, matching the plugin versions' "unresolvable model falls back"
81
+ * behavior.
82
+ */
83
+ export declare function resolveModel(spec: string): Promise<ResolvedModel>;
84
+ export interface CreateSessionOptions {
85
+ cwd: string;
86
+ /** Resolved model, or undefined to use Pi's configured default. */
87
+ model?: unknown;
88
+ thinkingLevel?: string;
89
+ /** Built-in tool allowlist. */
90
+ tools: readonly string[];
91
+ customTools?: ToolDefinition[];
92
+ /** Replaces the whole system prompt when set. */
93
+ systemPrompt?: string;
94
+ /** Appended to the default system prompt when set (used for the skill catalog). */
95
+ appendSystemPrompt?: string;
96
+ /**
97
+ * Persist the transcript into this directory, one session per directory.
98
+ *
99
+ * Pi derives its own filename (`<timestamp>_<id>.jsonl`) and gives no way to
100
+ * dictate it, so the unit we control is the directory: the runner passes one
101
+ * dir per step attempt. A dir that already holds a .jsonl is RESUMED — that is
102
+ * what lets a check-failed retry continue the same step session, and a crashed
103
+ * run pick its step session back up. Omit for an unpersisted session.
104
+ */
105
+ sessionDir?: string;
106
+ /** Disable auto-compaction (steps are short; determinism beats headroom). */
107
+ disableCompaction?: boolean;
108
+ /** Don't load the user's pi extensions into this session. */
109
+ noExtensions?: boolean;
110
+ /**
111
+ * Absolute SKILL.md paths to offer this session. Pi appends a catalog (name,
112
+ * description, absolute location) to the system prompt and the model loads a
113
+ * skill with the `read` tool — no custom tool involved.
114
+ */
115
+ skillPaths?: string[];
116
+ /** Load no skills at all, not even the user's own. */
117
+ noSkills?: boolean;
118
+ }
119
+ /** The existing transcript in a session dir, if any. */
120
+ export declare function findSessionFile(sessionDir: string): string | null;
121
+ /** A DO step session: full coding tools, persisted, fresh context per step. */
122
+ export declare function createStepSession(options: Omit<CreateSessionOptions, "tools"> & {
123
+ tools?: readonly string[];
124
+ }): Promise<SessionHandle>;
125
+ /**
126
+ * A CHECK session: read-only built-ins only.
127
+ *
128
+ * The read-only guarantee is structural, not prompted — `edit`/`write`/`bash`
129
+ * are simply not in the tool set, so the verifier cannot mutate the workspace it
130
+ * is judging even if the model decides it wants to.
131
+ */
132
+ export declare function createCheckSession(options: Omit<CreateSessionOptions, "tools" | "noExtensions" | "skillPaths" | "noSkills">): Promise<SessionHandle>;
133
+ /** The pinned Pi version, surfaced for diagnostics. */
134
+ export declare function piVersion(): string;
135
+ //# sourceMappingURL=adapter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"adapter.d.ts","sourceRoot":"","sources":["../../src/pi/adapter.ts"],"names":[],"mappings":"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"}