poly-weaver 0.5.1 → 0.6.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/agents/implementors/handler.d.ts.map +1 -1
- package/dist/agents/implementors/handler.js +2 -1
- package/dist/agents/implementors/handler.js.map +1 -1
- package/dist/agents/planners/handler.d.ts.map +1 -1
- package/dist/agents/planners/handler.js +2 -1
- package/dist/agents/planners/handler.js.map +1 -1
- package/dist/agents/reviewers/handler.d.ts.map +1 -1
- package/dist/agents/reviewers/handler.js +9 -2
- package/dist/agents/reviewers/handler.js.map +1 -1
- package/dist/agents/runner.d.ts +40 -1
- package/dist/agents/runner.d.ts.map +1 -1
- package/dist/agents/runner.js +213 -14
- package/dist/agents/runner.js.map +1 -1
- package/dist/agents/simplifiers/handler.d.ts.map +1 -1
- package/dist/agents/simplifiers/handler.js +2 -1
- package/dist/agents/simplifiers/handler.js.map +1 -1
- package/dist/ansi.d.ts +26 -0
- package/dist/ansi.d.ts.map +1 -1
- package/dist/ansi.js +26 -0
- package/dist/ansi.js.map +1 -1
- package/dist/cli.js +46 -16
- package/dist/cli.js.map +1 -1
- package/dist/flow/built-in/default.js +1 -1
- package/dist/flow/built-in/default.js.map +1 -1
- package/dist/flow/built-in/default.ts +1 -1
- package/dist/flow/built-in/why-so-serious.js +1 -1
- package/dist/flow/built-in/why-so-serious.js.map +1 -1
- package/dist/flow/executor.d.ts.map +1 -1
- package/dist/flow/executor.js +7 -2
- package/dist/flow/executor.js.map +1 -1
- package/dist/flow/types.d.ts +5 -0
- package/dist/flow/types.d.ts.map +1 -1
- package/dist/flow/types.js.map +1 -1
- package/dist/orchestrator.d.ts +10 -4
- package/dist/orchestrator.d.ts.map +1 -1
- package/dist/orchestrator.js +34 -14
- package/dist/orchestrator.js.map +1 -1
- package/dist/providers/claude/session.d.ts +3 -1
- package/dist/providers/claude/session.d.ts.map +1 -1
- package/dist/providers/claude/session.js +2 -2
- package/dist/providers/claude/session.js.map +1 -1
- package/dist/providers/codex/session.d.ts +6 -3
- package/dist/providers/codex/session.d.ts.map +1 -1
- package/dist/providers/codex/session.js +24 -4
- package/dist/providers/codex/session.js.map +1 -1
- package/dist/providers/copilot/session.d.ts +3 -1
- package/dist/providers/copilot/session.d.ts.map +1 -1
- package/dist/providers/copilot/session.js +15 -2
- package/dist/providers/copilot/session.js.map +1 -1
- package/dist/providers/types.d.ts +14 -2
- package/dist/providers/types.d.ts.map +1 -1
- package/dist/providers/types.js.map +1 -1
- package/dist/pty/exit.d.ts +13 -5
- package/dist/pty/exit.d.ts.map +1 -1
- package/dist/pty/exit.js +19 -19
- package/dist/pty/exit.js.map +1 -1
- package/dist/pty/spawn.d.ts +12 -6
- package/dist/pty/spawn.d.ts.map +1 -1
- package/dist/pty/spawn.js +22 -70
- package/dist/pty/spawn.js.map +1 -1
- package/dist/pty/types.d.ts +12 -3
- package/dist/pty/types.d.ts.map +1 -1
- package/dist/session/locator.d.ts +23 -2
- package/dist/session/locator.d.ts.map +1 -1
- package/dist/session/locator.js +67 -4
- package/dist/session/locator.js.map +1 -1
- package/dist/status-bar.d.ts +21 -1
- package/dist/status-bar.d.ts.map +1 -1
- package/dist/status-bar.js +109 -34
- package/dist/status-bar.js.map +1 -1
- package/dist/terminal/cleanup.d.ts +21 -0
- package/dist/terminal/cleanup.d.ts.map +1 -0
- package/dist/terminal/cleanup.js +22 -0
- package/dist/terminal/cleanup.js.map +1 -0
- package/dist/terminal/host.d.ts +244 -0
- package/dist/terminal/host.d.ts.map +1 -0
- package/dist/terminal/host.js +642 -0
- package/dist/terminal/host.js.map +1 -0
- package/dist/terminal/input-router.d.ts +146 -0
- package/dist/terminal/input-router.d.ts.map +1 -0
- package/dist/terminal/input-router.js +426 -0
- package/dist/terminal/input-router.js.map +1 -0
- package/dist/terminal/layout.d.ts +55 -0
- package/dist/terminal/layout.d.ts.map +1 -0
- package/dist/terminal/layout.js +51 -0
- package/dist/terminal/layout.js.map +1 -0
- package/dist/terminal/output.d.ts +83 -0
- package/dist/terminal/output.d.ts.map +1 -0
- package/dist/terminal/output.js +107 -0
- package/dist/terminal/output.js.map +1 -0
- package/dist/terminal/render.d.ts +36 -0
- package/dist/terminal/render.d.ts.map +1 -0
- package/dist/terminal/render.js +233 -0
- package/dist/terminal/render.js.map +1 -0
- package/dist/terminal/virtual-terminal.d.ts +54 -0
- package/dist/terminal/virtual-terminal.d.ts.map +1 -0
- package/dist/terminal/virtual-terminal.js +110 -0
- package/dist/terminal/virtual-terminal.js.map +1 -0
- package/dist/terminal-input.d.ts +10 -0
- package/dist/terminal-input.d.ts.map +1 -1
- package/dist/terminal-input.js +46 -0
- package/dist/terminal-input.js.map +1 -1
- package/dist/user/auto-curate-prompt.d.ts +17 -0
- package/dist/user/auto-curate-prompt.d.ts.map +1 -0
- package/dist/user/auto-curate-prompt.js +22 -0
- package/dist/user/auto-curate-prompt.js.map +1 -0
- package/dist/user/curate-handler.d.ts.map +1 -1
- package/dist/user/curate-handler.js +10 -2
- package/dist/user/curate-handler.js.map +1 -1
- package/dist/user/curate-prompt.d.ts +9 -7
- package/dist/user/curate-prompt.d.ts.map +1 -1
- package/dist/user/curate-prompt.js +2 -341
- package/dist/user/curate-prompt.js.map +1 -1
- package/dist/user/handler.d.ts +13 -1
- package/dist/user/handler.d.ts.map +1 -1
- package/dist/user/handler.js +27 -15
- package/dist/user/handler.js.map +1 -1
- package/dist/user/hard-wrap.d.ts +11 -0
- package/dist/user/hard-wrap.d.ts.map +1 -0
- package/dist/user/hard-wrap.js +44 -0
- package/dist/user/hard-wrap.js.map +1 -0
- package/dist/user/host-curate-prompt.d.ts +34 -0
- package/dist/user/host-curate-prompt.d.ts.map +1 -0
- package/dist/user/host-curate-prompt.js +453 -0
- package/dist/user/host-curate-prompt.js.map +1 -0
- package/dist/user/host-prompt.d.ts +21 -0
- package/dist/user/host-prompt.d.ts.map +1 -0
- package/dist/user/host-prompt.js +337 -0
- package/dist/user/host-prompt.js.map +1 -0
- package/dist/user/index.d.ts +3 -3
- package/dist/user/index.d.ts.map +1 -1
- package/dist/user/index.js +2 -2
- package/dist/user/index.js.map +1 -1
- package/dist/user/plan-pane.d.ts +18 -0
- package/dist/user/plan-pane.d.ts.map +1 -0
- package/dist/user/plan-pane.js +33 -0
- package/dist/user/plan-pane.js.map +1 -0
- package/dist/user/prompt.d.ts +25 -42
- package/dist/user/prompt.d.ts.map +1 -1
- package/dist/user/prompt.js +16 -278
- package/dist/user/prompt.js.map +1 -1
- package/dist/user/split-surface.d.ts +32 -0
- package/dist/user/split-surface.d.ts.map +1 -0
- package/dist/user/split-surface.js +66 -0
- package/dist/user/split-surface.js.map +1 -0
- package/package.json +2 -1
|
@@ -0,0 +1,337 @@
|
|
|
1
|
+
import { bold, dim, green, reset, visibleLength, } from "../ansi.js";
|
|
2
|
+
import { RawInputParser } from "./prompt.js";
|
|
3
|
+
import { clipToWidth } from "./curate-prompt.js";
|
|
4
|
+
import { buildPlanPane } from "./plan-pane.js";
|
|
5
|
+
/** Maximum visible rows for the multiline feedback editor. */
|
|
6
|
+
const FEEDBACK_EDITOR_MAX_ROWS = 5;
|
|
7
|
+
/** Lines of overlap when paging the plan (PageUp/PageDown). */
|
|
8
|
+
const PLAN_PAGE_OVERLAP = 1;
|
|
9
|
+
const ACTIVE_PREFIX = " ❯ ";
|
|
10
|
+
const INACTIVE_PREFIX = " ";
|
|
11
|
+
/**
|
|
12
|
+
* Host-backed user-review prompt with a top-down stack layout.
|
|
13
|
+
*
|
|
14
|
+
* Plan on top (header rule + scrollable body), full-width dim ─ separator, a
|
|
15
|
+
* blank top-margin row, the controls block (Approve + bounded feedback editor
|
|
16
|
+
* + optional hint), and a blank bottom-margin row above the host status bar.
|
|
17
|
+
*
|
|
18
|
+
* Key handling:
|
|
19
|
+
* - ↑/↓ toggles between Approve and the editor (does NOT scroll the plan).
|
|
20
|
+
* - PageUp/PageDown/Home/End/wheel scrolls the plan.
|
|
21
|
+
* - Ctrl+D submits feedback (or accepts when on Approve), Ctrl+C accepts.
|
|
22
|
+
* - Ctrl+] is consumed by the host's `InputRouter` for dump capture.
|
|
23
|
+
*/
|
|
24
|
+
export class HostBackedUserPrompt {
|
|
25
|
+
host;
|
|
26
|
+
constructor(host) {
|
|
27
|
+
this.host = host;
|
|
28
|
+
}
|
|
29
|
+
async prompt(plan, _phase, context) {
|
|
30
|
+
if (!this.host.isInteractive) {
|
|
31
|
+
return { accepted: true };
|
|
32
|
+
}
|
|
33
|
+
return new Promise((resolve) => {
|
|
34
|
+
const state = {
|
|
35
|
+
mode: "input",
|
|
36
|
+
lines: [""],
|
|
37
|
+
cursorLine: 0,
|
|
38
|
+
feedbackScrollTop: 0,
|
|
39
|
+
planScrollTop: 0,
|
|
40
|
+
planAtEnd: false,
|
|
41
|
+
};
|
|
42
|
+
const parser = new RawInputParser();
|
|
43
|
+
let detach;
|
|
44
|
+
const finish = (result) => {
|
|
45
|
+
detach?.();
|
|
46
|
+
detach = undefined;
|
|
47
|
+
resolve(result);
|
|
48
|
+
};
|
|
49
|
+
const mode = {
|
|
50
|
+
getSurface: () => {
|
|
51
|
+
const layout = this.host.getLayout();
|
|
52
|
+
const cols = Math.max(20, layout.columns);
|
|
53
|
+
const rows = Math.max(1, layout.childRows);
|
|
54
|
+
return buildSurface(plan, context, state, cols, rows);
|
|
55
|
+
},
|
|
56
|
+
onInput: (chunk) => {
|
|
57
|
+
const events = parser.parseChunk(chunk);
|
|
58
|
+
let dirty = false;
|
|
59
|
+
for (const event of events) {
|
|
60
|
+
if (event.type === "ctrl-c") {
|
|
61
|
+
finish({ accepted: true });
|
|
62
|
+
return true;
|
|
63
|
+
}
|
|
64
|
+
if (event.type === "submit") {
|
|
65
|
+
if (state.mode === "approve") {
|
|
66
|
+
finish({ accepted: true });
|
|
67
|
+
return true;
|
|
68
|
+
}
|
|
69
|
+
const text = state.lines.join("\n").trim();
|
|
70
|
+
if (text.length > 0) {
|
|
71
|
+
finish({ accepted: false, comments: text });
|
|
72
|
+
return true;
|
|
73
|
+
}
|
|
74
|
+
continue;
|
|
75
|
+
}
|
|
76
|
+
if (event.type === "newline") {
|
|
77
|
+
if (state.mode === "approve") {
|
|
78
|
+
finish({ accepted: true });
|
|
79
|
+
return true;
|
|
80
|
+
}
|
|
81
|
+
state.lines.push("");
|
|
82
|
+
state.cursorLine = state.lines.length - 1;
|
|
83
|
+
dirty = true;
|
|
84
|
+
continue;
|
|
85
|
+
}
|
|
86
|
+
if (event.type === "arrow") {
|
|
87
|
+
if (event.direction === "up" && state.mode === "input") {
|
|
88
|
+
state.mode = "approve";
|
|
89
|
+
dirty = true;
|
|
90
|
+
}
|
|
91
|
+
else if (event.direction === "down" && state.mode === "approve") {
|
|
92
|
+
state.mode = "input";
|
|
93
|
+
dirty = true;
|
|
94
|
+
}
|
|
95
|
+
continue;
|
|
96
|
+
}
|
|
97
|
+
if (event.type === "scroll-page") {
|
|
98
|
+
const { planHeight, planLines } = planMetrics(plan, context, state, this.host);
|
|
99
|
+
const step = Math.max(1, planHeight - PLAN_PAGE_OVERLAP);
|
|
100
|
+
const max = Math.max(0, planLines - planHeight);
|
|
101
|
+
if (event.direction === "up") {
|
|
102
|
+
state.planScrollTop = Math.max(0, state.planScrollTop - step);
|
|
103
|
+
}
|
|
104
|
+
else {
|
|
105
|
+
state.planScrollTop = Math.min(max, state.planScrollTop + step);
|
|
106
|
+
}
|
|
107
|
+
state.planAtEnd = state.planScrollTop >= max;
|
|
108
|
+
dirty = true;
|
|
109
|
+
continue;
|
|
110
|
+
}
|
|
111
|
+
if (event.type === "scroll-home") {
|
|
112
|
+
state.planScrollTop = 0;
|
|
113
|
+
state.planAtEnd = false;
|
|
114
|
+
dirty = true;
|
|
115
|
+
continue;
|
|
116
|
+
}
|
|
117
|
+
if (event.type === "scroll-end") {
|
|
118
|
+
const { planHeight, planLines } = planMetrics(plan, context, state, this.host);
|
|
119
|
+
state.planScrollTop = Math.max(0, planLines - planHeight);
|
|
120
|
+
state.planAtEnd = true;
|
|
121
|
+
dirty = true;
|
|
122
|
+
continue;
|
|
123
|
+
}
|
|
124
|
+
if (event.type === "scroll-lines") {
|
|
125
|
+
const { planHeight, planLines } = planMetrics(plan, context, state, this.host);
|
|
126
|
+
const max = Math.max(0, planLines - planHeight);
|
|
127
|
+
state.planScrollTop = Math.min(max, Math.max(0, state.planScrollTop + event.delta));
|
|
128
|
+
state.planAtEnd = state.planScrollTop >= max;
|
|
129
|
+
dirty = true;
|
|
130
|
+
continue;
|
|
131
|
+
}
|
|
132
|
+
if (event.type === "insert") {
|
|
133
|
+
if (state.mode === "approve")
|
|
134
|
+
state.mode = "input";
|
|
135
|
+
const last = state.lines.length - 1;
|
|
136
|
+
state.lines[last] = state.lines[last] + event.text;
|
|
137
|
+
state.cursorLine = last;
|
|
138
|
+
dirty = true;
|
|
139
|
+
continue;
|
|
140
|
+
}
|
|
141
|
+
if (event.type === "backspace") {
|
|
142
|
+
if (state.mode === "approve") {
|
|
143
|
+
state.mode = "input";
|
|
144
|
+
dirty = true;
|
|
145
|
+
continue;
|
|
146
|
+
}
|
|
147
|
+
const last = state.lines.length - 1;
|
|
148
|
+
if (state.lines[last].length > 0) {
|
|
149
|
+
state.lines[last] = state.lines[last].slice(0, -1);
|
|
150
|
+
dirty = true;
|
|
151
|
+
}
|
|
152
|
+
else if (state.lines.length > 1) {
|
|
153
|
+
state.lines.pop();
|
|
154
|
+
state.cursorLine = state.lines.length - 1;
|
|
155
|
+
dirty = true;
|
|
156
|
+
}
|
|
157
|
+
continue;
|
|
158
|
+
}
|
|
159
|
+
// tab/esc/dump ignored — dump is consumed by the host router.
|
|
160
|
+
}
|
|
161
|
+
if (dirty)
|
|
162
|
+
this.host.scheduleParentUiRender();
|
|
163
|
+
return true;
|
|
164
|
+
},
|
|
165
|
+
};
|
|
166
|
+
detach = this.host.attachParentUi(mode);
|
|
167
|
+
});
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
/**
|
|
171
|
+
* Build the natural-height controls block (no padding):
|
|
172
|
+
* ❯ Approve (Enter) — when state.mode === "approve"
|
|
173
|
+
* _ — feedback editor (1..5 rows; placeholder when empty)
|
|
174
|
+
* Ctrl+D to submit — hint, only when input mode and editor non-empty
|
|
175
|
+
*
|
|
176
|
+
* Returns its natural height (1..7 rows). Cursor is pane-local.
|
|
177
|
+
*/
|
|
178
|
+
function buildControlsBlock(state, width) {
|
|
179
|
+
const approveRow = state.mode === "approve"
|
|
180
|
+
? `${ACTIVE_PREFIX}${bold}${green}Approve (Enter)${reset}`
|
|
181
|
+
: `${INACTIVE_PREFIX}${dim}Approve${reset}`;
|
|
182
|
+
const showPlaceholder = state.lines.length === 1 && state.lines[0].length === 0;
|
|
183
|
+
const showHint = !showPlaceholder && state.mode === "input";
|
|
184
|
+
const hintRow = showHint
|
|
185
|
+
? `${INACTIVE_PREFIX}${dim}Ctrl+D to submit${reset}`
|
|
186
|
+
: undefined;
|
|
187
|
+
const unboundedEditor = showPlaceholder ? 1 : state.lines.length;
|
|
188
|
+
const editorHeight = Math.min(FEEDBACK_EDITOR_MAX_ROWS, Math.max(1, unboundedEditor));
|
|
189
|
+
if (showPlaceholder) {
|
|
190
|
+
state.feedbackScrollTop = 0;
|
|
191
|
+
}
|
|
192
|
+
else {
|
|
193
|
+
const cur = Math.min(Math.max(0, state.cursorLine), state.lines.length - 1);
|
|
194
|
+
if (cur < state.feedbackScrollTop)
|
|
195
|
+
state.feedbackScrollTop = cur;
|
|
196
|
+
else if (cur >= state.feedbackScrollTop + editorHeight) {
|
|
197
|
+
state.feedbackScrollTop = cur - editorHeight + 1;
|
|
198
|
+
}
|
|
199
|
+
const maxScroll = Math.max(0, state.lines.length - editorHeight);
|
|
200
|
+
if (state.feedbackScrollTop > maxScroll)
|
|
201
|
+
state.feedbackScrollTop = maxScroll;
|
|
202
|
+
if (state.feedbackScrollTop < 0)
|
|
203
|
+
state.feedbackScrollTop = 0;
|
|
204
|
+
}
|
|
205
|
+
const placeholder = "Type feedback (multi-line, Ctrl+D to submit)";
|
|
206
|
+
const editorBody = [];
|
|
207
|
+
if (showPlaceholder) {
|
|
208
|
+
const first = state.mode === "input"
|
|
209
|
+
? `${ACTIVE_PREFIX}${dim}${placeholder}${reset}`
|
|
210
|
+
: `${INACTIVE_PREFIX}${dim}${placeholder}${reset}`;
|
|
211
|
+
editorBody.push(first);
|
|
212
|
+
while (editorBody.length < editorHeight)
|
|
213
|
+
editorBody.push("");
|
|
214
|
+
}
|
|
215
|
+
else {
|
|
216
|
+
for (let i = 0; i < editorHeight; i++) {
|
|
217
|
+
const idx = state.feedbackScrollTop + i;
|
|
218
|
+
if (idx >= state.lines.length) {
|
|
219
|
+
editorBody.push("");
|
|
220
|
+
continue;
|
|
221
|
+
}
|
|
222
|
+
const isFirstUnderlying = idx === 0 && i === 0;
|
|
223
|
+
const prefix = isFirstUnderlying && state.mode === "input"
|
|
224
|
+
? ACTIVE_PREFIX
|
|
225
|
+
: INACTIVE_PREFIX;
|
|
226
|
+
editorBody.push(`${prefix}${state.lines[idx]}`);
|
|
227
|
+
}
|
|
228
|
+
}
|
|
229
|
+
const lines = [
|
|
230
|
+
approveRow,
|
|
231
|
+
...editorBody,
|
|
232
|
+
...(hintRow ? [hintRow] : []),
|
|
233
|
+
];
|
|
234
|
+
const approveRowInBlock = 0;
|
|
235
|
+
const editorStart = 1;
|
|
236
|
+
let cursorRow;
|
|
237
|
+
let cursorCol;
|
|
238
|
+
if (state.mode === "approve") {
|
|
239
|
+
cursorRow = approveRowInBlock;
|
|
240
|
+
cursorCol = ACTIVE_PREFIX.length;
|
|
241
|
+
}
|
|
242
|
+
else if (showPlaceholder) {
|
|
243
|
+
cursorRow = editorStart;
|
|
244
|
+
cursorCol = ACTIVE_PREFIX.length;
|
|
245
|
+
}
|
|
246
|
+
else {
|
|
247
|
+
const offset = Math.min(Math.max(0, state.cursorLine - state.feedbackScrollTop), editorHeight - 1);
|
|
248
|
+
cursorRow = editorStart + offset;
|
|
249
|
+
const lineIdx = state.feedbackScrollTop + offset;
|
|
250
|
+
const lineText = state.lines[lineIdx] ?? "";
|
|
251
|
+
const isFirstUnderlying = lineIdx === 0 && offset === 0;
|
|
252
|
+
const prefixLen = isFirstUnderlying
|
|
253
|
+
? ACTIVE_PREFIX.length
|
|
254
|
+
: INACTIVE_PREFIX.length;
|
|
255
|
+
cursorCol = prefixLen + visibleLength(lineText);
|
|
256
|
+
}
|
|
257
|
+
if (cursorRow < 0)
|
|
258
|
+
cursorRow = 0;
|
|
259
|
+
if (cursorCol < 0)
|
|
260
|
+
cursorCol = 0;
|
|
261
|
+
if (cursorCol >= width)
|
|
262
|
+
cursorCol = Math.max(0, width - 1);
|
|
263
|
+
return {
|
|
264
|
+
lines: lines.map((l) => clipToWidth(l, width)),
|
|
265
|
+
cursor: { row: cursorRow, col: cursorCol },
|
|
266
|
+
};
|
|
267
|
+
}
|
|
268
|
+
/**
|
|
269
|
+
* Compute the plan area's available height given total `rows` and the natural
|
|
270
|
+
* controls block height. Reserves 1 row for the dim ─ separator, 1 for the
|
|
271
|
+
* top-margin blank, and 1 for the bottom-margin blank.
|
|
272
|
+
*/
|
|
273
|
+
function computePlanRows(controlsHeight, rows) {
|
|
274
|
+
return Math.max(1, rows - controlsHeight - 3);
|
|
275
|
+
}
|
|
276
|
+
function buildPlanLines(plan, context, state, width, planRows) {
|
|
277
|
+
const pane = buildPlanPane(plan, context.phaseLabel, width);
|
|
278
|
+
const total = pane.lines.length;
|
|
279
|
+
const maxScroll = Math.max(0, total - planRows);
|
|
280
|
+
// Re-pin to the new bottom when the user last scrolled to End and the plan
|
|
281
|
+
// window has since shrunk (e.g. the controls block grew while typing).
|
|
282
|
+
if (state.planAtEnd)
|
|
283
|
+
state.planScrollTop = maxScroll;
|
|
284
|
+
if (state.planScrollTop > maxScroll)
|
|
285
|
+
state.planScrollTop = maxScroll;
|
|
286
|
+
if (state.planScrollTop < 0)
|
|
287
|
+
state.planScrollTop = 0;
|
|
288
|
+
const sliced = pane.lines.slice(state.planScrollTop, state.planScrollTop + planRows);
|
|
289
|
+
while (sliced.length < planRows)
|
|
290
|
+
sliced.push("");
|
|
291
|
+
return {
|
|
292
|
+
lines: sliced.map((l) => clipToWidth(l, width)),
|
|
293
|
+
total,
|
|
294
|
+
};
|
|
295
|
+
}
|
|
296
|
+
function buildSurface(plan, context, state, cols, rows) {
|
|
297
|
+
const controls = buildControlsBlock(state, cols);
|
|
298
|
+
const planRows = computePlanRows(controls.lines.length, rows);
|
|
299
|
+
const { lines: planLines } = buildPlanLines(plan, context, state, cols, planRows);
|
|
300
|
+
const separator = `${dim}${"─".repeat(cols)}${reset}`;
|
|
301
|
+
const composed = [
|
|
302
|
+
...planLines,
|
|
303
|
+
separator,
|
|
304
|
+
"",
|
|
305
|
+
...controls.lines,
|
|
306
|
+
"",
|
|
307
|
+
];
|
|
308
|
+
// Pad / clip to exactly `rows` rows. The plan area is the only flex region;
|
|
309
|
+
// controls + separator + margins remain anchored to the bottom.
|
|
310
|
+
while (composed.length < rows)
|
|
311
|
+
composed.push("");
|
|
312
|
+
if (composed.length > rows) {
|
|
313
|
+
// Clip from the top of the plan area; never clip controls.
|
|
314
|
+
composed.splice(0, composed.length - rows);
|
|
315
|
+
}
|
|
316
|
+
// Cursor row sits in the controls block: planRows + 1 (separator) + 1 (top
|
|
317
|
+
// margin) + controls.cursor.row.
|
|
318
|
+
let cursorRow = planRows + 1 + 1 + controls.cursor.row;
|
|
319
|
+
if (cursorRow < 0)
|
|
320
|
+
cursorRow = 0;
|
|
321
|
+
if (cursorRow >= rows)
|
|
322
|
+
cursorRow = rows - 1;
|
|
323
|
+
return {
|
|
324
|
+
lines: composed,
|
|
325
|
+
cursor: { row: cursorRow, col: controls.cursor.col },
|
|
326
|
+
};
|
|
327
|
+
}
|
|
328
|
+
function planMetrics(plan, context, state, host) {
|
|
329
|
+
const layout = host.getLayout();
|
|
330
|
+
const cols = Math.max(20, layout.columns);
|
|
331
|
+
const rows = Math.max(1, layout.childRows);
|
|
332
|
+
const controls = buildControlsBlock(state, cols);
|
|
333
|
+
const planHeight = computePlanRows(controls.lines.length, rows);
|
|
334
|
+
const pane = buildPlanPane(plan, context.phaseLabel, cols);
|
|
335
|
+
return { planHeight, planLines: pane.lines.length };
|
|
336
|
+
}
|
|
337
|
+
//# sourceMappingURL=host-prompt.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"host-prompt.js","sourceRoot":"","sources":["../../src/user/host-prompt.ts"],"names":[],"mappings":"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"}
|
package/dist/user/index.d.ts
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
|
-
export type { UserPromptHandler, UserPromptResult, UserPromptContext } from "./prompt.js";
|
|
2
|
-
export {
|
|
1
|
+
export type { UserPromptHandler, UserPromptResult, UserPromptContext, UserPhaseLabel, } from "./prompt.js";
|
|
2
|
+
export { AutoUserPrompt, RawInputParser } from "./prompt.js";
|
|
3
3
|
export { UserRoleHandler } from "./handler.js";
|
|
4
4
|
export { user } from "./dsl.js";
|
|
5
5
|
export { CurateVerdictRoleHandler, buildCuratedVerdict } from "./curate-handler.js";
|
|
6
|
-
export {
|
|
6
|
+
export { AutoCuratePrompt } from "./auto-curate-prompt.js";
|
|
7
7
|
export type { CuratePromptHandler, CurateDecision, CurateDecisionRecord, CurateResult, } from "./curate-prompt.js";
|
|
8
8
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/user/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/user/index.ts"],"names":[],"mappings":"AAAA,YAAY,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/user/index.ts"],"names":[],"mappings":"AAAA,YAAY,EACV,iBAAiB,EACjB,gBAAgB,EAChB,iBAAiB,EACjB,cAAc,GACf,MAAM,aAAa,CAAC;AACrB,OAAO,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAC7D,OAAO,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAC/C,OAAO,EAAE,IAAI,EAAE,MAAM,UAAU,CAAC;AAChC,OAAO,EAAE,wBAAwB,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAC;AACpF,OAAO,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAC3D,YAAY,EACV,mBAAmB,EACnB,cAAc,EACd,oBAAoB,EACpB,YAAY,GACb,MAAM,oBAAoB,CAAC"}
|
package/dist/user/index.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
export {
|
|
1
|
+
export { AutoUserPrompt, RawInputParser } from "./prompt.js";
|
|
2
2
|
export { UserRoleHandler } from "./handler.js";
|
|
3
3
|
export { user } from "./dsl.js";
|
|
4
4
|
export { CurateVerdictRoleHandler, buildCuratedVerdict } from "./curate-handler.js";
|
|
5
|
-
export {
|
|
5
|
+
export { AutoCuratePrompt } from "./auto-curate-prompt.js";
|
|
6
6
|
//# sourceMappingURL=index.js.map
|
package/dist/user/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/user/index.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/user/index.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAC7D,OAAO,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAC/C,OAAO,EAAE,IAAI,EAAE,MAAM,UAAU,CAAC;AAChC,OAAO,EAAE,wBAAwB,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAC;AACpF,OAAO,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Phase label drives the right-pane header text. Computed by
|
|
3
|
+
* `UserRoleHandler` from the verdict artifact + previous step role.
|
|
4
|
+
*/
|
|
5
|
+
export type PhaseLabel = "first" | "revised" | "approved" | "unapproved";
|
|
6
|
+
export interface PlanPaneOutput {
|
|
7
|
+
/** Lines (already styled & wrapped) to render. Includes header + rule. */
|
|
8
|
+
lines: string[];
|
|
9
|
+
/** Number of body content lines (post-scroll-clamp helper for callers). */
|
|
10
|
+
contentLines: number;
|
|
11
|
+
}
|
|
12
|
+
/**
|
|
13
|
+
* Build the right-pane plan view. Header (bold cyan) + thin rule + hard-wrapped
|
|
14
|
+
* plan body. Caller is responsible for slicing by `scrollTop` and clipping to
|
|
15
|
+
* the available pane height.
|
|
16
|
+
*/
|
|
17
|
+
export declare function buildPlanPane(plan: string, phase: PhaseLabel, width: number): PlanPaneOutput;
|
|
18
|
+
//# sourceMappingURL=plan-pane.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"plan-pane.d.ts","sourceRoot":"","sources":["../../src/user/plan-pane.ts"],"names":[],"mappings":"AAGA;;;GAGG;AACH,MAAM,MAAM,UAAU,GAAG,OAAO,GAAG,SAAS,GAAG,UAAU,GAAG,YAAY,CAAC;AAEzE,MAAM,WAAW,cAAc;IAC7B,0EAA0E;IAC1E,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,2EAA2E;IAC3E,YAAY,EAAE,MAAM,CAAC;CACtB;AAeD;;;;GAIG;AACH,wBAAgB,aAAa,CAC3B,IAAI,EAAE,MAAM,EACZ,KAAK,EAAE,UAAU,EACjB,KAAK,EAAE,MAAM,GACZ,cAAc,CAWhB"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import { bold, cyan, dim, reset } from "../ansi.js";
|
|
2
|
+
import { hardWrapLine } from "./hard-wrap.js";
|
|
3
|
+
function headerText(phase) {
|
|
4
|
+
switch (phase) {
|
|
5
|
+
case "first":
|
|
6
|
+
return "Generated Plan";
|
|
7
|
+
case "revised":
|
|
8
|
+
return "Revised Plan";
|
|
9
|
+
case "approved":
|
|
10
|
+
return "Approved Plan";
|
|
11
|
+
case "unapproved":
|
|
12
|
+
return "Unapproved Plan (Max Iterations Reached)";
|
|
13
|
+
}
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* Build the right-pane plan view. Header (bold cyan) + thin rule + hard-wrapped
|
|
17
|
+
* plan body. Caller is responsible for slicing by `scrollTop` and clipping to
|
|
18
|
+
* the available pane height.
|
|
19
|
+
*/
|
|
20
|
+
export function buildPlanPane(plan, phase, width) {
|
|
21
|
+
const lines = [];
|
|
22
|
+
const w = Math.max(1, width);
|
|
23
|
+
lines.push(`${bold}${cyan}${headerText(phase)}${reset}`);
|
|
24
|
+
lines.push(`${dim}${"─".repeat(w)}${reset}`);
|
|
25
|
+
if (plan.length > 0) {
|
|
26
|
+
for (const raw of plan.split(/\r?\n/)) {
|
|
27
|
+
for (const wrapped of hardWrapLine(raw, w))
|
|
28
|
+
lines.push(wrapped);
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
return { lines, contentLines: lines.length };
|
|
32
|
+
}
|
|
33
|
+
//# sourceMappingURL=plan-pane.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"plan-pane.js","sourceRoot":"","sources":["../../src/user/plan-pane.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,GAAG,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AACpD,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAe9C,SAAS,UAAU,CAAC,KAAiB;IACnC,QAAQ,KAAK,EAAE,CAAC;QACd,KAAK,OAAO;YACV,OAAO,gBAAgB,CAAC;QAC1B,KAAK,SAAS;YACZ,OAAO,cAAc,CAAC;QACxB,KAAK,UAAU;YACb,OAAO,eAAe,CAAC;QACzB,KAAK,YAAY;YACf,OAAO,0CAA0C,CAAC;IACtD,CAAC;AACH,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,aAAa,CAC3B,IAAY,EACZ,KAAiB,EACjB,KAAa;IAEb,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,MAAM,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC;IAC7B,KAAK,CAAC,IAAI,CAAC,GAAG,IAAI,GAAG,IAAI,GAAG,UAAU,CAAC,KAAK,CAAC,GAAG,KAAK,EAAE,CAAC,CAAC;IACzD,KAAK,CAAC,IAAI,CAAC,GAAG,GAAG,GAAG,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,KAAK,EAAE,CAAC,CAAC;IAC7C,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACpB,KAAK,MAAM,GAAG,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,EAAE,CAAC;YACtC,KAAK,MAAM,OAAO,IAAI,YAAY,CAAC,GAAG,EAAE,CAAC,CAAC;gBAAE,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QAClE,CAAC;IACH,CAAC;IACD,OAAO,EAAE,KAAK,EAAE,YAAY,EAAE,KAAK,CAAC,MAAM,EAAE,CAAC;AAC/C,CAAC"}
|
package/dist/user/prompt.d.ts
CHANGED
|
@@ -1,10 +1,8 @@
|
|
|
1
|
-
import { type FeatureGates } from "../providers/registry.js";
|
|
2
|
-
import type { BuiltinRole } from "../flow/types.js";
|
|
3
1
|
export interface UserPromptResult {
|
|
4
2
|
accepted: boolean;
|
|
5
3
|
comments?: string;
|
|
6
4
|
}
|
|
7
|
-
type RawInputEvent = {
|
|
5
|
+
export type RawInputEvent = {
|
|
8
6
|
type: "insert";
|
|
9
7
|
text: string;
|
|
10
8
|
} | {
|
|
@@ -22,9 +20,21 @@ type RawInputEvent = {
|
|
|
22
20
|
} | {
|
|
23
21
|
type: "arrow";
|
|
24
22
|
direction: "up" | "down";
|
|
23
|
+
} | {
|
|
24
|
+
type: "scroll-page";
|
|
25
|
+
direction: "up" | "down";
|
|
26
|
+
} | {
|
|
27
|
+
type: "scroll-home";
|
|
28
|
+
} | {
|
|
29
|
+
type: "scroll-end";
|
|
30
|
+
} | {
|
|
31
|
+
type: "scroll-lines";
|
|
32
|
+
delta: number;
|
|
25
33
|
} | {
|
|
26
34
|
type: "dump";
|
|
27
35
|
};
|
|
36
|
+
/** Lines moved per single mouse-wheel notch in prompt scroll handling. */
|
|
37
|
+
export declare const PROMPT_WHEEL_LINES_PER_EVENT = 3;
|
|
28
38
|
/**
|
|
29
39
|
* Stateful parser for raw stdin bytes in normal VT mode and passive kitty keyboard
|
|
30
40
|
* protocol mode.
|
|
@@ -41,55 +51,28 @@ export declare class RawInputParser {
|
|
|
41
51
|
onDeferred(cb: (events: RawInputEvent[]) => void): void;
|
|
42
52
|
private mapKey;
|
|
43
53
|
}
|
|
54
|
+
/**
|
|
55
|
+
* Phase label for the user-review screen. Computed by `UserRoleHandler`
|
|
56
|
+
* from the verdict artifact and `ctx.previousStepRole`.
|
|
57
|
+
*/
|
|
58
|
+
export type UserPhaseLabel = "first" | "revised" | "approved" | "unapproved";
|
|
44
59
|
export interface UserPromptContext {
|
|
45
|
-
/**
|
|
46
|
-
|
|
47
|
-
/** True when no prior verdict exists (first review before any reviewer runs). */
|
|
48
|
-
isFirstReview?: boolean;
|
|
49
|
-
/** Who produced the verdict: "user" | "reviewer" | undefined. */
|
|
50
|
-
verdictSource?: string;
|
|
51
|
-
/** Role of the step that executed immediately before this user step. */
|
|
52
|
-
previousStepRole?: BuiltinRole | "user";
|
|
60
|
+
/** Phase label that drives the right-pane plan header and left-pane subtitle. */
|
|
61
|
+
phaseLabel: UserPhaseLabel;
|
|
53
62
|
}
|
|
54
63
|
export interface UserPromptHandler {
|
|
55
64
|
/**
|
|
56
65
|
* Present the plan to the user and collect their decision.
|
|
57
|
-
* @param plan - The full plan text.
|
|
58
|
-
* @param phase -
|
|
59
|
-
* @param context -
|
|
60
|
-
*/
|
|
61
|
-
prompt(plan: string, phase: string, context?: UserPromptContext): Promise<UserPromptResult>;
|
|
62
|
-
}
|
|
63
|
-
/**
|
|
64
|
-
* Interactive user prompt handler.
|
|
65
|
-
* Displays the plan (unless nativePlanMode gate suppresses it) and collects multiline input.
|
|
66
|
-
* Empty input = accept, non-empty = comments for revision.
|
|
67
|
-
*
|
|
68
|
-
* Uses a raw stdin reader instead of readline so that input works in
|
|
69
|
-
* both standard VT mode and passive kitty keyboard protocol mode.
|
|
70
|
-
*/
|
|
71
|
-
export declare class InteractiveUserPrompt implements UserPromptHandler {
|
|
72
|
-
readonly gates: FeatureGates;
|
|
73
|
-
readonly onDumpRequested?: (() => void) | undefined;
|
|
74
|
-
constructor(gates?: FeatureGates, onDumpRequested?: (() => void) | undefined);
|
|
75
|
-
prompt(plan: string, phase: string, context?: UserPromptContext): Promise<UserPromptResult>;
|
|
76
|
-
/** True unless the provider already streamed the plan natively (planner → user). */
|
|
77
|
-
private shouldDisplayPlan;
|
|
78
|
-
private printPlan;
|
|
79
|
-
/**
|
|
80
|
-
* Two-row selector: "Approve" row and multiline feedback input area.
|
|
81
|
-
* `❯` arrow moves between rows to indicate which is active.
|
|
82
|
-
* Input row is active by default — just start typing.
|
|
83
|
-
* Enter inserts a newline; Ctrl+D submits.
|
|
84
|
-
* Approve requires ↑ then Enter.
|
|
66
|
+
* @param plan - The full plan text. Always shown in the right pane (when wide enough).
|
|
67
|
+
* @param phase - The step ID that triggered this prompt
|
|
68
|
+
* @param context - Phase-label context computed by the UserRoleHandler
|
|
85
69
|
*/
|
|
86
|
-
|
|
70
|
+
prompt(plan: string, phase: string, context: UserPromptContext): Promise<UserPromptResult>;
|
|
87
71
|
}
|
|
88
72
|
/**
|
|
89
|
-
* No-op handler that always accepts. Used for
|
|
73
|
+
* No-op handler that always accepts. Used for `auto=true` flow runs.
|
|
90
74
|
*/
|
|
91
75
|
export declare class AutoUserPrompt implements UserPromptHandler {
|
|
92
76
|
prompt(): Promise<UserPromptResult>;
|
|
93
77
|
}
|
|
94
|
-
export {};
|
|
95
78
|
//# sourceMappingURL=prompt.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"prompt.d.ts","sourceRoot":"","sources":["../../src/user/prompt.ts"],"names":[],"mappings":"AAGA,
|
|
1
|
+
{"version":3,"file":"prompt.d.ts","sourceRoot":"","sources":["../../src/user/prompt.ts"],"names":[],"mappings":"AAGA,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,EAAE,OAAO,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,MAAM,aAAa,GACrB;IAAE,IAAI,EAAE,QAAQ,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GAChC;IAAE,IAAI,EAAE,WAAW,CAAA;CAAE,GACrB;IAAE,IAAI,EAAE,QAAQ,CAAA;CAAE,GAClB;IAAE,IAAI,EAAE,SAAS,CAAA;CAAE,GACnB;IAAE,IAAI,EAAE,QAAQ,CAAA;CAAE,GAClB;IAAE,IAAI,EAAE,KAAK,CAAA;CAAE,GACf;IAAE,IAAI,EAAE,KAAK,CAAA;CAAE,GACf;IAAE,IAAI,EAAE,OAAO,CAAC;IAAC,SAAS,EAAE,IAAI,GAAG,MAAM,CAAA;CAAE,GAC3C;IAAE,IAAI,EAAE,aAAa,CAAC;IAAC,SAAS,EAAE,IAAI,GAAG,MAAM,CAAA;CAAE,GACjD;IAAE,IAAI,EAAE,aAAa,CAAA;CAAE,GACvB;IAAE,IAAI,EAAE,YAAY,CAAA;CAAE,GACtB;IAAE,IAAI,EAAE,cAAc,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,GACvC;IAAE,IAAI,EAAE,MAAM,CAAA;CAAE,CAAC;AAErB,0EAA0E;AAC1E,eAAO,MAAM,4BAA4B,IAAI,CAAC;AAE9C;;;GAGG;AACH,qBAAa,cAAc;IACzB,OAAO,CAAC,MAAM,CAA2B;IACzC,OAAO,CAAC,eAAe,CAAkD;;IAUzE,UAAU,CAAC,KAAK,EAAE,MAAM,GAAG,aAAa,EAAE;IAI1C;;;OAGG;IACH,UAAU,CAAC,EAAE,EAAE,CAAC,MAAM,EAAE,aAAa,EAAE,KAAK,IAAI,GAAG,IAAI;IAIvD,OAAO,CAAC,MAAM;CA2Df;AAED;;;GAGG;AACH,MAAM,MAAM,cAAc,GAAG,OAAO,GAAG,SAAS,GAAG,UAAU,GAAG,YAAY,CAAC;AAE7E,MAAM,WAAW,iBAAiB;IAChC,iFAAiF;IACjF,UAAU,EAAE,cAAc,CAAC;CAC5B;AAED,MAAM,WAAW,iBAAiB;IAChC;;;;;OAKG;IACH,MAAM,CACJ,IAAI,EAAE,MAAM,EACZ,KAAK,EAAE,MAAM,EACb,OAAO,EAAE,iBAAiB,GACzB,OAAO,CAAC,gBAAgB,CAAC,CAAC;CAC9B;AAED;;GAEG;AACH,qBAAa,cAAe,YAAW,iBAAiB;IAChD,MAAM,IAAI,OAAO,CAAC,gBAAgB,CAAC;CAG1C"}
|