@hackerrank/astra-cli 0.1.26 → 0.1.27

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 (2) hide show
  1. package/package.json +1 -1
  2. package/src/repl.js +16 -10
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@hackerrank/astra-cli",
3
- "version": "0.1.26",
3
+ "version": "0.1.27",
4
4
  "description": "Minimal zero-dependency AI coding agent for the HackerRank AI Gateway.",
5
5
  "type": "module",
6
6
  "bin": {
package/src/repl.js CHANGED
@@ -264,11 +264,14 @@ export function computeVisualLines(buf, promptPrefix, cols = 80) {
264
264
 
265
265
  /** Check if an escape sequence or key code is a newline-insertion shortcut (Shift+Enter, Option+Enter, etc.). */
266
266
  export function isNewlineKey(s, pendingEsc = false) {
267
- if (s === "\x1b[13;2u" || s === "\x1b[27;2;13~" || s === "\x1b[13;2~" || s === "\x1bOM") return true; // Shift+Enter
268
- if (s === "\x1b[13;3u" || s === "\x1b[27;3;13~" || s === "\x1b\r" || s === "\x1b\n") return true; // Alt/Option+Enter
269
- if (s === "\x1b[13;5u" || s === "\x1b[27;5;13~") return true; // Ctrl+Enter
270
- if (pendingEsc && (s === "\r" || s === "\n")) return true; // Esc then Enter
271
- if (s === "\x0a") return true; // Ctrl+J (LF)
267
+ if (!s || typeof s !== "string") return false;
268
+ if (/^\x1b\[(?:13|10);[2-8]u$/.test(s)) return true;
269
+ if (/^\x1b\[27;[2-8];(?:13|10)~$/.test(s)) return true;
270
+ if (/^\x1b\[(?:13|10);[2-8]~$/.test(s)) return true;
271
+ if (s === "\x1bOM") return true;
272
+ if (s === "\x1b\r" || s === "\x1b\n" || s === "\x1b\x0d") return true;
273
+ if (pendingEsc && (s === "\r" || s === "\n" || s === "\x0d" || s === "\x0a")) return true;
274
+ if (s === "\x0a" || s === "\n") return true;
272
275
  return false;
273
276
  }
274
277
 
@@ -326,6 +329,8 @@ export class Screen {
326
329
  this.out.write(`\x1b[1;${this.scrollBottom}r`); // scroll region = top area
327
330
  this.out.write(`\x1b[${this.scrollBottom};1H`); // cursor at bottom of scroll area
328
331
  this.out.write("\x1b[?2004h"); // enable bracketed paste mode
332
+ this.out.write("\x1b[>4;2m"); // enable modifyOtherKeys
333
+ this.out.write("\x1b[=1u"); // enable kitty keyboard protocol
329
334
  if (this.inp.isTTY) this.inp.setRawMode(true);
330
335
  this.inp.resume();
331
336
  this.inp.setEncoding("utf8");
@@ -338,6 +343,8 @@ export class Screen {
338
343
  this.inp.off("data", this._onData);
339
344
  this.out.off("resize", this._onResize);
340
345
  if (this.inp.isTTY) this.inp.setRawMode(false);
346
+ this.out.write("\x1b[>4;0m"); // disable modifyOtherKeys
347
+ this.out.write("\x1b[=0u"); // disable kitty keyboard protocol
341
348
  this.out.write("\x1b[?2004l"); // disable bracketed paste mode
342
349
  this.out.write("\x1b[r"); // reset scroll region
343
350
  this.out.write(`\x1b[${this.rows};1H\n`); // move below footer
@@ -352,7 +359,8 @@ export class Screen {
352
359
  /** Write a block of text into the scrolling region (may contain newlines). */
353
360
  log(text) {
354
361
  this.out.write(`\x1b[${this.scrollBottom};1H`); // park at bottom of scroll area
355
- this.out.write(String(text) + "\n"); // trailing \n scrolls the region
362
+ const formatted = String(text).replace(/\r?\n/g, "\r\n") + "\r\n";
363
+ this.out.write(formatted);
356
364
  this.redraw();
357
365
  }
358
366
 
@@ -371,12 +379,10 @@ export class Screen {
371
379
 
372
380
  this.out.write("\x1b[s"); // save cursor
373
381
 
374
- // Clear old footer/prompt lines down to terminal bottom
375
- const clearFrom = Math.min(this._prevFooterTop || this.footerTop, this.footerTop);
376
- for (let r = clearFrom; r <= this.rows; r++) {
382
+ // Clear only from footerTop down to terminal bottom
383
+ for (let r = this.footerTop; r <= this.rows; r++) {
377
384
  this.out.write(`\x1b[${r};1H\x1b[2K`);
378
385
  }
379
- this._prevFooterTop = this.footerTop;
380
386
 
381
387
  // Draw top divider rule at footerTop
382
388
  this.out.write(`\x1b[${this.footerTop};1H`);