aether-code 0.35.5 → 0.35.7

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.5";
31
+ const VERSION = "0.35.7";
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.5",
3
+ "version": "0.35.7",
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.5";
12
+ const VERSION = "0.35.7";
13
13
  const MODEL_NAME = "Aether Core";
14
14
 
15
15
  const MODEL_ALIASES = {
@@ -113,16 +113,32 @@ export async function runRepl({ cwd: initialCwd, autoYes: initialAutoYes, unsafe
113
113
  continue;
114
114
  }
115
115
 
116
- // Clear screen and reprint banner so chat output starts at the top
117
- process.stdout.write("\x1b[2J\x1b[H");
118
- printBanner(state);
119
-
120
- // Print the echo bar (user's message) right below the banner
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`);
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 promptPrefix = state.autoYes ? c.bgBlue(" ") + " " : c.bgCyan(" ") + " ";
129
+ const promptStatus = state.autoYes
130
+ ? "auto-yes mode \xB7 ? for shortcuts \xB7 @file for images"
131
+ : "? for shortcuts \xB7 @file for images";
132
+ const promptRow = (process.stdout.rows || 24) - 3;
133
+ process.stdout.write(
134
+ "\x1b[s" +
135
+ `\x1b[${promptRow};1H` +
136
+ promptRule + "\n" +
137
+ " " + c.cyan("❯") + " \n" +
138
+ promptRule + "\n" +
139
+ promptPrefix + promptStatus +
140
+ "\x1b[u"
141
+ );
126
142
 
127
143
  const t0 = Date.now();
128
144
  const result = await runAgent({
@@ -156,6 +172,11 @@ export async function runRepl({ cwd: initialCwd, autoYes: initialAutoYes, unsafe
156
172
  });
157
173
  if (stats) console.log(stats);
158
174
  console.log("");
175
+
176
+ // Pin prompt to the bottom of the visible window
177
+ const pRows = process.stdout.rows || 24;
178
+ const pRow = pRows - 3;
179
+ process.stdout.write(`\x1b[${pRow};1H`);
159
180
  }
160
181
  }
161
182
 
@@ -266,7 +287,7 @@ function centerIn(str, width) {
266
287
  return " ".repeat(left) + str;
267
288
  }
268
289
 
269
- function printBanner(state) {
290
+ function buildBannerLines(state) {
270
291
  const cols = process.stdout.columns || 80;
271
292
  const credits = state.balance != null ? `${state.balance.toLocaleString()} credits` : "";
272
293
  const plan = state.plan && state.plan !== "FREE" ? state.plan : "";
@@ -289,18 +310,16 @@ function printBanner(state) {
289
310
  const topRule = c.cyan("──" + titleText + "─".repeat(titleRuleRight));
290
311
 
291
312
  const VL = c.cyan("│");
313
+ const lines = [];
292
314
 
293
- let printed = 0;
294
- const pr = (s) => { console.log(s); printed++; };
295
-
296
- pr("");
297
- pr(" " + topRule);
315
+ lines.push("");
316
+ lines.push(" " + topRule);
298
317
 
299
318
  const bottomRule = c.cyan(" " + "─".repeat(ruleW));
300
319
 
301
320
  if (twoCol) {
302
321
  const row = (left, right) => {
303
- pr(" " + padRight(left, leftW) + " " + VL + " " + right);
322
+ lines.push(" " + padRight(left, leftW) + " " + VL + " " + right);
304
323
  };
305
324
 
306
325
  row(centerIn(c.bold("Welcome back!"), leftW), c.bold("Tips for getting started"));
@@ -313,18 +332,23 @@ function printBanner(state) {
313
332
  row(centerIn(modelLine, leftW), "");
314
333
  row(centerIn(c.dim(shortenPath(state.cwd, 50)), leftW), "");
315
334
  } else {
316
- pr("");
317
- pr(centerIn(c.bold("Welcome back!"), cols - 4));
318
- pr("");
319
- pr(centerIn(`${C}${B} ${C}`, cols - 4));
320
- pr(centerIn(`${B}${C} ${B}`, cols - 4));
321
- pr(centerIn(`${C}${B} ${C}`, cols - 4));
322
- pr("");
323
- pr(centerIn(modelLine, cols - 4));
324
- pr(centerIn(c.dim(shortenPath(state.cwd, 50)), cols - 4));
335
+ lines.push("");
336
+ lines.push(centerIn(c.bold("Welcome back!"), cols - 4));
337
+ lines.push("");
338
+ lines.push(centerIn(`${C}${B} ${C}`, cols - 4));
339
+ lines.push(centerIn(`${B}${C} ${B}`, cols - 4));
340
+ lines.push(centerIn(`${C}${B} ${C}`, cols - 4));
341
+ lines.push("");
342
+ lines.push(centerIn(modelLine, cols - 4));
343
+ lines.push(centerIn(c.dim(shortenPath(state.cwd, 50)), cols - 4));
325
344
  }
326
345
 
327
- pr(bottomRule);
346
+ lines.push(bottomRule);
347
+ return lines;
348
+ }
328
349
 
329
- return printed;
350
+ function printBanner(state) {
351
+ const lines = buildBannerLines(state);
352
+ for (const l of lines) console.log(l);
353
+ return lines.length;
330
354
  }