aether-code 0.35.6 → 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.6";
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.6",
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.6";
12
+ const VERSION = "0.35.7";
13
13
  const MODEL_NAME = "Aether Core";
14
14
 
15
15
  const MODEL_ALIASES = {
@@ -113,17 +113,32 @@ 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 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
+ );
127
142
 
128
143
  const t0 = Date.now();
129
144
  const result = await runAgent({
@@ -272,7 +287,7 @@ function centerIn(str, width) {
272
287
  return " ".repeat(left) + str;
273
288
  }
274
289
 
275
- function printBanner(state) {
290
+ function buildBannerLines(state) {
276
291
  const cols = process.stdout.columns || 80;
277
292
  const credits = state.balance != null ? `${state.balance.toLocaleString()} credits` : "";
278
293
  const plan = state.plan && state.plan !== "FREE" ? state.plan : "";
@@ -295,18 +310,16 @@ function printBanner(state) {
295
310
  const topRule = c.cyan("──" + titleText + "─".repeat(titleRuleRight));
296
311
 
297
312
  const VL = c.cyan("│");
313
+ const lines = [];
298
314
 
299
- let printed = 0;
300
- const pr = (s) => { console.log(s); printed++; };
301
-
302
- pr("");
303
- pr(" " + topRule);
315
+ lines.push("");
316
+ lines.push(" " + topRule);
304
317
 
305
318
  const bottomRule = c.cyan(" " + "─".repeat(ruleW));
306
319
 
307
320
  if (twoCol) {
308
321
  const row = (left, right) => {
309
- pr(" " + padRight(left, leftW) + " " + VL + " " + right);
322
+ lines.push(" " + padRight(left, leftW) + " " + VL + " " + right);
310
323
  };
311
324
 
312
325
  row(centerIn(c.bold("Welcome back!"), leftW), c.bold("Tips for getting started"));
@@ -319,18 +332,23 @@ function printBanner(state) {
319
332
  row(centerIn(modelLine, leftW), "");
320
333
  row(centerIn(c.dim(shortenPath(state.cwd, 50)), leftW), "");
321
334
  } 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));
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));
331
344
  }
332
345
 
333
- pr(bottomRule);
346
+ lines.push(bottomRule);
347
+ return lines;
348
+ }
334
349
 
335
- return printed;
350
+ function printBanner(state) {
351
+ const lines = buildBannerLines(state);
352
+ for (const l of lines) console.log(l);
353
+ return lines.length;
336
354
  }