aether-code 0.34.4 → 0.35.0

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.34.4";
31
+ const VERSION = "0.35.0";
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.34.4",
3
+ "version": "0.35.0",
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/render.js CHANGED
@@ -77,7 +77,7 @@ export function toolLabel(name, args) {
77
77
  case "glob_files": return `${verb("find")} ${arg(a.pattern)}`;
78
78
  case "search_files": return `${verb("search")} ${arg(`/${a.pattern}/ in ${a.path ?? "."}`)}`;
79
79
  case "run_shell": return `${verb("run")} ${arg(a.command)}`;
80
- case "web_search": return `${verb("search web")} ${arg(JSON.stringify(a.query ?? ""))}`;
80
+ case "web_search": return `${verb("search web")} ${arg(a.query ?? "")}`;
81
81
  case "web_fetch": return `${verb("fetch")} ${arg(a.url)}`;
82
82
  case "todo_write": return "";
83
83
  case "ask_user": return "";
@@ -131,7 +131,8 @@ function pickThinkingWord() {
131
131
 
132
132
  export function startSpinner(label) {
133
133
  if (!process.stdout.isTTY) return { stop: () => {}, update: () => {} };
134
- const frames = ["◐", "◓", "◑", "◒"];
134
+ // Ping-pong animation — cmd.exe-safe chars inspired by Claude Code's sparkle cycle
135
+ const frames = ["\xB7", "*", "+", "*", "\xB7", ".", "\xB7", "*", "+", "*", "\xB7", "."];
135
136
  const t0 = Date.now();
136
137
  let i = 0;
137
138
  let tokenCount = 0;
@@ -217,14 +218,33 @@ export function toolSummary(name, result) {
217
218
 
218
219
  if (name === "run_shell") {
219
220
  let code = null;
220
- try { code = JSON.parse(out).exit_code; } catch { /* ignore */ }
221
- return ` ${branch} ${c.gray(code === null ? (ok ? "done" : "failed") : `exit ${code}`)}`;
221
+ let stderr = "";
222
+ try {
223
+ const j = JSON.parse(out);
224
+ code = j.exit_code;
225
+ stderr = (j.stderr || "").split("\n")[0] || "";
226
+ } catch { /* ignore */ }
227
+ const status = code === null ? (ok ? "done" : "failed") : code === 0 ? "done" : `exit ${code}`;
228
+ const detail = !ok && stderr ? ` ${ellip(stderr, 60)}` : "";
229
+ return ` ${branch} ${c.gray(status + detail)}`;
222
230
  }
223
231
  if (name === "todo_write") return "";
224
232
  if (name === "ask_user") return "";
225
- if (name === "write_file" || name === "edit_file") {
233
+ if (name === "write_file") {
234
+ return ` ${branch} ${c.gray("wrote file")}`;
235
+ }
236
+ if (name === "edit_file") {
226
237
  return ` ${branch} ${c.gray(ellip(firstLine, 100))}`;
227
238
  }
239
+ if (name === "web_search") {
240
+ let count = 0;
241
+ try { const j = JSON.parse(out); if (Array.isArray(j)) count = j.length; } catch { /* ignore */ }
242
+ return ` ${branch} ${c.gray(count > 0 ? `${count} results` : "no results")}`;
243
+ }
244
+ if (name === "web_fetch") {
245
+ const lines = out.split("\n").length;
246
+ return ` ${branch} ${c.gray(`${lines} lines fetched`)}`;
247
+ }
228
248
  let summary = "";
229
249
  try {
230
250
  const j = JSON.parse(out);
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.34.4";
12
+ const VERSION = "0.35.0";
13
13
  const MODEL_NAME = "Aether Core";
14
14
 
15
15
  const MODEL_ALIASES = {