aether-code 0.35.6 → 0.35.8

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.
@@ -28,7 +28,7 @@ import {
28
28
  import readline from "node:readline";
29
29
  import { c, errorLine, divider, setTerminalTitle } from "../src/render.js";
30
30
 
31
- const VERSION = "0.35.6";
31
+ const VERSION = "0.35.8";
32
32
 
33
33
  /**
34
34
  * Try to start MCP servers from ~/.aether/mcp.json. Returns a started
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "aether-code",
3
- "version": "0.35.6",
3
+ "version": "0.35.8",
4
4
  "description": "Uncensored AI coding agent for your terminal — Claude Code alternative with MCP support. Reads code, writes files, runs commands. Drives IDA Pro, Roblox Studio, Wireshark, Blender, and any MCP server. No refusal layer.",
5
5
  "homepage": "https://trynoguard.com",
6
6
  "repository": {
package/src/repl.js CHANGED
@@ -9,7 +9,7 @@ import { c, errorLine, turnStats } from "./render.js";
9
9
  import { autoUpdate } from "./update-check.js";
10
10
  import { promptBox, EXIT_SIGNAL } from "./box-input.js";
11
11
 
12
- const VERSION = "0.35.6";
12
+ const VERSION = "0.35.8";
13
13
  const MODEL_NAME = "Aether Core";
14
14
 
15
15
  const MODEL_ALIASES = {
@@ -113,17 +113,34 @@ export async function runRepl({ cwd: initialCwd, autoYes: initialAutoYes, unsafe
113
113
  continue;
114
114
  }
115
115
 
116
- // Home cursor and overwrite banner in-place (no full clear = no flash)
117
- process.stdout.write("\x1b[H");
118
- printBanner(state);
119
-
120
- // Print echo bar right below banner, then wipe old content beneath it
116
+ // Build banner + echo as one buffer, write atomically (no flash, no garbling)
117
+ const bLines = buildBannerLines(state);
121
118
  const echoDisplay = line.length > 200 ? line.slice(0, 197) + "..." : line;
122
119
  const echoCols = process.stdout.columns || 80;
123
120
  const echoLen = echoDisplay.length + 2;
124
121
  const echoPad = Math.max(0, echoCols - echoLen);
125
- process.stdout.write(`\x1b[48;5;236m ${echoDisplay}${" ".repeat(echoPad)}\x1b[0m\n`);
126
- process.stdout.write("\x1b[J");
122
+ const echoBar = `\x1b[48;5;236m ${echoDisplay}${" ".repeat(echoPad)}\x1b[0m`;
123
+ process.stdout.write("\x1b[2J\x1b[H" + bLines.join("\n") + "\n" + echoBar + "\n");
124
+
125
+ // Draw prompt placeholder at bottom so input box stays visible while agent responds
126
+ const tCols = process.stdout.columns || 80;
127
+ const promptRule = c.cyan(" " + "─".repeat(tCols - 2));
128
+ const blk = (code) => `\x1b[${code}m \x1b[0m`;
129
+ const promptPrefix = blk(46) + blk(44);
130
+ const promptStatus = c.dim(
131
+ " " + (state.autoYes ? "auto-yes" : "review") + " mode" +
132
+ " \xB7 ? for shortcuts \xB7 @file for images"
133
+ );
134
+ const promptRow = (process.stdout.rows || 24) - 3;
135
+ process.stdout.write(
136
+ "\x1b[s" +
137
+ `\x1b[${promptRow};1H` +
138
+ promptRule + "\n" +
139
+ " " + c.cyan("❯") + " \n" +
140
+ promptRule + "\n" +
141
+ promptPrefix + promptStatus +
142
+ "\x1b[u"
143
+ );
127
144
 
128
145
  const t0 = Date.now();
129
146
  const result = await runAgent({
@@ -272,7 +289,7 @@ function centerIn(str, width) {
272
289
  return " ".repeat(left) + str;
273
290
  }
274
291
 
275
- function printBanner(state) {
292
+ function buildBannerLines(state) {
276
293
  const cols = process.stdout.columns || 80;
277
294
  const credits = state.balance != null ? `${state.balance.toLocaleString()} credits` : "";
278
295
  const plan = state.plan && state.plan !== "FREE" ? state.plan : "";
@@ -295,18 +312,16 @@ function printBanner(state) {
295
312
  const topRule = c.cyan("──" + titleText + "─".repeat(titleRuleRight));
296
313
 
297
314
  const VL = c.cyan("│");
315
+ const lines = [];
298
316
 
299
- let printed = 0;
300
- const pr = (s) => { console.log(s); printed++; };
301
-
302
- pr("");
303
- pr(" " + topRule);
317
+ lines.push("");
318
+ lines.push(" " + topRule);
304
319
 
305
320
  const bottomRule = c.cyan(" " + "─".repeat(ruleW));
306
321
 
307
322
  if (twoCol) {
308
323
  const row = (left, right) => {
309
- pr(" " + padRight(left, leftW) + " " + VL + " " + right);
324
+ lines.push(" " + padRight(left, leftW) + " " + VL + " " + right);
310
325
  };
311
326
 
312
327
  row(centerIn(c.bold("Welcome back!"), leftW), c.bold("Tips for getting started"));
@@ -319,18 +334,23 @@ function printBanner(state) {
319
334
  row(centerIn(modelLine, leftW), "");
320
335
  row(centerIn(c.dim(shortenPath(state.cwd, 50)), leftW), "");
321
336
  } else {
322
- pr("");
323
- pr(centerIn(c.bold("Welcome back!"), cols - 4));
324
- pr("");
325
- pr(centerIn(`${C}${B} ${C}`, cols - 4));
326
- pr(centerIn(`${B}${C} ${B}`, cols - 4));
327
- pr(centerIn(`${C}${B} ${C}`, cols - 4));
328
- pr("");
329
- pr(centerIn(modelLine, cols - 4));
330
- pr(centerIn(c.dim(shortenPath(state.cwd, 50)), cols - 4));
337
+ lines.push("");
338
+ lines.push(centerIn(c.bold("Welcome back!"), cols - 4));
339
+ lines.push("");
340
+ lines.push(centerIn(`${C}${B} ${C}`, cols - 4));
341
+ lines.push(centerIn(`${B}${C} ${B}`, cols - 4));
342
+ lines.push(centerIn(`${C}${B} ${C}`, cols - 4));
343
+ lines.push("");
344
+ lines.push(centerIn(modelLine, cols - 4));
345
+ lines.push(centerIn(c.dim(shortenPath(state.cwd, 50)), cols - 4));
331
346
  }
332
347
 
333
- pr(bottomRule);
348
+ lines.push(bottomRule);
349
+ return lines;
350
+ }
334
351
 
335
- return printed;
352
+ function printBanner(state) {
353
+ const lines = buildBannerLines(state);
354
+ for (const l of lines) console.log(l);
355
+ return lines.length;
336
356
  }