@pentoshi/clai 0.7.2 → 0.8.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.
@@ -1,8 +1,17 @@
1
1
  import { readFile } from "node:fs/promises";
2
+ import { stdin as input, stdout as output } from "node:process";
2
3
  import chalk from "chalk";
4
+ import { isCtrlC, isCtrlO, isEscape } from "./keys.js";
3
5
  let viewportCounter = 0;
4
6
  const viewports = new Map();
5
7
  let lastViewportId;
8
+ let pagerActive = false;
9
+ /** True while the alt-screen pager owns the terminal. The REPL prompt
10
+ * inspects this so its own keypress handler ignores nav keys while the
11
+ * pager is open (otherwise `j` etc would be inserted into the input). */
12
+ export function isPagerActive() {
13
+ return pagerActive;
14
+ }
6
15
  export function newViewportId(toolName) {
7
16
  viewportCounter += 1;
8
17
  return `${toolName.replace(/\W+/g, "-")}-${viewportCounter}`;
@@ -32,8 +41,12 @@ export function listViewports() {
32
41
  }
33
42
  /**
34
43
  * Toggle expansion and render either the full artifact (when expanding) or
35
- * a collapse confirmation (when collapsing). Used both by the Ctrl+O key
36
- * handler and the /output slash command so the two paths agree.
44
+ * a collapse confirmation (when collapsing). Used by the `/output` slash
45
+ * command and as a non-TTY fallback for the Ctrl+O key handler.
46
+ *
47
+ * The interactive Ctrl+O shortcut prefers `openViewportPager` instead, which
48
+ * opens an alternate-screen pager (less-style) the user can scroll and
49
+ * close with `q` or Ctrl+O.
37
50
  */
38
51
  export async function toggleViewport(id, write = (c) => process.stdout.write(c)) {
39
52
  const v = viewports.get(id);
@@ -56,9 +69,7 @@ export async function toggleViewport(id, write = (c) => process.stdout.write(c))
56
69
  else {
57
70
  write(chalk.dim(" (no artifact file — only the summary is available)\n"));
58
71
  }
59
- write(chalk.dim(` ── summary still shown below; press Ctrl+O again to collapse ──\n`));
60
- // Re-print summary so the user has it without scrolling.
61
- write(`${v.summary}\n`);
72
+ write(chalk.dim(` ── press Ctrl+O again to collapse ──\n`));
62
73
  }
63
74
  else {
64
75
  write(chalk.dim(`\n ── collapsed; press Ctrl+O to expand ──\n`));
@@ -76,6 +87,303 @@ export function formatViewportHint(v) {
76
87
  hints.push("/output last");
77
88
  if (v.artifactPath)
78
89
  hints.push(`/output ${v.id}`);
79
- return chalk.dim(` ${hints.join(" or ")} to ${v.expanded ? "collapse" : "show full output"}${v.artifactPath ? ` (${v.artifactPath})` : ""}`);
90
+ const action = v.expanded
91
+ ? "collapse"
92
+ : process.stdout.isTTY
93
+ ? "open full output (q to close)"
94
+ : "show full output";
95
+ return chalk.dim(` ${hints.join(" or ")} to ${action}${v.artifactPath ? ` (${v.artifactPath})` : ""}`);
96
+ }
97
+ function ansiSeq(code) {
98
+ return `\x1b[${code}`;
99
+ }
100
+ const ALT_SCREEN_ENTER = "\x1b[?1049h";
101
+ const ALT_SCREEN_EXIT = "\x1b[?1049l";
102
+ const HIDE_CURSOR = "\x1b[?25l";
103
+ const SHOW_CURSOR = "\x1b[?25h";
104
+ const CLEAR_SCREEN = "\x1b[2J";
105
+ const HOME = "\x1b[H";
106
+ function termSize() {
107
+ const rows = output.rows ?? 24;
108
+ const cols = output.columns ?? 80;
109
+ return { rows: Math.max(rows, 4), cols: Math.max(cols, 20) };
110
+ }
111
+ /** Wrap a single logical line to the given column width, preserving ANSI
112
+ * escapes by treating them as zero-width when measuring. */
113
+ function wrapLine(line, width) {
114
+ if (width <= 0)
115
+ return [line];
116
+ const ansiRe = /\x1b\[[0-9;]*[A-Za-z]/g;
117
+ const stripped = line.replace(ansiRe, "");
118
+ if (stripped.length <= width)
119
+ return [line];
120
+ // Naive but ANSI-aware wrap: walk character by character, breaking when
121
+ // the visible column counter hits `width`. We don't try to preserve
122
+ // styling across breaks, only to avoid splitting an escape mid-sequence.
123
+ const result = [];
124
+ let buf = "";
125
+ let visible = 0;
126
+ let i = 0;
127
+ while (i < line.length) {
128
+ const ch = line[i];
129
+ if (ch === "\x1b" && line[i + 1] === "[") {
130
+ const end = line.indexOf("m", i);
131
+ if (end >= 0) {
132
+ buf += line.slice(i, end + 1);
133
+ i = end + 1;
134
+ continue;
135
+ }
136
+ }
137
+ buf += ch;
138
+ visible += 1;
139
+ i += 1;
140
+ if (visible >= width) {
141
+ result.push(buf);
142
+ buf = "";
143
+ visible = 0;
144
+ }
145
+ }
146
+ if (buf.length > 0)
147
+ result.push(buf);
148
+ return result;
149
+ }
150
+ /**
151
+ * Open `body` in an alternate-screen pager. Resolves once the user closes
152
+ * it (q, ESC, or Ctrl+O). Falls back to inline rendering when the terminal
153
+ * is not a TTY (eg piped output, non-interactive shells) so the same code
154
+ * path also serves CI logs.
155
+ */
156
+ export async function openPager(options) {
157
+ if (!output.isTTY || !input.isTTY) {
158
+ // Non-TTY fallback — just dump the body. Useful for `clai ... | tee log`.
159
+ process.stdout.write(`\n── ${options.title} ──\n`);
160
+ process.stdout.write(options.body);
161
+ if (!options.body.endsWith("\n"))
162
+ process.stdout.write("\n");
163
+ return;
164
+ }
165
+ const lines = options.body.split(/\r?\n/);
166
+ return new Promise((resolve) => {
167
+ // Track whether we entered raw mode ourselves so we can restore the
168
+ // exact previous state. The REPL toggles raw mode for its own input
169
+ // loop, so we want to leave it the way we found it.
170
+ const wasRaw = input.isRaw ?? false;
171
+ let scrollTop = 0;
172
+ let resolved = false;
173
+ // Memoize the wrap result by column width. Wrapping every paint for a
174
+ // 100k-line artifact would burn CPU; recompute only when the terminal
175
+ // is resized to a different width.
176
+ let cachedWidth = -1;
177
+ let wrapped = [];
178
+ const computeWrapped = (cols) => {
179
+ if (cachedWidth === cols)
180
+ return wrapped;
181
+ cachedWidth = cols;
182
+ wrapped = [];
183
+ for (const line of lines) {
184
+ const segments = wrapLine(line, cols);
185
+ for (const seg of segments)
186
+ wrapped.push(seg);
187
+ }
188
+ return wrapped;
189
+ };
190
+ const enter = () => {
191
+ output.write(ALT_SCREEN_ENTER);
192
+ output.write(HIDE_CURSOR);
193
+ output.write(CLEAR_SCREEN);
194
+ output.write(HOME);
195
+ };
196
+ const exit = () => {
197
+ output.write(SHOW_CURSOR);
198
+ output.write(ALT_SCREEN_EXIT);
199
+ };
200
+ const buildFooter = (visibleStart, visibleEnd, total) => {
201
+ const help = options.footer ??
202
+ "↑/↓ j/k · PgUp/PgDn space · g/G top/bottom · q or Ctrl+O to close";
203
+ const ratio = total === 0 ? 100 : Math.round((visibleEnd / total) * 100);
204
+ const counter = `${visibleStart + 1}-${visibleEnd}/${total} (${ratio}%)`;
205
+ return `${help} ${chalk.dim(counter)}`;
206
+ };
207
+ const paint = () => {
208
+ const { rows, cols } = termSize();
209
+ const headerLines = 1;
210
+ const footerLines = 1;
211
+ const viewRows = Math.max(rows - headerLines - footerLines, 1);
212
+ const wrappedLines = computeWrapped(cols);
213
+ const total = wrappedLines.length;
214
+ if (scrollTop > Math.max(total - viewRows, 0)) {
215
+ scrollTop = Math.max(total - viewRows, 0);
216
+ }
217
+ if (scrollTop < 0)
218
+ scrollTop = 0;
219
+ const slice = wrappedLines.slice(scrollTop, scrollTop + viewRows);
220
+ // Build the full frame in a single buffer and write it at once. Many
221
+ // small `output.write()` calls cause flicker on Windows Terminal and
222
+ // on macOS Terminal.app under high CPU load; one big write paints
223
+ // the whole pager in a single syscall.
224
+ let frame = "";
225
+ frame += HOME;
226
+ frame += CLEAR_SCREEN;
227
+ frame += HOME;
228
+ frame += chalk.cyan(options.title);
229
+ frame += "\n";
230
+ for (let i = 0; i < viewRows; i += 1) {
231
+ frame += ansiSeq(`${i + 2};1H`);
232
+ frame += slice[i] ?? "";
233
+ frame += ansiSeq("K");
234
+ }
235
+ frame += ansiSeq(`${rows};1H`);
236
+ frame += ansiSeq("K");
237
+ const footer = buildFooter(scrollTop, Math.min(scrollTop + viewRows, total), total);
238
+ const visibleFooter = footer.length > cols ? footer.slice(0, cols) : footer;
239
+ frame += chalk.dim(visibleFooter);
240
+ output.write(frame);
241
+ };
242
+ const close = () => {
243
+ if (resolved)
244
+ return;
245
+ resolved = true;
246
+ pagerActive = false;
247
+ input.off("keypress", handleKeypress);
248
+ output.off("resize", handleResize);
249
+ if (input.isTTY) {
250
+ try {
251
+ input.setRawMode(wasRaw);
252
+ }
253
+ catch {
254
+ // ignore — caller is responsible for restoring its preferred mode
255
+ }
256
+ }
257
+ exit();
258
+ resolve();
259
+ };
260
+ function handleResize() {
261
+ if (resolved)
262
+ return;
263
+ // Force re-wrap on next paint — the column width changed.
264
+ cachedWidth = -1;
265
+ paint();
266
+ }
267
+ function handleKeypress(_seq, key) {
268
+ if (resolved)
269
+ return;
270
+ if (isCtrlC(key)) {
271
+ // Treat Ctrl+C as "close pager" rather than killing the whole REPL.
272
+ close();
273
+ return;
274
+ }
275
+ if (isCtrlO(key)) {
276
+ close();
277
+ return;
278
+ }
279
+ if (isEscape(key) || key.name === "q") {
280
+ close();
281
+ return;
282
+ }
283
+ const { rows } = termSize();
284
+ const pageSize = Math.max(rows - 3, 1);
285
+ if (key.name === "down" || key.name === "j") {
286
+ scrollTop += 1;
287
+ paint();
288
+ return;
289
+ }
290
+ if (key.name === "up" || key.name === "k") {
291
+ scrollTop = Math.max(0, scrollTop - 1);
292
+ paint();
293
+ return;
294
+ }
295
+ if (key.name === "pagedown" ||
296
+ (key.ctrl && key.name === "f") ||
297
+ key.name === "space") {
298
+ scrollTop += pageSize;
299
+ paint();
300
+ return;
301
+ }
302
+ if (key.name === "pageup" || (key.ctrl && key.name === "b")) {
303
+ scrollTop = Math.max(0, scrollTop - pageSize);
304
+ paint();
305
+ return;
306
+ }
307
+ if (key.name === "g" && !key.shift) {
308
+ scrollTop = 0;
309
+ paint();
310
+ return;
311
+ }
312
+ if (key.name === "g" && key.shift) {
313
+ scrollTop = Number.MAX_SAFE_INTEGER;
314
+ paint();
315
+ return;
316
+ }
317
+ if (key.name === "home") {
318
+ scrollTop = 0;
319
+ paint();
320
+ return;
321
+ }
322
+ if (key.name === "end") {
323
+ scrollTop = Number.MAX_SAFE_INTEGER;
324
+ paint();
325
+ return;
326
+ }
327
+ }
328
+ try {
329
+ pagerActive = true;
330
+ enter();
331
+ if (input.isTTY)
332
+ input.setRawMode(true);
333
+ input.resume();
334
+ input.on("keypress", handleKeypress);
335
+ output.on("resize", handleResize);
336
+ paint();
337
+ }
338
+ catch (error) {
339
+ // Surface to stderr in case alt-screen is unsupported, then fall back
340
+ // to inline render so the user still sees the data.
341
+ const msg = error instanceof Error ? error.message : String(error);
342
+ process.stderr.write(chalk.yellow(`\n (pager unavailable: ${msg})\n`));
343
+ pagerActive = false;
344
+ try {
345
+ exit();
346
+ }
347
+ catch {
348
+ // ignore
349
+ }
350
+ process.stdout.write(`\n── ${options.title} ──\n`);
351
+ process.stdout.write(options.body);
352
+ if (!options.body.endsWith("\n"))
353
+ process.stdout.write("\n");
354
+ resolved = true;
355
+ resolve();
356
+ }
357
+ });
358
+ }
359
+ /**
360
+ * Open the full output for a viewport in the alternate-screen pager. Reads
361
+ * the raw artifact when present; falls back to the AI-facing summary so
362
+ * the user always sees something even if the artifact file was rotated.
363
+ */
364
+ export async function openViewportPager(id) {
365
+ const v = viewports.get(id);
366
+ if (!v)
367
+ return false;
368
+ let body = v.summary;
369
+ if (v.artifactPath) {
370
+ try {
371
+ body = await readFile(v.artifactPath, "utf8");
372
+ }
373
+ catch (error) {
374
+ const msg = error instanceof Error ? error.message : String(error);
375
+ body = `(could not read artifact ${v.artifactPath}: ${msg})\n\n${v.summary}`;
376
+ }
377
+ }
378
+ // Mark expanded for parity with the toggleViewport flow so /output behavior
379
+ // stays consistent — opening the pager counts as "expanded".
380
+ v.expanded = true;
381
+ await openPager({
382
+ title: `full output · ${v.toolName} ${v.argsDisplay}${v.artifactPath ? ` · ${v.artifactPath}` : ""}`,
383
+ body,
384
+ });
385
+ // Closing the pager collapses the viewport back to its summary state.
386
+ v.expanded = false;
387
+ return true;
80
388
  }
81
389
  //# sourceMappingURL=output-pane.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"output-pane.js","sourceRoot":"","sources":["../../src/ui/output-pane.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"output-pane.js","sourceRoot":"","sources":["../../src/ui/output-pane.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pentoshi/clai",
3
- "version": "0.7.2",
3
+ "version": "0.8.0",
4
4
  "description": "A fast, cross-platform AI CLI assistant with ask and agent modes for shell tasks, file operations, and cybersecurity workflows.",
5
5
  "type": "module",
6
6
  "license": "MIT",