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.
Files changed (146) hide show
  1. package/dist/agents/implementors/handler.d.ts.map +1 -1
  2. package/dist/agents/implementors/handler.js +2 -1
  3. package/dist/agents/implementors/handler.js.map +1 -1
  4. package/dist/agents/planners/handler.d.ts.map +1 -1
  5. package/dist/agents/planners/handler.js +2 -1
  6. package/dist/agents/planners/handler.js.map +1 -1
  7. package/dist/agents/reviewers/handler.d.ts.map +1 -1
  8. package/dist/agents/reviewers/handler.js +9 -2
  9. package/dist/agents/reviewers/handler.js.map +1 -1
  10. package/dist/agents/runner.d.ts +40 -1
  11. package/dist/agents/runner.d.ts.map +1 -1
  12. package/dist/agents/runner.js +213 -14
  13. package/dist/agents/runner.js.map +1 -1
  14. package/dist/agents/simplifiers/handler.d.ts.map +1 -1
  15. package/dist/agents/simplifiers/handler.js +2 -1
  16. package/dist/agents/simplifiers/handler.js.map +1 -1
  17. package/dist/ansi.d.ts +26 -0
  18. package/dist/ansi.d.ts.map +1 -1
  19. package/dist/ansi.js +26 -0
  20. package/dist/ansi.js.map +1 -1
  21. package/dist/cli.js +46 -16
  22. package/dist/cli.js.map +1 -1
  23. package/dist/flow/built-in/default.js +1 -1
  24. package/dist/flow/built-in/default.js.map +1 -1
  25. package/dist/flow/built-in/default.ts +1 -1
  26. package/dist/flow/built-in/why-so-serious.js +1 -1
  27. package/dist/flow/built-in/why-so-serious.js.map +1 -1
  28. package/dist/flow/executor.d.ts.map +1 -1
  29. package/dist/flow/executor.js +7 -2
  30. package/dist/flow/executor.js.map +1 -1
  31. package/dist/flow/types.d.ts +5 -0
  32. package/dist/flow/types.d.ts.map +1 -1
  33. package/dist/flow/types.js.map +1 -1
  34. package/dist/orchestrator.d.ts +10 -4
  35. package/dist/orchestrator.d.ts.map +1 -1
  36. package/dist/orchestrator.js +34 -14
  37. package/dist/orchestrator.js.map +1 -1
  38. package/dist/providers/claude/session.d.ts +3 -1
  39. package/dist/providers/claude/session.d.ts.map +1 -1
  40. package/dist/providers/claude/session.js +2 -2
  41. package/dist/providers/claude/session.js.map +1 -1
  42. package/dist/providers/codex/session.d.ts +6 -3
  43. package/dist/providers/codex/session.d.ts.map +1 -1
  44. package/dist/providers/codex/session.js +24 -4
  45. package/dist/providers/codex/session.js.map +1 -1
  46. package/dist/providers/copilot/session.d.ts +3 -1
  47. package/dist/providers/copilot/session.d.ts.map +1 -1
  48. package/dist/providers/copilot/session.js +15 -2
  49. package/dist/providers/copilot/session.js.map +1 -1
  50. package/dist/providers/types.d.ts +14 -2
  51. package/dist/providers/types.d.ts.map +1 -1
  52. package/dist/providers/types.js.map +1 -1
  53. package/dist/pty/exit.d.ts +13 -5
  54. package/dist/pty/exit.d.ts.map +1 -1
  55. package/dist/pty/exit.js +19 -19
  56. package/dist/pty/exit.js.map +1 -1
  57. package/dist/pty/spawn.d.ts +12 -6
  58. package/dist/pty/spawn.d.ts.map +1 -1
  59. package/dist/pty/spawn.js +22 -70
  60. package/dist/pty/spawn.js.map +1 -1
  61. package/dist/pty/types.d.ts +12 -3
  62. package/dist/pty/types.d.ts.map +1 -1
  63. package/dist/session/locator.d.ts +23 -2
  64. package/dist/session/locator.d.ts.map +1 -1
  65. package/dist/session/locator.js +67 -4
  66. package/dist/session/locator.js.map +1 -1
  67. package/dist/status-bar.d.ts +21 -1
  68. package/dist/status-bar.d.ts.map +1 -1
  69. package/dist/status-bar.js +109 -34
  70. package/dist/status-bar.js.map +1 -1
  71. package/dist/terminal/cleanup.d.ts +21 -0
  72. package/dist/terminal/cleanup.d.ts.map +1 -0
  73. package/dist/terminal/cleanup.js +22 -0
  74. package/dist/terminal/cleanup.js.map +1 -0
  75. package/dist/terminal/host.d.ts +244 -0
  76. package/dist/terminal/host.d.ts.map +1 -0
  77. package/dist/terminal/host.js +642 -0
  78. package/dist/terminal/host.js.map +1 -0
  79. package/dist/terminal/input-router.d.ts +146 -0
  80. package/dist/terminal/input-router.d.ts.map +1 -0
  81. package/dist/terminal/input-router.js +426 -0
  82. package/dist/terminal/input-router.js.map +1 -0
  83. package/dist/terminal/layout.d.ts +55 -0
  84. package/dist/terminal/layout.d.ts.map +1 -0
  85. package/dist/terminal/layout.js +51 -0
  86. package/dist/terminal/layout.js.map +1 -0
  87. package/dist/terminal/output.d.ts +83 -0
  88. package/dist/terminal/output.d.ts.map +1 -0
  89. package/dist/terminal/output.js +107 -0
  90. package/dist/terminal/output.js.map +1 -0
  91. package/dist/terminal/render.d.ts +36 -0
  92. package/dist/terminal/render.d.ts.map +1 -0
  93. package/dist/terminal/render.js +233 -0
  94. package/dist/terminal/render.js.map +1 -0
  95. package/dist/terminal/virtual-terminal.d.ts +54 -0
  96. package/dist/terminal/virtual-terminal.d.ts.map +1 -0
  97. package/dist/terminal/virtual-terminal.js +110 -0
  98. package/dist/terminal/virtual-terminal.js.map +1 -0
  99. package/dist/terminal-input.d.ts +10 -0
  100. package/dist/terminal-input.d.ts.map +1 -1
  101. package/dist/terminal-input.js +46 -0
  102. package/dist/terminal-input.js.map +1 -1
  103. package/dist/user/auto-curate-prompt.d.ts +17 -0
  104. package/dist/user/auto-curate-prompt.d.ts.map +1 -0
  105. package/dist/user/auto-curate-prompt.js +22 -0
  106. package/dist/user/auto-curate-prompt.js.map +1 -0
  107. package/dist/user/curate-handler.d.ts.map +1 -1
  108. package/dist/user/curate-handler.js +10 -2
  109. package/dist/user/curate-handler.js.map +1 -1
  110. package/dist/user/curate-prompt.d.ts +9 -7
  111. package/dist/user/curate-prompt.d.ts.map +1 -1
  112. package/dist/user/curate-prompt.js +2 -341
  113. package/dist/user/curate-prompt.js.map +1 -1
  114. package/dist/user/handler.d.ts +13 -1
  115. package/dist/user/handler.d.ts.map +1 -1
  116. package/dist/user/handler.js +27 -15
  117. package/dist/user/handler.js.map +1 -1
  118. package/dist/user/hard-wrap.d.ts +11 -0
  119. package/dist/user/hard-wrap.d.ts.map +1 -0
  120. package/dist/user/hard-wrap.js +44 -0
  121. package/dist/user/hard-wrap.js.map +1 -0
  122. package/dist/user/host-curate-prompt.d.ts +34 -0
  123. package/dist/user/host-curate-prompt.d.ts.map +1 -0
  124. package/dist/user/host-curate-prompt.js +453 -0
  125. package/dist/user/host-curate-prompt.js.map +1 -0
  126. package/dist/user/host-prompt.d.ts +21 -0
  127. package/dist/user/host-prompt.d.ts.map +1 -0
  128. package/dist/user/host-prompt.js +337 -0
  129. package/dist/user/host-prompt.js.map +1 -0
  130. package/dist/user/index.d.ts +3 -3
  131. package/dist/user/index.d.ts.map +1 -1
  132. package/dist/user/index.js +2 -2
  133. package/dist/user/index.js.map +1 -1
  134. package/dist/user/plan-pane.d.ts +18 -0
  135. package/dist/user/plan-pane.d.ts.map +1 -0
  136. package/dist/user/plan-pane.js +33 -0
  137. package/dist/user/plan-pane.js.map +1 -0
  138. package/dist/user/prompt.d.ts +25 -42
  139. package/dist/user/prompt.d.ts.map +1 -1
  140. package/dist/user/prompt.js +16 -278
  141. package/dist/user/prompt.js.map +1 -1
  142. package/dist/user/split-surface.d.ts +32 -0
  143. package/dist/user/split-surface.d.ts.map +1 -0
  144. package/dist/user/split-surface.js +66 -0
  145. package/dist/user/split-surface.js.map +1 -0
  146. package/package.json +2 -1
@@ -0,0 +1,453 @@
1
+ import { bold, cyan, dim, reset, visibleLength, } from "../ansi.js";
2
+ import { RawInputParser } from "./prompt.js";
3
+ import { clipToWidth, tagFor, wrapToWidth, } from "./curate-prompt.js";
4
+ import { buildPlanPane } from "./plan-pane.js";
5
+ import { buildSplitSurface, computeSplitMetrics } from "./split-surface.js";
6
+ const DECISION_CYCLE = ["keep", "drop", "revise"];
7
+ const PLAN_PAGE_OVERLAP = 1;
8
+ const COLLAPSE_AT_COLS = 100;
9
+ /**
10
+ * Host-backed curate-verdict prompt. The plan is always visible:
11
+ *
12
+ * - When `cols >= COLLAPSE_AT_COLS`: side-by-side. Issues panel on the
13
+ * left, plan on the right, with a `dim │` divider per row.
14
+ * - When `cols < COLLAPSE_AT_COLS`: top-down stack. Plan on top
15
+ * (`max(3, floor((rows - 1) / 2))` rows), full-width `dim ─` divider,
16
+ * issues panel below for the remaining rows. Both panels scroll
17
+ * independently — plan via PageUp/PageDown/Home/End/wheel, issues via
18
+ * Up/Down cursor movement (the issues pane auto-scrolls to keep the
19
+ * active issue visible).
20
+ *
21
+ * Issues panel: title + summary + per-issue rows. Each issue's full
22
+ * description is wrapped inline; when the cursor row is in revise mode and
23
+ * the editor is open, an inline buffer line renders directly under the
24
+ * issue.
25
+ *
26
+ * - k/d/r toggles the cursor row's decision.
27
+ * - Tab cycles keep → drop → revise → keep.
28
+ * - Enter on a revise row begins or finishes the inline edit; Esc cancels.
29
+ * - PageUp/PageDown/Home/End/wheel scrolls the plan.
30
+ * - Up/Down moves the cursor among issues.
31
+ * - Ctrl+D submits, Ctrl+C accepts all (keep all).
32
+ * - Ctrl+] is consumed by the host's `InputRouter` for dump capture.
33
+ */
34
+ export class HostBackedCuratePrompt {
35
+ host;
36
+ constructor(host) {
37
+ this.host = host;
38
+ }
39
+ async prompt(verdict, planText) {
40
+ if (!this.host.isInteractive || verdict.issues.length === 0) {
41
+ return {
42
+ decisions: verdict.issues.map((_, index) => ({ index, decision: "keep" })),
43
+ };
44
+ }
45
+ const issues = verdict.issues;
46
+ const plan = planText ?? "";
47
+ const state = {
48
+ cursor: 0,
49
+ decisions: issues.map(() => "keep"),
50
+ comments: issues.map(() => undefined),
51
+ editing: undefined,
52
+ planScrollTop: 0,
53
+ };
54
+ const parser = new RawInputParser();
55
+ return new Promise((resolve) => {
56
+ let detach;
57
+ const finish = (result) => {
58
+ detach?.();
59
+ detach = undefined;
60
+ resolve(result);
61
+ };
62
+ const submit = () => {
63
+ for (let i = 0; i < state.decisions.length; i++) {
64
+ if (state.decisions[i] === "revise" && !state.comments[i]) {
65
+ state.decisions[i] = "keep";
66
+ }
67
+ }
68
+ return {
69
+ decisions: state.decisions.map((dec, i) => {
70
+ const rec = { index: i, decision: dec };
71
+ if (dec === "revise" && state.comments[i]) {
72
+ rec.comment = state.comments[i];
73
+ }
74
+ return rec;
75
+ }),
76
+ };
77
+ };
78
+ const processEvents = (events) => {
79
+ let dirty = false;
80
+ let finished = false;
81
+ for (const event of events) {
82
+ if (finished)
83
+ break;
84
+ if (state.editing) {
85
+ const i = state.editing.index;
86
+ if (event.type === "ctrl-c" || event.type === "esc") {
87
+ state.editing = undefined;
88
+ if (!state.comments[i])
89
+ state.decisions[i] = "keep";
90
+ dirty = true;
91
+ continue;
92
+ }
93
+ if (event.type === "submit" || event.type === "newline") {
94
+ const text = state.editing.buffer.trim();
95
+ state.comments[i] = text.length > 0 ? text : undefined;
96
+ state.editing = undefined;
97
+ if (!state.comments[i])
98
+ state.decisions[i] = "keep";
99
+ dirty = true;
100
+ continue;
101
+ }
102
+ if (event.type === "backspace") {
103
+ if (state.editing.buffer.length > 0) {
104
+ state.editing.buffer = state.editing.buffer.slice(0, -1);
105
+ dirty = true;
106
+ }
107
+ continue;
108
+ }
109
+ if (event.type === "insert") {
110
+ state.editing.buffer += event.text;
111
+ dirty = true;
112
+ continue;
113
+ }
114
+ continue;
115
+ }
116
+ if (event.type === "ctrl-c") {
117
+ finish({
118
+ decisions: issues.map((_, i) => ({ index: i, decision: "keep" })),
119
+ });
120
+ finished = true;
121
+ continue;
122
+ }
123
+ if (event.type === "submit") {
124
+ finish(submit());
125
+ finished = true;
126
+ continue;
127
+ }
128
+ if (event.type === "arrow") {
129
+ if (event.direction === "up") {
130
+ state.cursor = (state.cursor - 1 + issues.length) % issues.length;
131
+ dirty = true;
132
+ }
133
+ else if (event.direction === "down") {
134
+ state.cursor = (state.cursor + 1) % issues.length;
135
+ dirty = true;
136
+ }
137
+ continue;
138
+ }
139
+ if (event.type === "scroll-page") {
140
+ const m = planMetrics(plan, this.host);
141
+ const step = Math.max(1, m.planHeight - PLAN_PAGE_OVERLAP);
142
+ const max = Math.max(0, m.planLines - m.planHeight);
143
+ if (event.direction === "up") {
144
+ state.planScrollTop = Math.max(0, state.planScrollTop - step);
145
+ }
146
+ else {
147
+ state.planScrollTop = Math.min(max, state.planScrollTop + step);
148
+ }
149
+ dirty = true;
150
+ continue;
151
+ }
152
+ if (event.type === "scroll-home") {
153
+ state.planScrollTop = 0;
154
+ dirty = true;
155
+ continue;
156
+ }
157
+ if (event.type === "scroll-end") {
158
+ const m = planMetrics(plan, this.host);
159
+ state.planScrollTop = Math.max(0, m.planLines - m.planHeight);
160
+ dirty = true;
161
+ continue;
162
+ }
163
+ if (event.type === "scroll-lines") {
164
+ const m = planMetrics(plan, this.host);
165
+ const max = Math.max(0, m.planLines - m.planHeight);
166
+ state.planScrollTop = Math.min(max, Math.max(0, state.planScrollTop + event.delta));
167
+ dirty = true;
168
+ continue;
169
+ }
170
+ if (event.type === "newline") {
171
+ if (state.decisions[state.cursor] === "revise") {
172
+ state.editing = {
173
+ index: state.cursor,
174
+ buffer: state.comments[state.cursor] ?? "",
175
+ };
176
+ dirty = true;
177
+ }
178
+ continue;
179
+ }
180
+ if (event.type === "tab") {
181
+ const cur = state.decisions[state.cursor];
182
+ const next = DECISION_CYCLE[(DECISION_CYCLE.indexOf(cur) + 1) % DECISION_CYCLE.length];
183
+ state.decisions[state.cursor] = next;
184
+ if (next === "revise" && !state.comments[state.cursor]) {
185
+ state.editing = { index: state.cursor, buffer: "" };
186
+ }
187
+ dirty = true;
188
+ continue;
189
+ }
190
+ if (event.type === "insert") {
191
+ const ch = event.text.toLowerCase();
192
+ const prev = state.decisions[state.cursor];
193
+ if (ch === "k")
194
+ state.decisions[state.cursor] = "keep";
195
+ else if (ch === "d")
196
+ state.decisions[state.cursor] = "drop";
197
+ else if (ch === "r")
198
+ state.decisions[state.cursor] = "revise";
199
+ else
200
+ continue;
201
+ if (state.decisions[state.cursor] === "revise" && !state.comments[state.cursor]) {
202
+ state.editing = { index: state.cursor, buffer: "" };
203
+ }
204
+ if (state.decisions[state.cursor] !== prev)
205
+ dirty = true;
206
+ }
207
+ }
208
+ if (dirty && !finished)
209
+ this.host.scheduleParentUiRender();
210
+ return finished;
211
+ };
212
+ const mode = {
213
+ getSurface: () => {
214
+ const layout = this.host.getLayout();
215
+ const cols = Math.max(20, layout.columns);
216
+ const rows = Math.max(1, layout.childRows);
217
+ return buildSurface(verdict, plan, state, cols, rows);
218
+ },
219
+ onInput: (chunk) => {
220
+ processEvents(parser.parseChunk(chunk));
221
+ return true;
222
+ },
223
+ };
224
+ parser.onDeferred((events) => {
225
+ processEvents(events);
226
+ });
227
+ detach = this.host.attachParentUi(mode);
228
+ });
229
+ }
230
+ }
231
+ function buildLeftPane(verdict, state, width, rows) {
232
+ const issues = verdict.issues;
233
+ const lines = [];
234
+ const n = issues.length;
235
+ const s = n === 1 ? "" : "s";
236
+ lines.push(clipToWidth(`${bold}${cyan}User Verdict Curation${reset} — ${n} issue${s}`, width));
237
+ if (verdict.summary) {
238
+ for (const l of wrapToWidth(verdict.summary, width)) {
239
+ lines.push(`${dim}${l}${reset}`);
240
+ }
241
+ }
242
+ lines.push("");
243
+ // Track each issue's header row so we can scroll the left pane to keep
244
+ // the active issue on screen when the natural surface is taller than
245
+ // `rows`. Editor placement also feeds into the anchor.
246
+ const issueStartRows = [];
247
+ let editorRow;
248
+ let editorCol = 0;
249
+ for (let i = 0; i < issues.length; i++) {
250
+ const isCursor = i === state.cursor;
251
+ const arrow = isCursor ? `${bold}❯${reset}` : " ";
252
+ const tag = tagFor(state.decisions[i]);
253
+ const issue = issues[i];
254
+ const meta = [];
255
+ if (issue.severity)
256
+ meta.push(issue.severity);
257
+ if (issue.category)
258
+ meta.push(issue.category);
259
+ const head = `${arrow} ${tag} `;
260
+ const headWidth = visibleLength(head);
261
+ // Append meta as a trailing whitespace-separated token so wrapToWidth
262
+ // treats it as one wrap unit; the styled token's visible width is what
263
+ // matters for measurement, and visibleLength strips the ANSI codes.
264
+ const metaSuffix = meta.length ? ` ${dim}[${meta.join("/")}]${reset}` : "";
265
+ const desc = issue.description.replace(/\s+/g, " ");
266
+ const text = metaSuffix ? `${desc}${metaSuffix}` : desc;
267
+ const avail = Math.max(1, width - headWidth);
268
+ const wrapped = wrapToWidth(text, avail);
269
+ issueStartRows.push(lines.length);
270
+ if (wrapped.length === 0) {
271
+ lines.push(clipToWidth(head, width));
272
+ }
273
+ else {
274
+ lines.push(`${head}${wrapped[0]}`);
275
+ const indent = " ".repeat(headWidth);
276
+ for (let j = 1; j < wrapped.length; j++) {
277
+ lines.push(`${indent}${wrapped[j]}`);
278
+ }
279
+ }
280
+ // Inline revise row(s).
281
+ if (state.decisions[i] === "revise") {
282
+ const reviseAvail = Math.max(1, width - 4);
283
+ if (state.editing && state.editing.index === i) {
284
+ const buf = state.editing.buffer;
285
+ const prefix = " └─ Revise: ";
286
+ const prefixWidth = visibleLength(prefix);
287
+ const inputWidth = Math.max(1, width - prefixWidth - 1);
288
+ let display;
289
+ if (visibleLength(buf) > inputWidth) {
290
+ display = `…${buf.slice(-(inputWidth - 1))}`;
291
+ }
292
+ else {
293
+ display = buf;
294
+ }
295
+ const row = `${dim}${prefix}${reset}${display}`;
296
+ lines.push(clipToWidth(row, width));
297
+ editorRow = lines.length - 1;
298
+ editorCol = Math.min(width - 1, prefixWidth + visibleLength(display));
299
+ }
300
+ else if (state.comments[i]) {
301
+ const prefix = " └─ Revise: ";
302
+ for (const l of wrapToWidth(state.comments[i], reviseAvail)) {
303
+ lines.push(`${dim}${prefix}${l}${reset}`);
304
+ }
305
+ }
306
+ }
307
+ if (i < issues.length - 1)
308
+ lines.push("");
309
+ }
310
+ lines.push("");
311
+ const helpStartRow = lines.length;
312
+ const helpRows = [];
313
+ if (state.editing) {
314
+ helpRows.push("Enter submit · Esc cancel");
315
+ }
316
+ else {
317
+ helpRows.push("↑/↓ navigate · k/d/r set · Tab cycle · Enter edit · Ctrl+D submit · Ctrl+C keep-all");
318
+ }
319
+ for (const row of helpRows) {
320
+ for (const l of wrapToWidth(row, width)) {
321
+ lines.push(`${dim}${l}${reset}`);
322
+ }
323
+ }
324
+ // Scroll the left pane so the active issue stays on screen. Anchor to the
325
+ // active issue's header row; when the editor is open, also keep the editor
326
+ // row visible (preferring the editor when both can't fit). Falls back to
327
+ // scrollTop=0 when the natural surface fits in `rows`.
328
+ const activeStart = issueStartRows[state.cursor] ?? 0;
329
+ const activeEndExclusive = state.cursor + 1 < issueStartRows.length
330
+ ? issueStartRows[state.cursor + 1] - 1 // one before the spacer
331
+ : helpStartRow - 1; // last issue ends just before the spacer
332
+ // Prefer to show the entire active block; if it is taller than `rows`,
333
+ // fall back to the editor row (when editing) or the header row.
334
+ let scrollTop = 0;
335
+ const total = lines.length;
336
+ if (total > rows) {
337
+ // Default: anchor to the start of the active issue.
338
+ scrollTop = activeStart;
339
+ // If the block fits and there is room above, pull the window up so we
340
+ // also include some preceding context rather than leaving blank rows
341
+ // below.
342
+ if (activeEndExclusive - scrollTop + 1 < rows) {
343
+ scrollTop = Math.max(0, total - rows);
344
+ if (scrollTop > activeStart)
345
+ scrollTop = activeStart;
346
+ }
347
+ // If editing, prefer keeping the editor row visible.
348
+ if (editorRow !== undefined && editorRow >= scrollTop + rows) {
349
+ scrollTop = editorRow - rows + 1;
350
+ }
351
+ // Clamp.
352
+ if (scrollTop < 0)
353
+ scrollTop = 0;
354
+ if (scrollTop + rows > total)
355
+ scrollTop = total - rows;
356
+ }
357
+ let cursorRow;
358
+ let cursorCol;
359
+ if (editorRow !== undefined) {
360
+ cursorRow = editorRow - scrollTop;
361
+ cursorCol = editorCol;
362
+ }
363
+ else {
364
+ // Place the cursor on the active issue's header row when not editing.
365
+ cursorRow = activeStart - scrollTop;
366
+ cursorCol = 0;
367
+ }
368
+ // Slice / pad to exactly `rows`.
369
+ if (scrollTop > 0) {
370
+ lines.splice(0, scrollTop);
371
+ }
372
+ while (lines.length < rows)
373
+ lines.push("");
374
+ if (lines.length > rows)
375
+ lines.splice(rows, lines.length - rows);
376
+ if (cursorRow < 0)
377
+ cursorRow = 0;
378
+ if (cursorRow >= rows)
379
+ cursorRow = rows - 1;
380
+ if (cursorCol < 0)
381
+ cursorCol = 0;
382
+ if (cursorCol >= width)
383
+ cursorCol = Math.max(0, width - 1);
384
+ return {
385
+ lines: lines.map((l) => clipToWidth(l, width)),
386
+ cursor: { row: cursorRow, col: cursorCol },
387
+ };
388
+ }
389
+ function buildRightPane(plan, state, width, rows) {
390
+ // The curate phase always follows planner+reviewer cycles, so the plan
391
+ // header reads "Generated Plan" — we keep the same "first" label since the
392
+ // plan being reviewed at this point is the current generated plan.
393
+ const pane = buildPlanPane(plan, "first", width);
394
+ const max = Math.max(0, pane.lines.length - rows);
395
+ if (state.planScrollTop > max)
396
+ state.planScrollTop = max;
397
+ if (state.planScrollTop < 0)
398
+ state.planScrollTop = 0;
399
+ const sliced = pane.lines.slice(state.planScrollTop, state.planScrollTop + rows);
400
+ while (sliced.length < rows)
401
+ sliced.push("");
402
+ return sliced.map((l) => clipToWidth(l, width));
403
+ }
404
+ function computeNarrowPlanRows(rows) {
405
+ // Reserve 1 row for the divider; split the remainder roughly in half with a
406
+ // floor of 3 plan rows so the header + rule + at least one body row remain
407
+ // visible.
408
+ return Math.max(3, Math.floor((rows - 1) / 2));
409
+ }
410
+ function buildSurface(verdict, plan, state, cols, rows) {
411
+ const split = computeSplitMetrics({ cols, rows, collapseAt: COLLAPSE_AT_COLS });
412
+ if (split.collapsed) {
413
+ // Narrow stack: plan on top, divider rule, issues below. Both panes are
414
+ // independently scrollable (plan via PageUp/PageDown/Home/End/wheel,
415
+ // issues via Up/Down cursor movement).
416
+ const planRows = computeNarrowPlanRows(rows);
417
+ const issueRows = Math.max(1, rows - 1 - planRows);
418
+ const right = buildRightPane(plan, state, cols, planRows);
419
+ const left = buildLeftPane(verdict, state, cols, issueRows);
420
+ const separator = `${dim}${"─".repeat(cols)}${reset}`;
421
+ const lines = [...right, separator, ...left.lines];
422
+ while (lines.length < rows)
423
+ lines.push("");
424
+ if (lines.length > rows)
425
+ lines.splice(rows, lines.length - rows);
426
+ let cursorRow = planRows + 1 + left.cursor.row;
427
+ if (cursorRow < 0)
428
+ cursorRow = 0;
429
+ if (cursorRow >= rows)
430
+ cursorRow = rows - 1;
431
+ return {
432
+ lines,
433
+ cursor: { row: cursorRow, col: left.cursor.col },
434
+ };
435
+ }
436
+ const left = buildLeftPane(verdict, state, split.leftWidth, rows);
437
+ const right = buildRightPane(plan, state, split.rightWidth, rows);
438
+ return buildSplitSurface({ lines: left.lines, cursor: left.cursor }, { lines: right }, { cols, rows, collapseAt: COLLAPSE_AT_COLS });
439
+ }
440
+ function planMetrics(plan, host) {
441
+ const layout = host.getLayout();
442
+ const cols = Math.max(20, layout.columns);
443
+ const rows = Math.max(1, layout.childRows);
444
+ const split = computeSplitMetrics({ cols, rows, collapseAt: COLLAPSE_AT_COLS });
445
+ if (split.collapsed) {
446
+ const planRows = computeNarrowPlanRows(rows);
447
+ const pane = buildPlanPane(plan, "first", cols);
448
+ return { planHeight: planRows, planLines: pane.lines.length };
449
+ }
450
+ const pane = buildPlanPane(plan, "first", split.rightWidth);
451
+ return { planHeight: rows, planLines: pane.lines.length };
452
+ }
453
+ //# sourceMappingURL=host-curate-prompt.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"host-curate-prompt.js","sourceRoot":"","sources":["../../src/user/host-curate-prompt.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,IAAI,EACJ,IAAI,EACJ,GAAG,EACH,KAAK,EACL,aAAa,GACd,MAAM,YAAY,CAAC;AACpB,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAC7C,OAAO,EACL,WAAW,EACX,MAAM,EACN,WAAW,GAKZ,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAC/C,OAAO,EAAE,iBAAiB,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AAI5E,MAAM,cAAc,GAAqB,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,CAAC,CAAC;AACpE,MAAM,iBAAiB,GAAG,CAAC,CAAC;AAC5B,MAAM,gBAAgB,GAAG,GAAG,CAAC;AAE7B;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AACH,MAAM,OAAO,sBAAsB;IACJ;IAA7B,YAA6B,IAAkB;QAAlB,SAAI,GAAJ,IAAI,CAAc;IAAG,CAAC;IAEnD,KAAK,CAAC,MAAM,CAAC,OAAsB,EAAE,QAAiB;QACpD,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,aAAa,IAAI,OAAO,CAAC,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC5D,OAAO;gBACL,SAAS,EAAE,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,EAAE,CAAC,CAAC,EAAE,KAAK,EAAE,QAAQ,EAAE,MAAe,EAAE,CAAC,CAAC;aACpF,CAAC;QACJ,CAAC;QAED,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;QAC9B,MAAM,IAAI,GAAG,QAAQ,IAAI,EAAE,CAAC;QAC5B,MAAM,KAAK,GAAgB;YACzB,MAAM,EAAE,CAAC;YACT,SAAS,EAAE,MAAM,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,MAAM,CAAC;YACnC,QAAQ,EAAE,MAAM,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC;YACrC,OAAO,EAAE,SAAS;YAClB,aAAa,EAAE,CAAC;SACjB,CAAC;QACF,MAAM,MAAM,GAAG,IAAI,cAAc,EAAE,CAAC;QAEpC,OAAO,IAAI,OAAO,CAAe,CAAC,OAAO,EAAE,EAAE;YAC3C,IAAI,MAAgC,CAAC;YAErC,MAAM,MAAM,GAAG,CAAC,MAAoB,EAAQ,EAAE;gBAC5C,MAAM,EAAE,EAAE,CAAC;gBACX,MAAM,GAAG,SAAS,CAAC;gBACnB,OAAO,CAAC,MAAM,CAAC,CAAC;YAClB,CAAC,CAAC;YAEF,MAAM,MAAM,GAAG,GAAiB,EAAE;gBAChC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,SAAS,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;oBAChD,IAAI,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,KAAK,QAAQ,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC;wBAC1D,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC;oBAC9B,CAAC;gBACH,CAAC;gBACD,OAAO;oBACL,SAAS,EAAE,KAAK,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,CAAC,EAAE,EAAE;wBACxC,MAAM,GAAG,GAAyB,EAAE,KAAK,EAAE,CAAC,EAAE,QAAQ,EAAE,GAAG,EAAE,CAAC;wBAC9D,IAAI,GAAG,KAAK,QAAQ,IAAI,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC;4BAC1C,GAAG,CAAC,OAAO,GAAG,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;wBAClC,CAAC;wBACD,OAAO,GAAG,CAAC;oBACb,CAAC,CAAC;iBACH,CAAC;YACJ,CAAC,CAAC;YAEF,MAAM,aAAa,GAAG,CAAC,MAA4C,EAAW,EAAE;gBAC9E,IAAI,KAAK,GAAG,KAAK,CAAC;gBAClB,IAAI,QAAQ,GAAG,KAAK,CAAC;gBACrB,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;oBAC3B,IAAI,QAAQ;wBAAE,MAAM;oBAEpB,IAAI,KAAK,CAAC,OAAO,EAAE,CAAC;wBAClB,MAAM,CAAC,GAAG,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;wBAC9B,IAAI,KAAK,CAAC,IAAI,KAAK,QAAQ,IAAI,KAAK,CAAC,IAAI,KAAK,KAAK,EAAE,CAAC;4BACpD,KAAK,CAAC,OAAO,GAAG,SAAS,CAAC;4BAC1B,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC;gCAAE,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC;4BACpD,KAAK,GAAG,IAAI,CAAC;4BACb,SAAS;wBACX,CAAC;wBACD,IAAI,KAAK,CAAC,IAAI,KAAK,QAAQ,IAAI,KAAK,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;4BACxD,MAAM,IAAI,GAAG,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC;4BACzC,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC;4BACvD,KAAK,CAAC,OAAO,GAAG,SAAS,CAAC;4BAC1B,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC;gCAAE,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC;4BACpD,KAAK,GAAG,IAAI,CAAC;4BACb,SAAS;wBACX,CAAC;wBACD,IAAI,KAAK,CAAC,IAAI,KAAK,WAAW,EAAE,CAAC;4BAC/B,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gCACpC,KAAK,CAAC,OAAO,CAAC,MAAM,GAAG,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;gCACzD,KAAK,GAAG,IAAI,CAAC;4BACf,CAAC;4BACD,SAAS;wBACX,CAAC;wBACD,IAAI,KAAK,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;4BAC5B,KAAK,CAAC,OAAO,CAAC,MAAM,IAAI,KAAK,CAAC,IAAI,CAAC;4BACnC,KAAK,GAAG,IAAI,CAAC;4BACb,SAAS;wBACX,CAAC;wBACD,SAAS;oBACX,CAAC;oBAED,IAAI,KAAK,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;wBAC5B,MAAM,CAAC;4BACL,SAAS,EAAE,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,QAAQ,EAAE,MAAe,EAAE,CAAC,CAAC;yBAC3E,CAAC,CAAC;wBACH,QAAQ,GAAG,IAAI,CAAC;wBAChB,SAAS;oBACX,CAAC;oBACD,IAAI,KAAK,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;wBAC5B,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC;wBACjB,QAAQ,GAAG,IAAI,CAAC;wBAChB,SAAS;oBACX,CAAC;oBACD,IAAI,KAAK,CAAC,IAAI,KAAK,OAAO,EAAE,CAAC;wBAC3B,IAAI,KAAK,CAAC,SAAS,KAAK,IAAI,EAAE,CAAC;4BAC7B,KAAK,CAAC,MAAM,GAAG,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,GAAG,MAAM,CAAC,MAAM,CAAC,GAAG,MAAM,CAAC,MAAM,CAAC;4BAClE,KAAK,GAAG,IAAI,CAAC;wBACf,CAAC;6BAAM,IAAI,KAAK,CAAC,SAAS,KAAK,MAAM,EAAE,CAAC;4BACtC,KAAK,CAAC,MAAM,GAAG,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,GAAG,MAAM,CAAC,MAAM,CAAC;4BAClD,KAAK,GAAG,IAAI,CAAC;wBACf,CAAC;wBACD,SAAS;oBACX,CAAC;oBACD,IAAI,KAAK,CAAC,IAAI,KAAK,aAAa,EAAE,CAAC;wBACjC,MAAM,CAAC,GAAG,WAAW,CAAC,IAAI,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC;wBACvC,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,UAAU,GAAG,iBAAiB,CAAC,CAAC;wBAC3D,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,SAAS,GAAG,CAAC,CAAC,UAAU,CAAC,CAAC;wBACpD,IAAI,KAAK,CAAC,SAAS,KAAK,IAAI,EAAE,CAAC;4BAC7B,KAAK,CAAC,aAAa,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,KAAK,CAAC,aAAa,GAAG,IAAI,CAAC,CAAC;wBAChE,CAAC;6BAAM,CAAC;4BACN,KAAK,CAAC,aAAa,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,CAAC,aAAa,GAAG,IAAI,CAAC,CAAC;wBAClE,CAAC;wBACD,KAAK,GAAG,IAAI,CAAC;wBACb,SAAS;oBACX,CAAC;oBACD,IAAI,KAAK,CAAC,IAAI,KAAK,aAAa,EAAE,CAAC;wBACjC,KAAK,CAAC,aAAa,GAAG,CAAC,CAAC;wBACxB,KAAK,GAAG,IAAI,CAAC;wBACb,SAAS;oBACX,CAAC;oBACD,IAAI,KAAK,CAAC,IAAI,KAAK,YAAY,EAAE,CAAC;wBAChC,MAAM,CAAC,GAAG,WAAW,CAAC,IAAI,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC;wBACvC,KAAK,CAAC,aAAa,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,SAAS,GAAG,CAAC,CAAC,UAAU,CAAC,CAAC;wBAC9D,KAAK,GAAG,IAAI,CAAC;wBACb,SAAS;oBACX,CAAC;oBACD,IAAI,KAAK,CAAC,IAAI,KAAK,cAAc,EAAE,CAAC;wBAClC,MAAM,CAAC,GAAG,WAAW,CAAC,IAAI,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC;wBACvC,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,SAAS,GAAG,CAAC,CAAC,UAAU,CAAC,CAAC;wBACpD,KAAK,CAAC,aAAa,GAAG,IAAI,CAAC,GAAG,CAC5B,GAAG,EACH,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,KAAK,CAAC,aAAa,GAAG,KAAK,CAAC,KAAK,CAAC,CAC/C,CAAC;wBACF,KAAK,GAAG,IAAI,CAAC;wBACb,SAAS;oBACX,CAAC;oBACD,IAAI,KAAK,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;wBAC7B,IAAI,KAAK,CAAC,SAAS,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,QAAQ,EAAE,CAAC;4BAC/C,KAAK,CAAC,OAAO,GAAG;gCACd,KAAK,EAAE,KAAK,CAAC,MAAM;gCACnB,MAAM,EAAE,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,EAAE;6BAC3C,CAAC;4BACF,KAAK,GAAG,IAAI,CAAC;wBACf,CAAC;wBACD,SAAS;oBACX,CAAC;oBACD,IAAI,KAAK,CAAC,IAAI,KAAK,KAAK,EAAE,CAAC;wBACzB,MAAM,GAAG,GAAG,KAAK,CAAC,SAAS,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;wBAC1C,MAAM,IAAI,GAAG,cAAc,CAAC,CAAC,cAAc,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,GAAG,cAAc,CAAC,MAAM,CAAC,CAAC;wBACvF,KAAK,CAAC,SAAS,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,IAAI,CAAC;wBACrC,IAAI,IAAI,KAAK,QAAQ,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC;4BACvD,KAAK,CAAC,OAAO,GAAG,EAAE,KAAK,EAAE,KAAK,CAAC,MAAM,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC;wBACtD,CAAC;wBACD,KAAK,GAAG,IAAI,CAAC;wBACb,SAAS;oBACX,CAAC;oBACD,IAAI,KAAK,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;wBAC5B,MAAM,EAAE,GAAG,KAAK,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC;wBACpC,MAAM,IAAI,GAAG,KAAK,CAAC,SAAS,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;wBAC3C,IAAI,EAAE,KAAK,GAAG;4BAAE,KAAK,CAAC,SAAS,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,MAAM,CAAC;6BAClD,IAAI,EAAE,KAAK,GAAG;4BAAE,KAAK,CAAC,SAAS,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,MAAM,CAAC;6BACvD,IAAI,EAAE,KAAK,GAAG;4BAAE,KAAK,CAAC,SAAS,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,QAAQ,CAAC;;4BACzD,SAAS;wBACd,IAAI,KAAK,CAAC,SAAS,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,QAAQ,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC;4BAChF,KAAK,CAAC,OAAO,GAAG,EAAE,KAAK,EAAE,KAAK,CAAC,MAAM,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC;wBACtD,CAAC;wBACD,IAAI,KAAK,CAAC,SAAS,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,IAAI;4BAAE,KAAK,GAAG,IAAI,CAAC;oBAC3D,CAAC;gBACH,CAAC;gBACD,IAAI,KAAK,IAAI,CAAC,QAAQ;oBAAE,IAAI,CAAC,IAAI,CAAC,sBAAsB,EAAE,CAAC;gBAC3D,OAAO,QAAQ,CAAC;YAClB,CAAC,CAAC;YAEF,MAAM,IAAI,GAAqB;gBAC7B,UAAU,EAAE,GAAkB,EAAE;oBAC9B,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,CAAC;oBACrC,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,MAAM,CAAC,OAAO,CAAC,CAAC;oBAC1C,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,MAAM,CAAC,SAAS,CAAC,CAAC;oBAC3C,OAAO,YAAY,CAAC,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;gBACxD,CAAC;gBACD,OAAO,EAAE,CAAC,KAAa,EAAW,EAAE;oBAClC,aAAa,CAAC,MAAM,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,CAAC;oBACxC,OAAO,IAAI,CAAC;gBACd,CAAC;aACF,CAAC;YAEF,MAAM,CAAC,UAAU,CAAC,CAAC,MAAM,EAAE,EAAE;gBAC3B,aAAa,CAAC,MAAM,CAAC,CAAC;YACxB,CAAC,CAAC,CAAC;YAEH,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC;QAC1C,CAAC,CAAC,CAAC;IACL,CAAC;CACF;AAeD,SAAS,aAAa,CACpB,OAAsB,EACtB,KAAkB,EAClB,KAAa,EACb,IAAY;IAEZ,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAC9B,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,MAAM,CAAC,GAAG,MAAM,CAAC,MAAM,CAAC;IACxB,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC;IAC7B,KAAK,CAAC,IAAI,CAAC,WAAW,CACpB,GAAG,IAAI,GAAG,IAAI,wBAAwB,KAAK,MAAM,CAAC,SAAS,CAAC,EAAE,EAC9D,KAAK,CACN,CAAC,CAAC;IACH,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC;QACpB,KAAK,MAAM,CAAC,IAAI,WAAW,CAAC,OAAO,CAAC,OAAO,EAAE,KAAK,CAAC,EAAE,CAAC;YACpD,KAAK,CAAC,IAAI,CAAC,GAAG,GAAG,GAAG,CAAC,GAAG,KAAK,EAAE,CAAC,CAAC;QACnC,CAAC;IACH,CAAC;IACD,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAEf,uEAAuE;IACvE,qEAAqE;IACrE,uDAAuD;IACvD,MAAM,cAAc,GAAa,EAAE,CAAC;IACpC,IAAI,SAA6B,CAAC;IAClC,IAAI,SAAS,GAAG,CAAC,CAAC;IAElB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACvC,MAAM,QAAQ,GAAG,CAAC,KAAK,KAAK,CAAC,MAAM,CAAC;QACpC,MAAM,KAAK,GAAG,QAAQ,CAAC,CAAC,CAAC,GAAG,IAAI,IAAI,KAAK,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC;QAClD,MAAM,GAAG,GAAG,MAAM,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC;QACvC,MAAM,KAAK,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC;QACxB,MAAM,IAAI,GAAa,EAAE,CAAC;QAC1B,IAAI,KAAK,CAAC,QAAQ;YAAE,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;QAC9C,IAAI,KAAK,CAAC,QAAQ;YAAE,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;QAC9C,MAAM,IAAI,GAAG,GAAG,KAAK,IAAI,GAAG,GAAG,CAAC;QAChC,MAAM,SAAS,GAAG,aAAa,CAAC,IAAI,CAAC,CAAC;QACtC,sEAAsE;QACtE,uEAAuE;QACvE,oEAAoE;QACpE,MAAM,UAAU,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,GAAG,IAAI,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAC3E,MAAM,IAAI,GAAG,KAAK,CAAC,WAAW,CAAC,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;QACpD,MAAM,IAAI,GAAG,UAAU,CAAC,CAAC,CAAC,GAAG,IAAI,GAAG,UAAU,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;QACxD,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,KAAK,GAAG,SAAS,CAAC,CAAC;QAC7C,MAAM,OAAO,GAAG,WAAW,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;QACzC,cAAc,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;QAClC,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACzB,KAAK,CAAC,IAAI,CAAC,WAAW,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC,CAAC;QACvC,CAAC;aAAM,CAAC;YACN,KAAK,CAAC,IAAI,CAAC,GAAG,IAAI,GAAG,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;YACnC,MAAM,MAAM,GAAG,GAAG,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;YACrC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;gBACxC,KAAK,CAAC,IAAI,CAAC,GAAG,MAAM,GAAG,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;YACvC,CAAC;QACH,CAAC;QAED,wBAAwB;QACxB,IAAI,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,KAAK,QAAQ,EAAE,CAAC;YACpC,MAAM,WAAW,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,KAAK,GAAG,CAAC,CAAC,CAAC;YAC3C,IAAI,KAAK,CAAC,OAAO,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,KAAK,CAAC,EAAE,CAAC;gBAC/C,MAAM,GAAG,GAAG,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC;gBACjC,MAAM,MAAM,GAAG,eAAe,CAAC;gBAC/B,MAAM,WAAW,GAAG,aAAa,CAAC,MAAM,CAAC,CAAC;gBAC1C,MAAM,UAAU,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,KAAK,GAAG,WAAW,GAAG,CAAC,CAAC,CAAC;gBACxD,IAAI,OAAe,CAAC;gBACpB,IAAI,aAAa,CAAC,GAAG,CAAC,GAAG,UAAU,EAAE,CAAC;oBACpC,OAAO,GAAG,IAAI,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,UAAU,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;gBAC/C,CAAC;qBAAM,CAAC;oBACN,OAAO,GAAG,GAAG,CAAC;gBAChB,CAAC;gBACD,MAAM,GAAG,GAAG,GAAG,GAAG,GAAG,MAAM,GAAG,KAAK,GAAG,OAAO,EAAE,CAAC;gBAChD,KAAK,CAAC,IAAI,CAAC,WAAW,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC,CAAC;gBACpC,SAAS,GAAG,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC;gBAC7B,SAAS,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,GAAG,CAAC,EAAE,WAAW,GAAG,aAAa,CAAC,OAAO,CAAC,CAAC,CAAC;YACxE,CAAC;iBAAM,IAAI,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC;gBAC7B,MAAM,MAAM,GAAG,eAAe,CAAC;gBAC/B,KAAK,MAAM,CAAC,IAAI,WAAW,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAE,EAAE,WAAW,CAAC,EAAE,CAAC;oBAC7D,KAAK,CAAC,IAAI,CAAC,GAAG,GAAG,GAAG,MAAM,GAAG,CAAC,GAAG,KAAK,EAAE,CAAC,CAAC;gBAC5C,CAAC;YACH,CAAC;QACH,CAAC;QAED,IAAI,CAAC,GAAG,MAAM,CAAC,MAAM,GAAG,CAAC;YAAE,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAC5C,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACf,MAAM,YAAY,GAAG,KAAK,CAAC,MAAM,CAAC;IAClC,MAAM,QAAQ,GAAa,EAAE,CAAC;IAC9B,IAAI,KAAK,CAAC,OAAO,EAAE,CAAC;QAClB,QAAQ,CAAC,IAAI,CAAC,2BAA2B,CAAC,CAAC;IAC7C,CAAC;SAAM,CAAC;QACN,QAAQ,CAAC,IAAI,CAAC,qFAAqF,CAAC,CAAC;IACvG,CAAC;IACD,KAAK,MAAM,GAAG,IAAI,QAAQ,EAAE,CAAC;QAC3B,KAAK,MAAM,CAAC,IAAI,WAAW,CAAC,GAAG,EAAE,KAAK,CAAC,EAAE,CAAC;YACxC,KAAK,CAAC,IAAI,CAAC,GAAG,GAAG,GAAG,CAAC,GAAG,KAAK,EAAE,CAAC,CAAC;QACnC,CAAC;IACH,CAAC;IAED,0EAA0E;IAC1E,2EAA2E;IAC3E,yEAAyE;IACzE,uDAAuD;IACvD,MAAM,WAAW,GAAG,cAAc,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;IACtD,MAAM,kBAAkB,GAAG,KAAK,CAAC,MAAM,GAAG,CAAC,GAAG,cAAc,CAAC,MAAM;QACjE,CAAC,CAAC,cAAc,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,wBAAwB;QAC/D,CAAC,CAAC,YAAY,GAAG,CAAC,CAAC,CAAoB,yCAAyC;IAClF,uEAAuE;IACvE,gEAAgE;IAChE,IAAI,SAAS,GAAG,CAAC,CAAC;IAClB,MAAM,KAAK,GAAG,KAAK,CAAC,MAAM,CAAC;IAC3B,IAAI,KAAK,GAAG,IAAI,EAAE,CAAC;QACjB,oDAAoD;QACpD,SAAS,GAAG,WAAW,CAAC;QACxB,sEAAsE;QACtE,qEAAqE;QACrE,SAAS;QACT,IAAI,kBAAkB,GAAG,SAAS,GAAG,CAAC,GAAG,IAAI,EAAE,CAAC;YAC9C,SAAS,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,KAAK,GAAG,IAAI,CAAC,CAAC;YACtC,IAAI,SAAS,GAAG,WAAW;gBAAE,SAAS,GAAG,WAAW,CAAC;QACvD,CAAC;QACD,qDAAqD;QACrD,IAAI,SAAS,KAAK,SAAS,IAAI,SAAS,IAAI,SAAS,GAAG,IAAI,EAAE,CAAC;YAC7D,SAAS,GAAG,SAAS,GAAG,IAAI,GAAG,CAAC,CAAC;QACnC,CAAC;QACD,SAAS;QACT,IAAI,SAAS,GAAG,CAAC;YAAE,SAAS,GAAG,CAAC,CAAC;QACjC,IAAI,SAAS,GAAG,IAAI,GAAG,KAAK;YAAE,SAAS,GAAG,KAAK,GAAG,IAAI,CAAC;IACzD,CAAC;IAED,IAAI,SAAiB,CAAC;IACtB,IAAI,SAAiB,CAAC;IACtB,IAAI,SAAS,KAAK,SAAS,EAAE,CAAC;QAC5B,SAAS,GAAG,SAAS,GAAG,SAAS,CAAC;QAClC,SAAS,GAAG,SAAS,CAAC;IACxB,CAAC;SAAM,CAAC;QACN,sEAAsE;QACtE,SAAS,GAAG,WAAW,GAAG,SAAS,CAAC;QACpC,SAAS,GAAG,CAAC,CAAC;IAChB,CAAC;IAED,iCAAiC;IACjC,IAAI,SAAS,GAAG,CAAC,EAAE,CAAC;QAClB,KAAK,CAAC,MAAM,CAAC,CAAC,EAAE,SAAS,CAAC,CAAC;IAC7B,CAAC;IACD,OAAO,KAAK,CAAC,MAAM,GAAG,IAAI;QAAE,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAC3C,IAAI,KAAK,CAAC,MAAM,GAAG,IAAI;QAAE,KAAK,CAAC,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC;IAEjE,IAAI,SAAS,GAAG,CAAC;QAAE,SAAS,GAAG,CAAC,CAAC;IACjC,IAAI,SAAS,IAAI,IAAI;QAAE,SAAS,GAAG,IAAI,GAAG,CAAC,CAAC;IAC5C,IAAI,SAAS,GAAG,CAAC;QAAE,SAAS,GAAG,CAAC,CAAC;IACjC,IAAI,SAAS,IAAI,KAAK;QAAE,SAAS,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,KAAK,GAAG,CAAC,CAAC,CAAC;IAE3D,OAAO;QACL,KAAK,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,WAAW,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC;QAC9C,MAAM,EAAE,EAAE,GAAG,EAAE,SAAS,EAAE,GAAG,EAAE,SAAS,EAAE;KAC3C,CAAC;AACJ,CAAC;AAED,SAAS,cAAc,CACrB,IAAY,EACZ,KAAkB,EAClB,KAAa,EACb,IAAY;IAEZ,uEAAuE;IACvE,2EAA2E;IAC3E,mEAAmE;IACnE,MAAM,IAAI,GAAG,aAAa,CAAC,IAAI,EAAE,OAAO,EAAE,KAAK,CAAC,CAAC;IACjD,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC;IAClD,IAAI,KAAK,CAAC,aAAa,GAAG,GAAG;QAAE,KAAK,CAAC,aAAa,GAAG,GAAG,CAAC;IACzD,IAAI,KAAK,CAAC,aAAa,GAAG,CAAC;QAAE,KAAK,CAAC,aAAa,GAAG,CAAC,CAAC;IACrD,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,CAC7B,KAAK,CAAC,aAAa,EACnB,KAAK,CAAC,aAAa,GAAG,IAAI,CAC3B,CAAC;IACF,OAAO,MAAM,CAAC,MAAM,GAAG,IAAI;QAAE,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAC7C,OAAO,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,WAAW,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC;AAClD,CAAC;AAED,SAAS,qBAAqB,CAAC,IAAY;IACzC,4EAA4E;IAC5E,2EAA2E;IAC3E,WAAW;IACX,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;AACjD,CAAC;AAED,SAAS,YAAY,CACnB,OAAsB,EACtB,IAAY,EACZ,KAAkB,EAClB,IAAY,EACZ,IAAY;IAEZ,MAAM,KAAK,GAAG,mBAAmB,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,UAAU,EAAE,gBAAgB,EAAE,CAAC,CAAC;IAChF,IAAI,KAAK,CAAC,SAAS,EAAE,CAAC;QACpB,wEAAwE;QACxE,qEAAqE;QACrE,uCAAuC;QACvC,MAAM,QAAQ,GAAG,qBAAqB,CAAC,IAAI,CAAC,CAAC;QAC7C,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,GAAG,CAAC,GAAG,QAAQ,CAAC,CAAC;QACnD,MAAM,KAAK,GAAG,cAAc,CAAC,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,QAAQ,CAAC,CAAC;QAC1D,MAAM,IAAI,GAAG,aAAa,CAAC,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,SAAS,CAAC,CAAC;QAC5D,MAAM,SAAS,GAAG,GAAG,GAAG,GAAG,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,KAAK,EAAE,CAAC;QACtD,MAAM,KAAK,GAAa,CAAC,GAAG,KAAK,EAAE,SAAS,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC;QAC7D,OAAO,KAAK,CAAC,MAAM,GAAG,IAAI;YAAE,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QAC3C,IAAI,KAAK,CAAC,MAAM,GAAG,IAAI;YAAE,KAAK,CAAC,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC;QACjE,IAAI,SAAS,GAAG,QAAQ,GAAG,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC;QAC/C,IAAI,SAAS,GAAG,CAAC;YAAE,SAAS,GAAG,CAAC,CAAC;QACjC,IAAI,SAAS,IAAI,IAAI;YAAE,SAAS,GAAG,IAAI,GAAG,CAAC,CAAC;QAC5C,OAAO;YACL,KAAK;YACL,MAAM,EAAE,EAAE,GAAG,EAAE,SAAS,EAAE,GAAG,EAAE,IAAI,CAAC,MAAM,CAAC,GAAG,EAAE;SACjD,CAAC;IACJ,CAAC;IACD,MAAM,IAAI,GAAG,aAAa,CAAC,OAAO,EAAE,KAAK,EAAE,KAAK,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC;IAClE,MAAM,KAAK,GAAG,cAAc,CAAC,IAAI,EAAE,KAAK,EAAE,KAAK,CAAC,UAAW,EAAE,IAAI,CAAC,CAAC;IACnE,OAAO,iBAAiB,CACtB,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,EAC1C,EAAE,KAAK,EAAE,KAAK,EAAE,EAChB,EAAE,IAAI,EAAE,IAAI,EAAE,UAAU,EAAE,gBAAgB,EAAE,CAC7C,CAAC;AACJ,CAAC;AAOD,SAAS,WAAW,CAAC,IAAY,EAAE,IAAkB;IACnD,MAAM,MAAM,GAAG,IAAI,CAAC,SAAS,EAAE,CAAC;IAChC,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,MAAM,CAAC,OAAO,CAAC,CAAC;IAC1C,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,MAAM,CAAC,SAAS,CAAC,CAAC;IAC3C,MAAM,KAAK,GAAG,mBAAmB,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,UAAU,EAAE,gBAAgB,EAAE,CAAC,CAAC;IAChF,IAAI,KAAK,CAAC,SAAS,EAAE,CAAC;QACpB,MAAM,QAAQ,GAAG,qBAAqB,CAAC,IAAI,CAAC,CAAC;QAC7C,MAAM,IAAI,GAAG,aAAa,CAAC,IAAI,EAAE,OAAO,EAAE,IAAI,CAAC,CAAC;QAChD,OAAO,EAAE,UAAU,EAAE,QAAQ,EAAE,SAAS,EAAE,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC;IAChE,CAAC;IACD,MAAM,IAAI,GAAG,aAAa,CAAC,IAAI,EAAE,OAAO,EAAE,KAAK,CAAC,UAAW,CAAC,CAAC;IAC7D,OAAO,EAAE,UAAU,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC;AAC5D,CAAC"}
@@ -0,0 +1,21 @@
1
+ import type { UserPromptContext, UserPromptHandler, UserPromptResult } from "./prompt.js";
2
+ import type { TerminalHost } from "../terminal/host.js";
3
+ /**
4
+ * Host-backed user-review prompt with a top-down stack layout.
5
+ *
6
+ * Plan on top (header rule + scrollable body), full-width dim ─ separator, a
7
+ * blank top-margin row, the controls block (Approve + bounded feedback editor
8
+ * + optional hint), and a blank bottom-margin row above the host status bar.
9
+ *
10
+ * Key handling:
11
+ * - ↑/↓ toggles between Approve and the editor (does NOT scroll the plan).
12
+ * - PageUp/PageDown/Home/End/wheel scrolls the plan.
13
+ * - Ctrl+D submits feedback (or accepts when on Approve), Ctrl+C accepts.
14
+ * - Ctrl+] is consumed by the host's `InputRouter` for dump capture.
15
+ */
16
+ export declare class HostBackedUserPrompt implements UserPromptHandler {
17
+ private readonly host;
18
+ constructor(host: TerminalHost);
19
+ prompt(plan: string, _phase: string, context: UserPromptContext): Promise<UserPromptResult>;
20
+ }
21
+ //# sourceMappingURL=host-prompt.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"host-prompt.d.ts","sourceRoot":"","sources":["../../src/user/host-prompt.ts"],"names":[],"mappings":"AAUA,OAAO,KAAK,EACV,iBAAiB,EACjB,iBAAiB,EACjB,gBAAgB,EACjB,MAAM,aAAa,CAAC;AACrB,OAAO,KAAK,EAAE,YAAY,EAAmC,MAAM,qBAAqB,CAAC;AAUzF;;;;;;;;;;;;GAYG;AACH,qBAAa,oBAAqB,YAAW,iBAAiB;IAChD,OAAO,CAAC,QAAQ,CAAC,IAAI;gBAAJ,IAAI,EAAE,YAAY;IAEzC,MAAM,CACV,IAAI,EAAE,MAAM,EACZ,MAAM,EAAE,MAAM,EACd,OAAO,EAAE,iBAAiB,GACzB,OAAO,CAAC,gBAAgB,CAAC;CA8I7B"}