aether-code 0.34.4 → 0.35.1
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.
- package/bin/aether-code.js +1 -1
- package/package.json +1 -1
- package/src/render.js +25 -5
- package/src/repl.js +13 -6
package/bin/aether-code.js
CHANGED
|
@@ -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.
|
|
31
|
+
const VERSION = "0.35.1";
|
|
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.
|
|
3
|
+
"version": "0.35.1",
|
|
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(
|
|
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
|
-
|
|
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
|
-
|
|
221
|
-
|
|
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"
|
|
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
|
@@ -5,11 +5,11 @@ import path from "node:path";
|
|
|
5
5
|
import { runAgent } from "./agent.js";
|
|
6
6
|
import { fetchBalance, AetherError } from "./api.js";
|
|
7
7
|
import { runSetup } from "./setup.js";
|
|
8
|
-
import { c, errorLine } from "./render.js";
|
|
8
|
+
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.
|
|
12
|
+
const VERSION = "0.35.1";
|
|
13
13
|
const MODEL_NAME = "Aether Core";
|
|
14
14
|
|
|
15
15
|
const MODEL_ALIASES = {
|
|
@@ -114,6 +114,7 @@ export async function runRepl({ cwd: initialCwd, autoYes: initialAutoYes, unsafe
|
|
|
114
114
|
continue;
|
|
115
115
|
}
|
|
116
116
|
|
|
117
|
+
const t0 = Date.now();
|
|
117
118
|
const result = await runAgent({
|
|
118
119
|
initialPrompt: line,
|
|
119
120
|
priorMessages: state.messages.length > 0 ? state.messages : undefined,
|
|
@@ -124,6 +125,7 @@ export async function runRepl({ cwd: initialCwd, autoYes: initialAutoYes, unsafe
|
|
|
124
125
|
maxTurns: state.maxTurns,
|
|
125
126
|
mcpManager,
|
|
126
127
|
});
|
|
128
|
+
const elapsed = Date.now() - t0;
|
|
127
129
|
|
|
128
130
|
state.sessionCredits += result.totalCredits ?? 0;
|
|
129
131
|
state.sessionIn += result.totalIn ?? 0;
|
|
@@ -135,10 +137,15 @@ export async function runRepl({ cwd: initialCwd, autoYes: initialAutoYes, unsafe
|
|
|
135
137
|
console.log("\n" + errorLine(result.error.message || String(result.error)));
|
|
136
138
|
}
|
|
137
139
|
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
140
|
+
const stats = turnStats({
|
|
141
|
+
elapsed,
|
|
142
|
+
tokensIn: result.totalIn ?? 0,
|
|
143
|
+
tokensOut: result.totalOut ?? 0,
|
|
144
|
+
tools: 0,
|
|
145
|
+
credits: result.totalCredits ?? 0,
|
|
146
|
+
});
|
|
147
|
+
if (stats) console.log(stats);
|
|
148
|
+
console.log("");
|
|
142
149
|
}
|
|
143
150
|
}
|
|
144
151
|
|