aether-code 0.33.7 → 0.33.9

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.33.7";
31
+ const VERSION = "0.33.9";
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.33.7",
3
+ "version": "0.33.9",
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 } 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.33.7";
12
+ const VERSION = "0.33.9";
13
13
  const MODEL_NAME = "Aether Core";
14
14
 
15
15
  const MODEL_ALIASES = {
@@ -238,6 +238,13 @@ function padRight(str, width) {
238
238
  return str + " ".repeat(need);
239
239
  }
240
240
 
241
+ function centerIn(str, width) {
242
+ const visible = stripAnsi(str).length;
243
+ if (visible >= width) return str;
244
+ const left = Math.floor((width - visible) / 2);
245
+ return " ".repeat(left) + str;
246
+ }
247
+
241
248
  function printBanner(state) {
242
249
  const cols = process.stdout.columns || 80;
243
250
  const credits = state.balance != null ? `${state.balance.toLocaleString()} credits` : "";
@@ -252,53 +259,46 @@ function printBanner(state) {
252
259
  if (plan) modelParts.push(c.cyan(plan));
253
260
  const modelLine = modelParts.join(c.dim(" \xB7 "));
254
261
 
262
+ const ruleW = Math.min(cols - 2, 76);
255
263
  const leftW = Math.min(Math.floor(cols * 0.5), 45);
264
+ const twoCol = cols >= 70;
256
265
 
257
- // Two-column rows: logo on left, tips+changelog on right.
258
- // Model info goes BELOW the logo on its own full-width line (like Claude Code)
259
- // so long text like "Aether Core · 34,988 credits · UNLIMITED" never overflows.
260
- const pairedLeft = [
261
- c.dim("──") + " " + c.bold("Aether Code") + " " + c.dim("v" + VERSION),
262
- " " + c.bold("Welcome back!"),
263
- "",
264
- ` ${C}${B} ${C}`,
265
- ` ${B}${C} ${B}`,
266
- ` ${C}${B} ${C}`,
267
- ];
268
-
269
- const pairedRight = [
270
- c.bold("Tips for getting started"),
271
- c.dim("Ask Aether to build, debug, or refactor code"),
272
- "",
273
- c.yellow("What's new"),
274
- c.dim("Creative thinking words while processing"),
275
- c.dim("Prompt pins to bottom, content scrolls up"),
276
- ];
266
+ // Colored top rule with version (cyan — matches brand)
267
+ const titleText = " Aether Code v" + VERSION + " ";
268
+ const titleRuleRight = Math.max(0, ruleW - 3 - titleText.length);
269
+ const topRule = c.cyan("──" + titleText + "─".repeat(titleRuleRight));
277
270
 
278
- const twoCol = cols >= 70;
279
271
  let printed = 0;
272
+ const pr = (s) => { console.log(s); printed++; };
280
273
 
281
- console.log("");
282
- printed++;
274
+ pr("");
275
+ pr(" " + topRule);
276
+ pr("");
283
277
 
284
278
  if (twoCol) {
285
- for (let i = 0; i < pairedLeft.length; i++) {
286
- console.log(" " + padRight(pairedLeft[i] || "", leftW) + (pairedRight[i] || ""));
287
- printed++;
288
- }
279
+ // Left column: centered welcome + logo. Right column: tips + changelog.
280
+ pr(" " + padRight(centerIn(c.bold("Welcome back!"), leftW), leftW) + c.bold("Tips for getting started"));
281
+ pr(" " + padRight("", leftW) + c.dim("Ask Aether to build, debug, or refactor code"));
282
+ pr(" " + padRight(centerIn(`${C}${B} ${C}`, leftW), leftW) + "");
283
+ pr(" " + padRight(centerIn(`${B}${C} ${B}`, leftW), leftW) + c.yellow("What's new"));
284
+ pr(" " + padRight(centerIn(`${C}${B} ${C}`, leftW), leftW) + c.dim("Creative thinking words while processing"));
285
+ pr(" " + padRight("", leftW) + c.dim("Prompt pins to bottom, content scrolls up"));
286
+ pr("");
287
+ // Model + path: centered under left column (full-width rows)
288
+ pr(centerIn(modelLine, leftW));
289
+ pr(centerIn(c.dim(shortenPath(state.cwd, 50)), leftW));
289
290
  } else {
290
- for (const line of pairedLeft) {
291
- console.log(" " + line);
292
- printed++;
293
- }
291
+ pr(centerIn(c.bold("Welcome back!"), cols - 4));
292
+ pr("");
293
+ pr(centerIn(`${C}${B} ${C}`, cols - 4));
294
+ pr(centerIn(`${B}${C} ${B}`, cols - 4));
295
+ pr(centerIn(`${C}${B} ${C}`, cols - 4));
296
+ pr("");
297
+ pr(centerIn(modelLine, cols - 4));
298
+ pr(centerIn(c.dim(shortenPath(state.cwd, 50)), cols - 4));
294
299
  }
295
300
 
296
- // Full-width rows below logo — model, path (no right column so they can be long)
297
- console.log("");
298
- console.log(" " + modelLine);
299
- console.log(" " + c.dim(shortenPath(state.cwd, 60)));
300
- console.log("");
301
- printed += 4;
301
+ pr("");
302
302
 
303
303
  return printed;
304
304
  }