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 @@
1
+ {"version":3,"file":"run-app.js","sourceRoot":"","sources":["../../src/tui/run-app.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,162 @@
1
+ /**
2
+ * The run view's state, as a pure reducer over runner events.
3
+ *
4
+ * This is the heart of Direction A: instead of a chat transcript relayed by a
5
+ * supervisor LLM, the run view is a deterministic projection of what the engine
6
+ * is doing. Everything the user sees is computed here from structured events —
7
+ * no model, no text parsing — so the whole thing is unit-testable without a
8
+ * terminal or an API key. The pi-tui renderer (run-view.ts) is a thin function
9
+ * of this state.
10
+ *
11
+ * Design choices worth stating:
12
+ * - The step list is the spine. It comes from the workflow definition, so the
13
+ * user always sees the whole pipeline and where they are in it — the thing a
14
+ * chat transcript could never show.
15
+ * - Each step keeps its OWN stream (blocks). Switching the active step swaps
16
+ * which stream is shown; nothing is lost, and a retry appends to the same
17
+ * step. This mirrors the engine's "fresh session per step" faithfully: one
18
+ * visible timeline per step.
19
+ * - Streaming deltas are coalesced into blocks (a run of reasoning, a run of
20
+ * text, one block per tool call) so the renderer sees stable structure, not a
21
+ * token firehose.
22
+ */
23
+ import type { RalphFlowState, WorkflowDef } from "../engine/types.js";
24
+ import type { StepEvent } from "../pi/adapter.js";
25
+ export type RunStatus = "running" | "gate" | "paused" | "stalled" | "completed" | "cancelled";
26
+ export type StepStatus = "pending" | "do" | "check" | "passed" | "failed" | "gate" | "done";
27
+ export interface StepView {
28
+ id: string;
29
+ desc: string;
30
+ isSubWorkflow: boolean;
31
+ status: StepStatus;
32
+ attempts: number;
33
+ /** The most recent verdict reason for this step, if any. */
34
+ lastReason?: string;
35
+ }
36
+ export type StreamBlock = {
37
+ kind: "reasoning";
38
+ text: string;
39
+ } | {
40
+ kind: "text";
41
+ text: string;
42
+ } | {
43
+ kind: "tool";
44
+ name: string;
45
+ arg: string;
46
+ status: "running" | "ok" | "error";
47
+ result?: string;
48
+ } | {
49
+ kind: "phase";
50
+ phase: "do" | "check";
51
+ attempt: number;
52
+ } | {
53
+ kind: "verdict";
54
+ passed: boolean;
55
+ infra: boolean;
56
+ reason: string;
57
+ } | {
58
+ kind: "notice";
59
+ text: string;
60
+ } | {
61
+ kind: "user";
62
+ text: string;
63
+ };
64
+ export interface RunModel {
65
+ instanceId: string;
66
+ workflowName: string;
67
+ workflowDesc: string;
68
+ task: string;
69
+ steps: StepView[];
70
+ /** Which step's stream is shown, and whether DO or CHECK is live. */
71
+ activeStepId: string | null;
72
+ activePhase: "do" | "check" | null;
73
+ /**
74
+ * When the current phase started (Date.now() epoch ms), so the status bar
75
+ * can show elapsed time — the only way to tell "still thinking" from
76
+ * "stuck" during a long silent stretch (no reasoning/tool events at all)
77
+ * is a ticking clock, not the stream itself. null whenever activePhase is.
78
+ */
79
+ phaseStartedAt: number | null;
80
+ status: RunStatus;
81
+ /** Reason string for gate / pause / stall — what the user needs to know now. */
82
+ statusDetail: string;
83
+ reportPath?: string;
84
+ /** Per-step live stream, keyed by step id. */
85
+ streams: Map<string, StreamBlock[]>;
86
+ /** Bumped on every change, so the renderer can cheaply tell "did anything happen". */
87
+ revision: number;
88
+ }
89
+ /** Build the initial model from the workflow definition — the whole pipeline up front. */
90
+ export declare function initRunModel(instanceId: string, workflow: WorkflowDef, task: string): RunModel;
91
+ export declare function applyStepStart(m: RunModel, stepId: string, phase: "do" | "check", attempt: number): RunModel;
92
+ export declare function applyStepEvent(m: RunModel, stepId: string, phase: "do" | "check", event: StepEvent): RunModel;
93
+ export declare function applyVerdict(m: RunModel, stepId: string, result: {
94
+ passed: boolean;
95
+ infra?: boolean;
96
+ reason: string;
97
+ }): RunModel;
98
+ /** A human message steered into the active DO session — the other half of the conversation. */
99
+ export declare function applyUserMessage(m: RunModel, stepId: string, text: string): RunModel;
100
+ export declare function applyGate(m: RunModel, stepId: string): RunModel;
101
+ /**
102
+ * Reconstruct a just-built model's position from persisted state, for a view
103
+ * that's attaching to an instance instead of having launched it itself
104
+ * (ralphflow_watch / ralphflow_continue landing back in the view / a fresh
105
+ * process adopting a live instance at boot). Without this, `activeStepId`
106
+ * starts null and stays null until the next runner event happens to fire —
107
+ * which may be a long silent stretch away, or for a reattach to something
108
+ * already past its first phase-start event, MAY NEVER FIRE AGAIN for the
109
+ * current phase at all. `renderStream` shows nothing when `activeStepId` is
110
+ * null (see render.ts), so the practical symptom was exactly "the view is
111
+ * empty" — right up until, for a genuinely fresh start, the real event
112
+ * finally arrived and fixed itself, which is why this was easy to miss in
113
+ * testing a fresh `ralphflow_start` but reliably broke on reattach.
114
+ *
115
+ * Deliberately does NOT touch the stream (no phase divider, no notice) — only
116
+ * `activeStepId`/`activePhase`/`phaseStartedAt`/step statuses. That makes it
117
+ * safe to call unconditionally, even in the ambiguous window where a fresh
118
+ * start's real `onStepStart` hasn't fired yet: this just pre-sets the exact
119
+ * same values that event will also set moments later (no visible duplicate,
120
+ * since nothing was pushed to the stream), so there's no need to distinguish
121
+ * "genuine reattach" from "fresh start, event just hasn't arrived yet" at
122
+ * all. `phaseStartedAt` is set to "now" as a floor, not the true start time
123
+ * (which isn't persisted anywhere reattach can read) — an elapsed clock that
124
+ * understates reality is still far more useful than one that's frozen or
125
+ * absent.
126
+ *
127
+ * `passedStepIds`: step ids with a persisted "check passed" record (see
128
+ * engine.loadStepRecords) — NOT inferred from position in the workflow's
129
+ * step array, because `on_fail` can route backward and a retry loop would
130
+ * make that guess wrong. Marked "done" so the step strip doesn't lie and
131
+ * show already-finished work as still-pending.
132
+ */
133
+ export declare function primeForAttach(m: RunModel, state: RalphFlowState, passedStepIds: string[]): RunModel;
134
+ export declare function applyPaused(m: RunModel, state: RalphFlowState): RunModel;
135
+ export declare function applyStalled(m: RunModel, stepId: string, attempts: number): RunModel;
136
+ export declare function applyCompleted(m: RunModel, reportPath?: string): RunModel;
137
+ export declare function applyCancelled(m: RunModel): RunModel;
138
+ /** A short, single-line description of a tool call's key argument. */
139
+ export declare function summarizeArg(args: unknown): string;
140
+ export declare function firstLine(text: string): string;
141
+ /** Keep a tool result readable but bounded (diffs and command output show; huge dumps don't). */
142
+ export declare function capText(text: string, maxChars: number): string;
143
+ /**
144
+ * Overall progress as (completed, total) for the header/status bar.
145
+ *
146
+ * A step earns "completed" the moment its own CHECK passes — status
147
+ * "passed". It's promoted to "done" only in applyCompleted, when the whole
148
+ * *workflow* finishes (a step strip icon convention, so the final screen's
149
+ * step list reads as uniformly "done" rather than a mix of "passed"/"done").
150
+ * That promotion happens once, at the very end — so counting only "done"
151
+ * here made this always read 0/N for the entire run, only jumping to N/N at
152
+ * the last moment. Both statuses mean the same thing from progress's point
153
+ * of view: this step is behind you.
154
+ */
155
+ export declare function progress(m: RunModel): {
156
+ done: number;
157
+ total: number;
158
+ };
159
+ /** Is the run waiting on the user right now? */
160
+ export declare function needsUser(m: RunModel): boolean;
161
+ export declare function isTerminal(m: RunModel): boolean;
162
+ //# sourceMappingURL=run-model.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"run-model.d.ts","sourceRoot":"","sources":["../../src/tui/run-model.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;AAEH,OAAO,KAAK,EAAE,cAAc,EAAW,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAE/E,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAElD,MAAM,MAAM,SAAS,GACjB,SAAS,GACT,MAAM,GACN,QAAQ,GACR,SAAS,GACT,WAAW,GACX,WAAW,CAAC;AAEhB,MAAM,MAAM,UAAU,GAAG,SAAS,GAAG,IAAI,GAAG,OAAO,GAAG,QAAQ,GAAG,QAAQ,GAAG,MAAM,GAAG,MAAM,CAAC;AAE5F,MAAM,WAAW,QAAQ;IACvB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,aAAa,EAAE,OAAO,CAAC;IACvB,MAAM,EAAE,UAAU,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;IACjB,4DAA4D;IAC5D,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,MAAM,WAAW,GACnB;IAAE,IAAI,EAAE,WAAW,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GACnC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GAC9B;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,SAAS,GAAG,IAAI,GAAG,OAAO,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAA;CAAE,GAChG;IAAE,IAAI,EAAE,OAAO,CAAC;IAAC,KAAK,EAAE,IAAI,GAAG,OAAO,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,GACzD;IAAE,IAAI,EAAE,SAAS,CAAC;IAAC,MAAM,EAAE,OAAO,CAAC;IAAC,KAAK,EAAE,OAAO,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,GACpE;IAAE,IAAI,EAAE,QAAQ,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GAChC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAAC;AAEnC,MAAM,WAAW,QAAQ;IACvB,UAAU,EAAE,MAAM,CAAC;IACnB,YAAY,EAAE,MAAM,CAAC;IACrB,YAAY,EAAE,MAAM,CAAC;IACrB,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,QAAQ,EAAE,CAAC;IAClB,qEAAqE;IACrE,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,WAAW,EAAE,IAAI,GAAG,OAAO,GAAG,IAAI,CAAC;IACnC;;;;;OAKG;IACH,cAAc,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9B,MAAM,EAAE,SAAS,CAAC;IAClB,gFAAgF;IAChF,YAAY,EAAE,MAAM,CAAC;IACrB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,8CAA8C;IAC9C,OAAO,EAAE,GAAG,CAAC,MAAM,EAAE,WAAW,EAAE,CAAC,CAAC;IACpC,sFAAsF;IACtF,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,0FAA0F;AAC1F,wBAAgB,YAAY,CAAC,UAAU,EAAE,MAAM,EAAE,QAAQ,EAAE,WAAW,EAAE,IAAI,EAAE,MAAM,GAAG,QAAQ,CAuB9F;AAwBD,wBAAgB,cAAc,CAAC,CAAC,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,GAAG,OAAO,EAAE,OAAO,EAAE,MAAM,GAAG,QAAQ,CAQ5G;AAED,wBAAgB,cAAc,CAAC,CAAC,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,GAAG,OAAO,EAAE,KAAK,EAAE,SAAS,GAAG,QAAQ,CAiC7G;AAED,wBAAgB,YAAY,CAAC,CAAC,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE;IAAE,MAAM,EAAE,OAAO,CAAC;IAAC,KAAK,CAAC,EAAE,OAAO,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,GAAG,QAAQ,CAMhI;AAED,+FAA+F;AAC/F,wBAAgB,gBAAgB,CAAC,CAAC,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,QAAQ,CAGpF;AAED,wBAAgB,SAAS,CAAC,CAAC,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,GAAG,QAAQ,CAS/D;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+BG;AACH,wBAAgB,cAAc,CAAC,CAAC,EAAE,QAAQ,EAAE,KAAK,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,EAAE,GAAG,QAAQ,CAWpG;AAED,wBAAgB,WAAW,CAAC,CAAC,EAAE,QAAQ,EAAE,KAAK,EAAE,cAAc,GAAG,QAAQ,CAQxE;AAED,wBAAgB,YAAY,CAAC,CAAC,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,QAAQ,CAOpF;AAED,wBAAgB,cAAc,CAAC,CAAC,EAAE,QAAQ,EAAE,UAAU,CAAC,EAAE,MAAM,GAAG,QAAQ,CASzE;AAED,wBAAgB,cAAc,CAAC,CAAC,EAAE,QAAQ,GAAG,QAAQ,CAMpD;AAkBD,sEAAsE;AACtE,wBAAgB,YAAY,CAAC,IAAI,EAAE,OAAO,GAAG,MAAM,CAQlD;AAED,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAG9C;AAED,iGAAiG;AACjG,wBAAgB,OAAO,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,CAG9D;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,QAAQ,CAAC,CAAC,EAAE,QAAQ,GAAG;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAIrE;AAED,gDAAgD;AAChD,wBAAgB,SAAS,CAAC,CAAC,EAAE,QAAQ,GAAG,OAAO,CAE9C;AAED,wBAAgB,UAAU,CAAC,CAAC,EAAE,QAAQ,GAAG,OAAO,CAE/C"}
@@ -0,0 +1,280 @@
1
+ /**
2
+ * The run view's state, as a pure reducer over runner events.
3
+ *
4
+ * This is the heart of Direction A: instead of a chat transcript relayed by a
5
+ * supervisor LLM, the run view is a deterministic projection of what the engine
6
+ * is doing. Everything the user sees is computed here from structured events —
7
+ * no model, no text parsing — so the whole thing is unit-testable without a
8
+ * terminal or an API key. The pi-tui renderer (run-view.ts) is a thin function
9
+ * of this state.
10
+ *
11
+ * Design choices worth stating:
12
+ * - The step list is the spine. It comes from the workflow definition, so the
13
+ * user always sees the whole pipeline and where they are in it — the thing a
14
+ * chat transcript could never show.
15
+ * - Each step keeps its OWN stream (blocks). Switching the active step swaps
16
+ * which stream is shown; nothing is lost, and a retry appends to the same
17
+ * step. This mirrors the engine's "fresh session per step" faithfully: one
18
+ * visible timeline per step.
19
+ * - Streaming deltas are coalesced into blocks (a run of reasoning, a run of
20
+ * text, one block per tool call) so the renderer sees stable structure, not a
21
+ * token firehose.
22
+ */
23
+ import { isSubWorkflowStep } from "../engine/types.js";
24
+ /** Build the initial model from the workflow definition — the whole pipeline up front. */
25
+ export function initRunModel(instanceId, workflow, task) {
26
+ const steps = workflow.steps.map((s) => ({
27
+ id: s.id,
28
+ desc: s.desc,
29
+ isSubWorkflow: isSubWorkflowStep(s),
30
+ status: "pending",
31
+ attempts: 0,
32
+ }));
33
+ return {
34
+ instanceId,
35
+ workflowName: workflow.name,
36
+ workflowDesc: workflow.description,
37
+ task,
38
+ steps,
39
+ activeStepId: null,
40
+ activePhase: null,
41
+ phaseStartedAt: null,
42
+ status: "running",
43
+ statusDetail: "",
44
+ reportPath: undefined,
45
+ streams: new Map(),
46
+ revision: 0,
47
+ };
48
+ }
49
+ function bump(m) {
50
+ m.revision++;
51
+ return m;
52
+ }
53
+ function stream(m, stepId) {
54
+ let s = m.streams.get(stepId);
55
+ if (!s) {
56
+ s = [];
57
+ m.streams.set(stepId, s);
58
+ }
59
+ return s;
60
+ }
61
+ function setStep(m, stepId, patch) {
62
+ const s = m.steps.find((x) => x.id === stepId);
63
+ if (s)
64
+ Object.assign(s, patch);
65
+ }
66
+ // ─── Event application (the reducer) ──────────────────────────────────────────
67
+ //
68
+ // Mutates in place and bumps the revision; the model is owned by one run view,
69
+ // so a fresh-object reducer would just be churn. Each function maps one runner
70
+ // event to a state change.
71
+ export function applyStepStart(m, stepId, phase, attempt) {
72
+ m.activeStepId = stepId;
73
+ m.activePhase = phase;
74
+ m.phaseStartedAt = Date.now();
75
+ m.status = "running";
76
+ setStep(m, stepId, { status: phase, attempts: attempt });
77
+ stream(m, stepId).push({ kind: "phase", phase, attempt });
78
+ return bump(m);
79
+ }
80
+ export function applyStepEvent(m, stepId, phase, event) {
81
+ const blocks = stream(m, stepId);
82
+ const last = blocks[blocks.length - 1];
83
+ switch (event.type) {
84
+ case "reasoning":
85
+ if (last && last.kind === "reasoning")
86
+ last.text += event.delta;
87
+ else
88
+ blocks.push({ kind: "reasoning", text: event.delta });
89
+ return bump(m);
90
+ case "text":
91
+ if (last && last.kind === "text")
92
+ last.text += event.delta;
93
+ else
94
+ blocks.push({ kind: "text", text: event.delta });
95
+ return bump(m);
96
+ case "tool_start":
97
+ blocks.push({ kind: "tool", name: event.toolName, arg: summarizeArg(event.args), status: "running" });
98
+ return bump(m);
99
+ case "tool_end": {
100
+ const result = capText(event.text, 4000); // keep a few lines (diffs, output), bounded
101
+ // Close the matching running tool block (most recent of that name).
102
+ for (let i = blocks.length - 1; i >= 0; i--) {
103
+ const b = blocks[i];
104
+ if (b.kind === "tool" && b.name === event.toolName && b.status === "running") {
105
+ b.status = event.isError ? "error" : "ok";
106
+ b.result = result;
107
+ return bump(m);
108
+ }
109
+ }
110
+ // No matching start (some tools only surface an end) — record it anyway.
111
+ blocks.push({ kind: "tool", name: event.toolName, arg: "", status: event.isError ? "error" : "ok", result });
112
+ return bump(m);
113
+ }
114
+ default:
115
+ return m; // turn_end / agent_end / compaction — not shown
116
+ }
117
+ }
118
+ export function applyVerdict(m, stepId, result) {
119
+ stream(m, stepId).push({ kind: "verdict", passed: result.passed, infra: !!result.infra, reason: result.reason });
120
+ if (!result.infra) {
121
+ setStep(m, stepId, { status: result.passed ? "passed" : "failed", lastReason: result.reason });
122
+ }
123
+ return bump(m);
124
+ }
125
+ /** A human message steered into the active DO session — the other half of the conversation. */
126
+ export function applyUserMessage(m, stepId, text) {
127
+ stream(m, stepId).push({ kind: "user", text });
128
+ return bump(m);
129
+ }
130
+ export function applyGate(m, stepId) {
131
+ m.status = "gate";
132
+ m.activeStepId = stepId;
133
+ m.activePhase = null;
134
+ m.phaseStartedAt = null;
135
+ setStep(m, stepId, { status: "gate" });
136
+ m.statusDetail = `步骤 “${stepLabel(m, stepId)}” 已完成,等待你的审查。`;
137
+ stream(m, stepId).push({ kind: "notice", text: "📋 等待人工审查——通过或要求修改。" });
138
+ return bump(m);
139
+ }
140
+ /**
141
+ * Reconstruct a just-built model's position from persisted state, for a view
142
+ * that's attaching to an instance instead of having launched it itself
143
+ * (ralphflow_watch / ralphflow_continue landing back in the view / a fresh
144
+ * process adopting a live instance at boot). Without this, `activeStepId`
145
+ * starts null and stays null until the next runner event happens to fire —
146
+ * which may be a long silent stretch away, or for a reattach to something
147
+ * already past its first phase-start event, MAY NEVER FIRE AGAIN for the
148
+ * current phase at all. `renderStream` shows nothing when `activeStepId` is
149
+ * null (see render.ts), so the practical symptom was exactly "the view is
150
+ * empty" — right up until, for a genuinely fresh start, the real event
151
+ * finally arrived and fixed itself, which is why this was easy to miss in
152
+ * testing a fresh `ralphflow_start` but reliably broke on reattach.
153
+ *
154
+ * Deliberately does NOT touch the stream (no phase divider, no notice) — only
155
+ * `activeStepId`/`activePhase`/`phaseStartedAt`/step statuses. That makes it
156
+ * safe to call unconditionally, even in the ambiguous window where a fresh
157
+ * start's real `onStepStart` hasn't fired yet: this just pre-sets the exact
158
+ * same values that event will also set moments later (no visible duplicate,
159
+ * since nothing was pushed to the stream), so there's no need to distinguish
160
+ * "genuine reattach" from "fresh start, event just hasn't arrived yet" at
161
+ * all. `phaseStartedAt` is set to "now" as a floor, not the true start time
162
+ * (which isn't persisted anywhere reattach can read) — an elapsed clock that
163
+ * understates reality is still far more useful than one that's frozen or
164
+ * absent.
165
+ *
166
+ * `passedStepIds`: step ids with a persisted "check passed" record (see
167
+ * engine.loadStepRecords) — NOT inferred from position in the workflow's
168
+ * step array, because `on_fail` can route backward and a retry loop would
169
+ * make that guess wrong. Marked "done" so the step strip doesn't lie and
170
+ * show already-finished work as still-pending.
171
+ */
172
+ export function primeForAttach(m, state, passedStepIds) {
173
+ for (const id of passedStepIds)
174
+ setStep(m, id, { status: "done" });
175
+ if (state.current_step) {
176
+ m.activeStepId = state.current_step;
177
+ if (state.current_phase === "do" || state.current_phase === "check") {
178
+ m.activePhase = state.current_phase;
179
+ m.phaseStartedAt = Date.now();
180
+ setStep(m, state.current_step, { status: state.current_phase, attempts: (state.fail_count || 0) + 1 });
181
+ }
182
+ }
183
+ return bump(m);
184
+ }
185
+ export function applyPaused(m, state) {
186
+ m.status = "paused";
187
+ m.activePhase = null;
188
+ m.phaseStartedAt = null;
189
+ m.statusDetail = pauseDetail(state);
190
+ const sid = state.current_step;
191
+ if (sid)
192
+ stream(m, sid).push({ kind: "notice", text: `⏸ ${m.statusDetail}` });
193
+ return bump(m);
194
+ }
195
+ export function applyStalled(m, stepId, attempts) {
196
+ m.status = "stalled";
197
+ m.activePhase = null;
198
+ m.phaseStartedAt = null;
199
+ m.statusDetail = `步骤 “${stepLabel(m, stepId)}” 连续 ${attempts} 次未完成,已停止自动驱动。`;
200
+ stream(m, stepId).push({ kind: "notice", text: `⚠️ ${m.statusDetail}` });
201
+ return bump(m);
202
+ }
203
+ export function applyCompleted(m, reportPath) {
204
+ m.status = "completed";
205
+ m.activePhase = null;
206
+ m.phaseStartedAt = null;
207
+ m.reportPath = reportPath;
208
+ // Any step still marked passed becomes done for the final list.
209
+ for (const s of m.steps)
210
+ if (s.status === "passed")
211
+ s.status = "done";
212
+ m.statusDetail = "工作流完成 ✓";
213
+ return bump(m);
214
+ }
215
+ export function applyCancelled(m) {
216
+ m.status = "cancelled";
217
+ m.activePhase = null;
218
+ m.phaseStartedAt = null;
219
+ m.statusDetail = "工作流已取消。";
220
+ return bump(m);
221
+ }
222
+ // ─── helpers ──────────────────────────────────────────────────────────────────
223
+ function stepLabel(m, stepId) {
224
+ return m.steps.find((s) => s.id === stepId)?.desc || stepId;
225
+ }
226
+ function pauseDetail(state) {
227
+ switch (state.pause_reason) {
228
+ case "max_failures": return `已达最大失败次数:${state.last_failure_reason || "反复未通过验证"}`;
229
+ case "config_error": return `工作流配置错误:${state.last_failure_reason || ""}`;
230
+ case "check_error": return `验证未能运行(额度/API/超时),不计失败次数:${state.last_failure_reason || ""}`;
231
+ case "session_aborted": return "会话中断,可恢复。";
232
+ default: return state.last_failure_reason || `已暂停(${state.pause_reason || "未知原因"})`;
233
+ }
234
+ }
235
+ /** A short, single-line description of a tool call's key argument. */
236
+ export function summarizeArg(args) {
237
+ if (!args || typeof args !== "object")
238
+ return "";
239
+ const a = args;
240
+ for (const key of ["command", "file_path", "path", "pattern", "query", "name"]) {
241
+ const v = a[key];
242
+ if (typeof v === "string" && v)
243
+ return v.length > 100 ? v.slice(0, 100) + "…" : v;
244
+ }
245
+ return "";
246
+ }
247
+ export function firstLine(text) {
248
+ const line = String(text ?? "").trim().split("\n")[0] ?? "";
249
+ return line.length > 200 ? line.slice(0, 200) + "…" : line;
250
+ }
251
+ /** Keep a tool result readable but bounded (diffs and command output show; huge dumps don't). */
252
+ export function capText(text, maxChars) {
253
+ const t = String(text ?? "").trim();
254
+ return t.length > maxChars ? t.slice(0, maxChars) + "\n…(已截断)" : t;
255
+ }
256
+ /**
257
+ * Overall progress as (completed, total) for the header/status bar.
258
+ *
259
+ * A step earns "completed" the moment its own CHECK passes — status
260
+ * "passed". It's promoted to "done" only in applyCompleted, when the whole
261
+ * *workflow* finishes (a step strip icon convention, so the final screen's
262
+ * step list reads as uniformly "done" rather than a mix of "passed"/"done").
263
+ * That promotion happens once, at the very end — so counting only "done"
264
+ * here made this always read 0/N for the entire run, only jumping to N/N at
265
+ * the last moment. Both statuses mean the same thing from progress's point
266
+ * of view: this step is behind you.
267
+ */
268
+ export function progress(m) {
269
+ const total = m.steps.filter((s) => !s.isSubWorkflow).length || m.steps.length;
270
+ const done = m.steps.filter((s) => s.status === "done" || s.status === "passed").length;
271
+ return { done, total };
272
+ }
273
+ /** Is the run waiting on the user right now? */
274
+ export function needsUser(m) {
275
+ return m.status === "gate" || m.status === "paused" || m.status === "stalled";
276
+ }
277
+ export function isTerminal(m) {
278
+ return m.status === "completed" || m.status === "cancelled";
279
+ }
280
+ //# sourceMappingURL=run-model.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"run-model.js","sourceRoot":"","sources":["../../src/tui/run-model.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,71 @@
1
+ /**
2
+ * The run view — a full-screen pi-tui app that shows one workflow running.
3
+ *
4
+ * This is the payoff of Direction A. No supervisor LLM sits between the user and
5
+ * the engine: the runner drives the workflow autonomously, its structured events
6
+ * feed the pure run-model, and this file renders that model and turns keystrokes
7
+ * into engine actions. The only AI sessions are the ones actually doing the work
8
+ * (each DO step) and judging it (each CHECK) — and you watch them live.
9
+ *
10
+ * The interaction model is one persistent input, always available except during
11
+ * CHECK (read-only by design) and once the run has ended. There is no separate
12
+ * modal hotkey layer for gates/pauses — that would be a second interaction
13
+ * language bolted onto the first, and the whole point of this view is to feel
14
+ * like talking to the work the way you would in Claude Code or opencode: plain
15
+ * text always talks to the work (steer the live DO session / revise a gate /
16
+ * leave a note for the next retry), `/`-commands always control the state
17
+ * machine (`/ralphflow-continue`, `/ralphflow-cancel` — the same names the chat
18
+ * surface already uses for the same actions, see commands/prompts.ts).
19
+ *
20
+ * All the visual logic is in render.ts (pure, fully tested). This file is the
21
+ * thin pi-tui shell: a Component that emits render.ts's lines, plus the input
22
+ * box and the dispatcher that turns submitted text into engine actions.
23
+ */
24
+ import type { RunModel } from "./run-model.js";
25
+ import { Component, Input, TUI, getSelectListTheme } from "../pi/tui.js";
26
+ export interface RunViewActions {
27
+ /** Approve a manual gate → continue to verification. */
28
+ approveGate(): void;
29
+ /** Ask for changes at a manual gate, with the user's instruction. */
30
+ reviseGate(instruction: string): void;
31
+ /** Resume a paused/stalled workflow after the user fixed things. */
32
+ resume(): void;
33
+ /** Cancel the workflow. */
34
+ cancel(): void;
35
+ /** Steer a plain-text message into the currently active DO session. */
36
+ sendMessage(text: string): void;
37
+ /** Leave a note for the next retry while paused/stalled — doesn't resume by itself. */
38
+ attachNote(text: string): void;
39
+ }
40
+ /** A Component that renders the run model; `scrollBack` is owned by the view. */
41
+ declare class ScreenComponent implements Component {
42
+ private readonly model;
43
+ scrollBack: number;
44
+ constructor(model: () => RunModel);
45
+ render(width: number): string[];
46
+ invalidate(): void;
47
+ }
48
+ /**
49
+ * The single dispatch rule for whatever the user submits. Pure function of
50
+ * (text, model) → an action call, so it's unit-testable without a terminal.
51
+ */
52
+ export declare function dispatchInput(rawText: string, m: RunModel, actions: RunViewActions): void;
53
+ /**
54
+ * Run the full-screen view for one instance until it finishes or the user quits.
55
+ * Resolves when the TUI is torn down. `getModel` returns the live model that the
56
+ * caller mutates from runner events; call `requestRender()` after each mutation.
57
+ */
58
+ export declare function createRunView(opts: {
59
+ tui: TUI;
60
+ getModel(): RunModel;
61
+ actions: RunViewActions;
62
+ /** Called when the user chooses to quit (Esc on an empty input). */
63
+ onQuit(): void;
64
+ }): {
65
+ screen: ScreenComponent;
66
+ stepInput: Input;
67
+ requestRender(): void;
68
+ handleInput(data: string): boolean;
69
+ };
70
+ export { getSelectListTheme };
71
+ //# sourceMappingURL=run-view.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"run-view.d.ts","sourceRoot":"","sources":["../../src/tui/run-view.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;GAsBG;AAEH,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAG/C,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE,GAAG,EAAmB,kBAAkB,EAAE,MAAM,cAAc,CAAC;AAE1F,MAAM,WAAW,cAAc;IAC7B,wDAAwD;IACxD,WAAW,IAAI,IAAI,CAAC;IACpB,qEAAqE;IACrE,UAAU,CAAC,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IACtC,oEAAoE;IACpE,MAAM,IAAI,IAAI,CAAC;IACf,2BAA2B;IAC3B,MAAM,IAAI,IAAI,CAAC;IACf,uEAAuE;IACvE,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IAChC,uFAAuF;IACvF,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;CAChC;AAED,iFAAiF;AACjF,cAAM,eAAgB,YAAW,SAAS;IAE5B,OAAO,CAAC,QAAQ,CAAC,KAAK;IADlC,UAAU,SAAK;gBACc,KAAK,EAAE,MAAM,QAAQ;IAClD,MAAM,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,EAAE;IAG/B,UAAU,IAAI,IAAI;CACnB;AAYD;;;GAGG;AACH,wBAAgB,aAAa,CAAC,OAAO,EAAE,MAAM,EAAE,CAAC,EAAE,QAAQ,EAAE,OAAO,EAAE,cAAc,GAAG,IAAI,CAoBzF;AAED;;;;GAIG;AACH,wBAAgB,aAAa,CAAC,IAAI,EAAE;IAClC,GAAG,EAAE,GAAG,CAAC;IACT,QAAQ,IAAI,QAAQ,CAAC;IACrB,OAAO,EAAE,cAAc,CAAC;IACxB,oEAAoE;IACpE,MAAM,IAAI,IAAI,CAAC;CAChB,GAAG;IAAE,MAAM,EAAE,eAAe,CAAC;IAAC,SAAS,EAAE,KAAK,CAAC;IAAC,aAAa,IAAI,IAAI,CAAC;IAAC,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAA;CAAE,CA2D3G;AAID,OAAO,EAAE,kBAAkB,EAAE,CAAC"}