aether-cli 0.1.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.
- package/dist/index.d.ts +2 -0
- package/dist/index.js +493 -0
- package/dist/index.js.map +1 -0
- package/package.json +48 -0
package/dist/index.d.ts
ADDED
package/dist/index.js
ADDED
|
@@ -0,0 +1,493 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
var __require = /* @__PURE__ */ ((x) => typeof require !== "undefined" ? require : typeof Proxy !== "undefined" ? new Proxy(x, {
|
|
3
|
+
get: (a, b) => (typeof require !== "undefined" ? require : a)[b]
|
|
4
|
+
}) : x)(function(x) {
|
|
5
|
+
if (typeof require !== "undefined") return require.apply(this, arguments);
|
|
6
|
+
throw Error('Dynamic require of "' + x + '" is not supported');
|
|
7
|
+
});
|
|
8
|
+
|
|
9
|
+
// src/index.ts
|
|
10
|
+
import { Command as Command9 } from "commander";
|
|
11
|
+
|
|
12
|
+
// src/commands/add.ts
|
|
13
|
+
import { Command } from "commander";
|
|
14
|
+
import ora from "ora";
|
|
15
|
+
|
|
16
|
+
// src/utils/aether.ts
|
|
17
|
+
import {
|
|
18
|
+
Aether,
|
|
19
|
+
InMemoryStorageAdapter,
|
|
20
|
+
MockEmbeddingProvider,
|
|
21
|
+
VoyageProvider
|
|
22
|
+
} from "aether-core";
|
|
23
|
+
|
|
24
|
+
// src/utils/config.ts
|
|
25
|
+
import { existsSync, readFileSync, writeFileSync } from "fs";
|
|
26
|
+
import { join } from "path";
|
|
27
|
+
import { homedir } from "os";
|
|
28
|
+
var DEFAULT_CONFIG = {
|
|
29
|
+
adapter: "in-memory"
|
|
30
|
+
};
|
|
31
|
+
function getConfigPath() {
|
|
32
|
+
return join(homedir(), ".aether", "config.json");
|
|
33
|
+
}
|
|
34
|
+
function loadConfig() {
|
|
35
|
+
const configPath = getConfigPath();
|
|
36
|
+
if (!existsSync(configPath)) {
|
|
37
|
+
return DEFAULT_CONFIG;
|
|
38
|
+
}
|
|
39
|
+
try {
|
|
40
|
+
const content = readFileSync(configPath, "utf-8");
|
|
41
|
+
return { ...DEFAULT_CONFIG, ...JSON.parse(content) };
|
|
42
|
+
} catch {
|
|
43
|
+
return DEFAULT_CONFIG;
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
function saveConfig(config) {
|
|
47
|
+
const configPath = getConfigPath();
|
|
48
|
+
const configDir = join(homedir(), ".aether");
|
|
49
|
+
if (!existsSync(configDir)) {
|
|
50
|
+
const { mkdirSync } = __require("fs");
|
|
51
|
+
mkdirSync(configDir, { recursive: true });
|
|
52
|
+
}
|
|
53
|
+
writeFileSync(configPath, JSON.stringify(config, null, 2));
|
|
54
|
+
}
|
|
55
|
+
function getEnvConfig() {
|
|
56
|
+
return {
|
|
57
|
+
voyageApiKey: process.env["VOYAGE_API_KEY"],
|
|
58
|
+
databaseUrl: process.env["DATABASE_URL"],
|
|
59
|
+
dataDir: process.env["AETHER_DATA_DIR"]
|
|
60
|
+
};
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
// src/utils/aether.ts
|
|
64
|
+
var aetherInstance = null;
|
|
65
|
+
async function getAether() {
|
|
66
|
+
if (aetherInstance) {
|
|
67
|
+
return aetherInstance;
|
|
68
|
+
}
|
|
69
|
+
const fileConfig = loadConfig();
|
|
70
|
+
const envConfig = getEnvConfig();
|
|
71
|
+
const config = { ...fileConfig, ...envConfig };
|
|
72
|
+
const voyageApiKey = config.voyageApiKey;
|
|
73
|
+
const embeddingProvider = voyageApiKey ? new VoyageProvider({ apiKey: voyageApiKey }) : new MockEmbeddingProvider();
|
|
74
|
+
const storageAdapter = new InMemoryStorageAdapter();
|
|
75
|
+
const aetherConfig = {
|
|
76
|
+
storage: { adapter: storageAdapter },
|
|
77
|
+
embeddings: { provider: embeddingProvider }
|
|
78
|
+
};
|
|
79
|
+
aetherInstance = new Aether(aetherConfig);
|
|
80
|
+
await aetherInstance.initialize();
|
|
81
|
+
return aetherInstance;
|
|
82
|
+
}
|
|
83
|
+
async function closeAether() {
|
|
84
|
+
if (aetherInstance) {
|
|
85
|
+
await aetherInstance.close();
|
|
86
|
+
aetherInstance = null;
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
// src/utils/output.ts
|
|
91
|
+
import chalk from "chalk";
|
|
92
|
+
function formatEvent(event, verbose = false) {
|
|
93
|
+
const lines = [];
|
|
94
|
+
lines.push(
|
|
95
|
+
chalk.cyan(`[${event.id.slice(0, 8)}]`) + " " + chalk.gray(new Date(event.timestamp).toLocaleString())
|
|
96
|
+
);
|
|
97
|
+
lines.push(
|
|
98
|
+
chalk.yellow(` ${event.actor}`) + chalk.gray(" \u2192 ") + chalk.green(event.action)
|
|
99
|
+
);
|
|
100
|
+
lines.push(chalk.white(` ${event.content}`));
|
|
101
|
+
if (verbose && Object.keys(event.context).length > 0) {
|
|
102
|
+
lines.push(chalk.gray(` Context: ${JSON.stringify(event.context)}`));
|
|
103
|
+
}
|
|
104
|
+
return lines.join("\n");
|
|
105
|
+
}
|
|
106
|
+
function formatEvents(events, verbose = false) {
|
|
107
|
+
if (events.length === 0) {
|
|
108
|
+
return chalk.gray("No events found.");
|
|
109
|
+
}
|
|
110
|
+
return events.map((e) => formatEvent(e, verbose)).join("\n\n");
|
|
111
|
+
}
|
|
112
|
+
function formatStats(stats) {
|
|
113
|
+
const lines = [];
|
|
114
|
+
lines.push(chalk.bold("Aether Memory Statistics"));
|
|
115
|
+
lines.push(chalk.gray("\u2500".repeat(30)));
|
|
116
|
+
for (const [key, value] of Object.entries(stats)) {
|
|
117
|
+
const formattedKey = key.replace(/([A-Z])/g, " $1").replace(/^./, (s) => s.toUpperCase());
|
|
118
|
+
lines.push(`${chalk.cyan(formattedKey)}: ${chalk.white(String(value))}`);
|
|
119
|
+
}
|
|
120
|
+
return lines.join("\n");
|
|
121
|
+
}
|
|
122
|
+
function success(message) {
|
|
123
|
+
console.log(chalk.green("\u2713 ") + message);
|
|
124
|
+
}
|
|
125
|
+
function error(message) {
|
|
126
|
+
console.error(chalk.red("\u2717 ") + message);
|
|
127
|
+
}
|
|
128
|
+
function info(message) {
|
|
129
|
+
console.log(chalk.blue("\u2139 ") + message);
|
|
130
|
+
}
|
|
131
|
+
function warn(message) {
|
|
132
|
+
console.log(chalk.yellow("\u26A0 ") + message);
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
// src/commands/add.ts
|
|
136
|
+
var addCommand = new Command("add").description("Add a memory event").argument("<content>", "The content of the memory event").option("-a, --actor <actor>", "Actor who performed the action", "user").option("-t, --action <action>", "Type of action").option("-c, --context <json>", "Context as JSON string").action(async (content, options) => {
|
|
137
|
+
const spinner = ora("Adding memory...").start();
|
|
138
|
+
try {
|
|
139
|
+
const aether = await getAether();
|
|
140
|
+
let context = {};
|
|
141
|
+
if (options.context) {
|
|
142
|
+
try {
|
|
143
|
+
context = JSON.parse(options.context);
|
|
144
|
+
} catch {
|
|
145
|
+
spinner.fail("Invalid JSON in context");
|
|
146
|
+
return;
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
const event = await aether.add({
|
|
150
|
+
content,
|
|
151
|
+
actor: options.actor,
|
|
152
|
+
action: options.action,
|
|
153
|
+
context
|
|
154
|
+
});
|
|
155
|
+
spinner.stop();
|
|
156
|
+
success("Memory added successfully!");
|
|
157
|
+
console.log();
|
|
158
|
+
console.log(formatEvent(event, true));
|
|
159
|
+
} catch (err) {
|
|
160
|
+
spinner.fail("Failed to add memory");
|
|
161
|
+
error(String(err));
|
|
162
|
+
} finally {
|
|
163
|
+
await closeAether();
|
|
164
|
+
}
|
|
165
|
+
});
|
|
166
|
+
|
|
167
|
+
// src/commands/query.ts
|
|
168
|
+
import { Command as Command2 } from "commander";
|
|
169
|
+
import ora2 from "ora";
|
|
170
|
+
var queryCommand = new Command2("query").description("Query memories").argument("<text>", "Query text").option("-a, --actor <actor>", "Filter by actor").option(
|
|
171
|
+
"-t, --type <type>",
|
|
172
|
+
"Retrieval type (semantic, temporal, relational, hybrid)",
|
|
173
|
+
"hybrid"
|
|
174
|
+
).option("-l, --limit <n>", "Maximum results", "10").option("-v, --verbose", "Show detailed output", false).action(async (text, options) => {
|
|
175
|
+
const spinner = ora2("Searching memories...").start();
|
|
176
|
+
try {
|
|
177
|
+
const aether = await getAether();
|
|
178
|
+
const events = await aether.retrieve(text, {
|
|
179
|
+
actor: options.actor,
|
|
180
|
+
retrievalType: options.type,
|
|
181
|
+
limit: parseInt(options.limit, 10)
|
|
182
|
+
});
|
|
183
|
+
spinner.stop();
|
|
184
|
+
info(`Found ${events.length} memories`);
|
|
185
|
+
console.log();
|
|
186
|
+
console.log(formatEvents(events, options.verbose));
|
|
187
|
+
} catch (err) {
|
|
188
|
+
spinner.fail("Query failed");
|
|
189
|
+
error(String(err));
|
|
190
|
+
} finally {
|
|
191
|
+
await closeAether();
|
|
192
|
+
}
|
|
193
|
+
});
|
|
194
|
+
|
|
195
|
+
// src/commands/history.ts
|
|
196
|
+
import { Command as Command3 } from "commander";
|
|
197
|
+
import ora3 from "ora";
|
|
198
|
+
var historyCommand = new Command3("history").description("Get actor history").argument("<actor>", "Actor to get history for").option("-l, --limit <n>", "Maximum events", "20").option("-v, --verbose", "Show detailed output", false).action(async (actor, options) => {
|
|
199
|
+
const spinner = ora3(`Fetching history for ${actor}...`).start();
|
|
200
|
+
try {
|
|
201
|
+
const aether = await getAether();
|
|
202
|
+
const events = await aether.getHistory(actor, parseInt(options.limit, 10));
|
|
203
|
+
spinner.stop();
|
|
204
|
+
info(`Found ${events.length} events for ${actor}`);
|
|
205
|
+
console.log();
|
|
206
|
+
console.log(formatEvents(events, options.verbose));
|
|
207
|
+
} catch (err) {
|
|
208
|
+
spinner.fail("Failed to fetch history");
|
|
209
|
+
error(String(err));
|
|
210
|
+
} finally {
|
|
211
|
+
await closeAether();
|
|
212
|
+
}
|
|
213
|
+
});
|
|
214
|
+
|
|
215
|
+
// src/commands/serve.ts
|
|
216
|
+
import { Command as Command4 } from "commander";
|
|
217
|
+
import chalk2 from "chalk";
|
|
218
|
+
import {
|
|
219
|
+
InMemoryStorageAdapter as InMemoryStorageAdapter2,
|
|
220
|
+
VoyageProvider as VoyageProvider2,
|
|
221
|
+
MockEmbeddingProvider as MockEmbeddingProvider2
|
|
222
|
+
} from "aether-core";
|
|
223
|
+
import { createServer } from "aether-server";
|
|
224
|
+
var serveCommand = new Command4("serve").description("Start Aether REST/WebSocket server").option("-p, --port <port>", "Port number", "3000").option("-H, --host <host>", "Host to bind to", "0.0.0.0").option("-k, --api-key <key>", "API key for authentication").option("--no-cors", "Disable CORS").option("--log", "Enable request logging", true).action(async (options) => {
|
|
225
|
+
const port = parseInt(options.port, 10);
|
|
226
|
+
const host = options.host;
|
|
227
|
+
console.log();
|
|
228
|
+
console.log(chalk2.bold.cyan(" Aether Server"));
|
|
229
|
+
console.log(chalk2.gray(" \u2500".repeat(20)));
|
|
230
|
+
console.log();
|
|
231
|
+
try {
|
|
232
|
+
const fileConfig = loadConfig();
|
|
233
|
+
const envConfig = getEnvConfig();
|
|
234
|
+
const config = { ...fileConfig, ...envConfig };
|
|
235
|
+
const voyageApiKey = config.voyageApiKey || process.env["VOYAGE_API_KEY"];
|
|
236
|
+
const embeddingProvider = voyageApiKey ? new VoyageProvider2({ apiKey: voyageApiKey }) : new MockEmbeddingProvider2();
|
|
237
|
+
if (!voyageApiKey) {
|
|
238
|
+
warn("No VOYAGE_API_KEY found. Using mock embeddings.");
|
|
239
|
+
warn("Set VOYAGE_API_KEY environment variable for production.");
|
|
240
|
+
console.log();
|
|
241
|
+
}
|
|
242
|
+
const storageAdapter = new InMemoryStorageAdapter2();
|
|
243
|
+
info("Initializing Aether...");
|
|
244
|
+
const server = await createServer({
|
|
245
|
+
port,
|
|
246
|
+
host,
|
|
247
|
+
corsOrigin: options.cors ? true : false,
|
|
248
|
+
logging: options.log,
|
|
249
|
+
apiKey: options.apiKey,
|
|
250
|
+
aether: {
|
|
251
|
+
storage: { adapter: storageAdapter },
|
|
252
|
+
embeddings: { provider: embeddingProvider }
|
|
253
|
+
}
|
|
254
|
+
});
|
|
255
|
+
await server.listen({ port, host });
|
|
256
|
+
console.log();
|
|
257
|
+
success(`Server running at http://${host}:${port}`);
|
|
258
|
+
console.log();
|
|
259
|
+
console.log(chalk2.gray(" Endpoints:"));
|
|
260
|
+
console.log(chalk2.gray(" \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500"));
|
|
261
|
+
console.log(` ${chalk2.cyan("GET")} /health Health check`);
|
|
262
|
+
console.log(` ${chalk2.green("POST")} /api/v1/memory Add memory`);
|
|
263
|
+
console.log(` ${chalk2.cyan("GET")} /api/v1/memory Query memories`);
|
|
264
|
+
console.log(` ${chalk2.cyan("GET")} /api/v1/memory/:id Get by ID`);
|
|
265
|
+
console.log(` ${chalk2.red("DELETE")} /api/v1/memory/:id Delete memory`);
|
|
266
|
+
console.log(` ${chalk2.green("POST")} /api/v1/memory/batch Batch add`);
|
|
267
|
+
console.log(` ${chalk2.cyan("GET")} /api/v1/history/:actor Actor history`);
|
|
268
|
+
console.log(` ${chalk2.green("POST")} /api/v1/search Advanced search`);
|
|
269
|
+
console.log(` ${chalk2.cyan("GET")} /api/v1/stats Statistics`);
|
|
270
|
+
console.log(` ${chalk2.magenta("WS")} /ws WebSocket stream`);
|
|
271
|
+
console.log();
|
|
272
|
+
console.log(chalk2.gray(" Press Ctrl+C to stop"));
|
|
273
|
+
console.log();
|
|
274
|
+
const shutdown = async (signal) => {
|
|
275
|
+
console.log();
|
|
276
|
+
info(`Received ${signal}. Shutting down gracefully...`);
|
|
277
|
+
await server.close();
|
|
278
|
+
success("Server stopped.");
|
|
279
|
+
process.exit(0);
|
|
280
|
+
};
|
|
281
|
+
process.on("SIGINT", () => shutdown("SIGINT"));
|
|
282
|
+
process.on("SIGTERM", () => shutdown("SIGTERM"));
|
|
283
|
+
} catch (err) {
|
|
284
|
+
error(`Failed to start server: ${err}`);
|
|
285
|
+
process.exit(1);
|
|
286
|
+
}
|
|
287
|
+
});
|
|
288
|
+
|
|
289
|
+
// src/commands/stats.ts
|
|
290
|
+
import { Command as Command5 } from "commander";
|
|
291
|
+
import ora4 from "ora";
|
|
292
|
+
var statsCommand = new Command5("stats").description("Show memory statistics").action(async () => {
|
|
293
|
+
const spinner = ora4("Gathering statistics...").start();
|
|
294
|
+
try {
|
|
295
|
+
const aether = await getAether();
|
|
296
|
+
const stats = await aether.stats();
|
|
297
|
+
spinner.stop();
|
|
298
|
+
console.log();
|
|
299
|
+
console.log(formatStats(stats));
|
|
300
|
+
} catch (err) {
|
|
301
|
+
spinner.fail("Failed to get statistics");
|
|
302
|
+
error(String(err));
|
|
303
|
+
} finally {
|
|
304
|
+
await closeAether();
|
|
305
|
+
}
|
|
306
|
+
});
|
|
307
|
+
|
|
308
|
+
// src/commands/export.ts
|
|
309
|
+
import { Command as Command6 } from "commander";
|
|
310
|
+
import { writeFileSync as writeFileSync2 } from "fs";
|
|
311
|
+
import ora5 from "ora";
|
|
312
|
+
var exportCommand = new Command6("export").description("Export memories to file").option("-f, --format <format>", "Output format (json, csv)", "json").option("-o, --output <file>", "Output file path").option("-a, --actor <actor>", "Filter by actor").action(async (options) => {
|
|
313
|
+
const spinner = ora5("Exporting memories...").start();
|
|
314
|
+
try {
|
|
315
|
+
const aether = await getAether();
|
|
316
|
+
let events;
|
|
317
|
+
if (options.actor) {
|
|
318
|
+
events = await aether.getHistory(options.actor, 1e4);
|
|
319
|
+
} else {
|
|
320
|
+
const stats = await aether.stats();
|
|
321
|
+
events = [];
|
|
322
|
+
info(`Note: Export currently requires specifying an actor`);
|
|
323
|
+
spinner.stop();
|
|
324
|
+
return;
|
|
325
|
+
}
|
|
326
|
+
let output;
|
|
327
|
+
const format = options.format.toLowerCase();
|
|
328
|
+
if (format === "json") {
|
|
329
|
+
output = JSON.stringify(events, null, 2);
|
|
330
|
+
} else if (format === "csv") {
|
|
331
|
+
const headers = ["id", "timestamp", "actor", "action", "content", "context"];
|
|
332
|
+
const rows = events.map((e) => [
|
|
333
|
+
e.id,
|
|
334
|
+
e.timestamp,
|
|
335
|
+
e.actor,
|
|
336
|
+
e.action,
|
|
337
|
+
`"${e.content.replace(/"/g, '""')}"`,
|
|
338
|
+
`"${JSON.stringify(e.context).replace(/"/g, '""')}"`
|
|
339
|
+
]);
|
|
340
|
+
output = [headers.join(","), ...rows.map((r) => r.join(","))].join("\n");
|
|
341
|
+
} else {
|
|
342
|
+
throw new Error(`Unknown format: ${format}`);
|
|
343
|
+
}
|
|
344
|
+
if (options.output) {
|
|
345
|
+
writeFileSync2(options.output, output);
|
|
346
|
+
spinner.stop();
|
|
347
|
+
success(`Exported ${events.length} events to ${options.output}`);
|
|
348
|
+
} else {
|
|
349
|
+
spinner.stop();
|
|
350
|
+
console.log(output);
|
|
351
|
+
}
|
|
352
|
+
} catch (err) {
|
|
353
|
+
spinner.fail("Export failed");
|
|
354
|
+
error(String(err));
|
|
355
|
+
} finally {
|
|
356
|
+
await closeAether();
|
|
357
|
+
}
|
|
358
|
+
});
|
|
359
|
+
|
|
360
|
+
// src/commands/repl.ts
|
|
361
|
+
import { Command as Command7 } from "commander";
|
|
362
|
+
import { createInterface } from "readline";
|
|
363
|
+
import chalk3 from "chalk";
|
|
364
|
+
var replCommand = new Command7("repl").description("Interactive REPL mode").action(async () => {
|
|
365
|
+
const aether = await getAether();
|
|
366
|
+
console.log();
|
|
367
|
+
console.log(chalk3.bold.cyan("Aether Interactive REPL"));
|
|
368
|
+
console.log(chalk3.gray('Type "help" for available commands, "exit" to quit'));
|
|
369
|
+
console.log();
|
|
370
|
+
const rl = createInterface({
|
|
371
|
+
input: process.stdin,
|
|
372
|
+
output: process.stdout,
|
|
373
|
+
prompt: chalk3.green("aether> ")
|
|
374
|
+
});
|
|
375
|
+
const showHelp = () => {
|
|
376
|
+
console.log(`
|
|
377
|
+
${chalk3.bold("Available Commands:")}
|
|
378
|
+
|
|
379
|
+
${chalk3.cyan("add")} <content> Add a memory event
|
|
380
|
+
${chalk3.cyan("add")} <content> --actor <a> Add with specific actor
|
|
381
|
+
${chalk3.cyan("query")} <text> Search memories
|
|
382
|
+
${chalk3.cyan("history")} <actor> Get actor history
|
|
383
|
+
${chalk3.cyan("stats")} Show statistics
|
|
384
|
+
${chalk3.cyan("clear")} Clear all memories
|
|
385
|
+
${chalk3.cyan("help")} Show this help
|
|
386
|
+
${chalk3.cyan("exit")} Exit REPL
|
|
387
|
+
`);
|
|
388
|
+
};
|
|
389
|
+
rl.prompt();
|
|
390
|
+
rl.on("line", async (line) => {
|
|
391
|
+
const trimmed = line.trim();
|
|
392
|
+
if (!trimmed) {
|
|
393
|
+
rl.prompt();
|
|
394
|
+
return;
|
|
395
|
+
}
|
|
396
|
+
const parts = trimmed.split(/\s+/);
|
|
397
|
+
const cmd = parts[0]?.toLowerCase();
|
|
398
|
+
try {
|
|
399
|
+
switch (cmd) {
|
|
400
|
+
case "help":
|
|
401
|
+
showHelp();
|
|
402
|
+
break;
|
|
403
|
+
case "exit":
|
|
404
|
+
case "quit":
|
|
405
|
+
await closeAether();
|
|
406
|
+
console.log(chalk3.gray("Goodbye!"));
|
|
407
|
+
process.exit(0);
|
|
408
|
+
case "add": {
|
|
409
|
+
const content = parts.slice(1).join(" ");
|
|
410
|
+
if (!content) {
|
|
411
|
+
error("Usage: add <content>");
|
|
412
|
+
break;
|
|
413
|
+
}
|
|
414
|
+
const event = await aether.add(content);
|
|
415
|
+
console.log(formatEvent(event));
|
|
416
|
+
break;
|
|
417
|
+
}
|
|
418
|
+
case "query": {
|
|
419
|
+
const query = parts.slice(1).join(" ");
|
|
420
|
+
if (!query) {
|
|
421
|
+
error("Usage: query <text>");
|
|
422
|
+
break;
|
|
423
|
+
}
|
|
424
|
+
const results = await aether.retrieve(query, { limit: 5 });
|
|
425
|
+
console.log(formatEvents(results));
|
|
426
|
+
break;
|
|
427
|
+
}
|
|
428
|
+
case "history": {
|
|
429
|
+
const actor = parts[1];
|
|
430
|
+
if (!actor) {
|
|
431
|
+
error("Usage: history <actor>");
|
|
432
|
+
break;
|
|
433
|
+
}
|
|
434
|
+
const events = await aether.getHistory(actor, 10);
|
|
435
|
+
console.log(formatEvents(events));
|
|
436
|
+
break;
|
|
437
|
+
}
|
|
438
|
+
case "stats": {
|
|
439
|
+
const stats = await aether.stats();
|
|
440
|
+
console.log(JSON.stringify(stats, null, 2));
|
|
441
|
+
break;
|
|
442
|
+
}
|
|
443
|
+
case "clear": {
|
|
444
|
+
await aether.clear();
|
|
445
|
+
info("All memories cleared");
|
|
446
|
+
break;
|
|
447
|
+
}
|
|
448
|
+
default:
|
|
449
|
+
error(`Unknown command: ${cmd}. Type "help" for available commands.`);
|
|
450
|
+
}
|
|
451
|
+
} catch (err) {
|
|
452
|
+
error(String(err));
|
|
453
|
+
}
|
|
454
|
+
rl.prompt();
|
|
455
|
+
});
|
|
456
|
+
rl.on("close", async () => {
|
|
457
|
+
await closeAether();
|
|
458
|
+
console.log(chalk3.gray("\nGoodbye!"));
|
|
459
|
+
process.exit(0);
|
|
460
|
+
});
|
|
461
|
+
});
|
|
462
|
+
|
|
463
|
+
// src/commands/init.ts
|
|
464
|
+
import { Command as Command8 } from "commander";
|
|
465
|
+
var initCommand = new Command8("init").description("Initialize Aether configuration").option("-a, --adapter <type>", "Storage adapter (in-memory, postgres, neo4j)", "in-memory").option("-k, --api-key <key>", "VoyageAI API key").action(async (options) => {
|
|
466
|
+
const config = {
|
|
467
|
+
adapter: options.adapter,
|
|
468
|
+
voyageApiKey: options.apiKey
|
|
469
|
+
};
|
|
470
|
+
saveConfig(config);
|
|
471
|
+
success("Aether configuration initialized!");
|
|
472
|
+
info(`Storage adapter: ${config.adapter}`);
|
|
473
|
+
if (config.voyageApiKey) {
|
|
474
|
+
info("VoyageAI API key: configured");
|
|
475
|
+
} else {
|
|
476
|
+
info("VoyageAI API key: not set (using mock embeddings)");
|
|
477
|
+
info("Set VOYAGE_API_KEY environment variable or run: aether init --api-key <key>");
|
|
478
|
+
}
|
|
479
|
+
});
|
|
480
|
+
|
|
481
|
+
// src/index.ts
|
|
482
|
+
var program = new Command9();
|
|
483
|
+
program.name("aether").description("CLI for Aether Memory Framework - Event-driven memory for LLM agents").version("0.1.0");
|
|
484
|
+
program.addCommand(initCommand);
|
|
485
|
+
program.addCommand(addCommand);
|
|
486
|
+
program.addCommand(queryCommand);
|
|
487
|
+
program.addCommand(historyCommand);
|
|
488
|
+
program.addCommand(serveCommand);
|
|
489
|
+
program.addCommand(statsCommand);
|
|
490
|
+
program.addCommand(exportCommand);
|
|
491
|
+
program.addCommand(replCommand);
|
|
492
|
+
program.parse();
|
|
493
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/index.ts","../src/commands/add.ts","../src/utils/aether.ts","../src/utils/config.ts","../src/utils/output.ts","../src/commands/query.ts","../src/commands/history.ts","../src/commands/serve.ts","../src/commands/stats.ts","../src/commands/export.ts","../src/commands/repl.ts","../src/commands/init.ts"],"sourcesContent":["import { Command } from 'commander';\nimport { addCommand } from './commands/add.js';\nimport { queryCommand } from './commands/query.js';\nimport { historyCommand } from './commands/history.js';\nimport { serveCommand } from './commands/serve.js';\nimport { statsCommand } from './commands/stats.js';\nimport { exportCommand } from './commands/export.js';\nimport { replCommand } from './commands/repl.js';\nimport { initCommand } from './commands/init.js';\n\nconst program = new Command();\n\nprogram\n .name('aether')\n .description('CLI for Aether Memory Framework - Event-driven memory for LLM agents')\n .version('0.1.0');\n\n// Register commands\nprogram.addCommand(initCommand);\nprogram.addCommand(addCommand);\nprogram.addCommand(queryCommand);\nprogram.addCommand(historyCommand);\nprogram.addCommand(serveCommand);\nprogram.addCommand(statsCommand);\nprogram.addCommand(exportCommand);\nprogram.addCommand(replCommand);\n\nprogram.parse();\n","import { Command } from 'commander';\nimport ora from 'ora';\nimport { getAether, closeAether } from '../utils/aether.js';\nimport { formatEvent, success, error } from '../utils/output.js';\n\nexport const addCommand = new Command('add')\n .description('Add a memory event')\n .argument('<content>', 'The content of the memory event')\n .option('-a, --actor <actor>', 'Actor who performed the action', 'user')\n .option('-t, --action <action>', 'Type of action')\n .option('-c, --context <json>', 'Context as JSON string')\n .action(async (content: string, options) => {\n const spinner = ora('Adding memory...').start();\n\n try {\n const aether = await getAether();\n\n let context: Record<string, unknown> = {};\n if (options.context) {\n try {\n context = JSON.parse(options.context);\n } catch {\n spinner.fail('Invalid JSON in context');\n return;\n }\n }\n\n const event = await aether.add({\n content,\n actor: options.actor,\n action: options.action,\n context,\n });\n\n spinner.stop();\n success('Memory added successfully!');\n console.log();\n console.log(formatEvent(event, true));\n } catch (err) {\n spinner.fail('Failed to add memory');\n error(String(err));\n } finally {\n await closeAether();\n }\n });\n","import {\n Aether,\n InMemoryStorageAdapter,\n MockEmbeddingProvider,\n VoyageProvider,\n type AetherConfig,\n} from 'aether-core';\nimport { loadConfig, getEnvConfig } from './config.js';\n\nlet aetherInstance: Aether | null = null;\n\nexport async function getAether(): Promise<Aether> {\n if (aetherInstance) {\n return aetherInstance;\n }\n\n const fileConfig = loadConfig();\n const envConfig = getEnvConfig();\n const config = { ...fileConfig, ...envConfig };\n\n // Determine embedding provider\n const voyageApiKey = config.voyageApiKey;\n const embeddingProvider = voyageApiKey\n ? new VoyageProvider({ apiKey: voyageApiKey })\n : new MockEmbeddingProvider();\n\n // For now, always use in-memory adapter\n // Future: add postgres, neo4j adapters\n const storageAdapter = new InMemoryStorageAdapter();\n\n const aetherConfig: AetherConfig = {\n storage: { adapter: storageAdapter },\n embeddings: { provider: embeddingProvider },\n };\n\n aetherInstance = new Aether(aetherConfig);\n await aetherInstance.initialize();\n\n return aetherInstance;\n}\n\nexport async function closeAether(): Promise<void> {\n if (aetherInstance) {\n await aetherInstance.close();\n aetherInstance = null;\n }\n}\n","import { existsSync, readFileSync, writeFileSync } from 'node:fs';\nimport { join } from 'node:path';\nimport { homedir } from 'node:os';\n\nexport interface AetherCliConfig {\n adapter: 'in-memory' | 'postgres' | 'neo4j';\n voyageApiKey?: string;\n databaseUrl?: string;\n dataDir?: string;\n}\n\nconst DEFAULT_CONFIG: AetherCliConfig = {\n adapter: 'in-memory',\n};\n\nfunction getConfigPath(): string {\n return join(homedir(), '.aether', 'config.json');\n}\n\nexport function loadConfig(): AetherCliConfig {\n const configPath = getConfigPath();\n\n if (!existsSync(configPath)) {\n return DEFAULT_CONFIG;\n }\n\n try {\n const content = readFileSync(configPath, 'utf-8');\n return { ...DEFAULT_CONFIG, ...JSON.parse(content) };\n } catch {\n return DEFAULT_CONFIG;\n }\n}\n\nexport function saveConfig(config: AetherCliConfig): void {\n const configPath = getConfigPath();\n const configDir = join(homedir(), '.aether');\n\n // Create directory if it doesn't exist\n if (!existsSync(configDir)) {\n const { mkdirSync } = require('node:fs');\n mkdirSync(configDir, { recursive: true });\n }\n\n writeFileSync(configPath, JSON.stringify(config, null, 2));\n}\n\nexport function getEnvConfig(): Partial<AetherCliConfig> {\n return {\n voyageApiKey: process.env['VOYAGE_API_KEY'],\n databaseUrl: process.env['DATABASE_URL'],\n dataDir: process.env['AETHER_DATA_DIR'],\n };\n}\n","import chalk from 'chalk';\nimport type { MemoryEvent } from 'aether-core';\n\nexport function formatEvent(event: MemoryEvent, verbose = false): string {\n const lines: string[] = [];\n\n lines.push(\n chalk.cyan(`[${event.id.slice(0, 8)}]`) +\n ' ' +\n chalk.gray(new Date(event.timestamp).toLocaleString())\n );\n\n lines.push(\n chalk.yellow(` ${event.actor}`) + chalk.gray(' → ') + chalk.green(event.action)\n );\n\n lines.push(chalk.white(` ${event.content}`));\n\n if (verbose && Object.keys(event.context).length > 0) {\n lines.push(chalk.gray(` Context: ${JSON.stringify(event.context)}`));\n }\n\n return lines.join('\\n');\n}\n\nexport function formatEvents(events: MemoryEvent[], verbose = false): string {\n if (events.length === 0) {\n return chalk.gray('No events found.');\n }\n\n return events.map((e) => formatEvent(e, verbose)).join('\\n\\n');\n}\n\nexport function formatStats(stats: Record<string, unknown>): string {\n const lines: string[] = [];\n\n lines.push(chalk.bold('Aether Memory Statistics'));\n lines.push(chalk.gray('─'.repeat(30)));\n\n for (const [key, value] of Object.entries(stats)) {\n const formattedKey = key\n .replace(/([A-Z])/g, ' $1')\n .replace(/^./, (s) => s.toUpperCase());\n lines.push(`${chalk.cyan(formattedKey)}: ${chalk.white(String(value))}`);\n }\n\n return lines.join('\\n');\n}\n\nexport function success(message: string): void {\n console.log(chalk.green('✓ ') + message);\n}\n\nexport function error(message: string): void {\n console.error(chalk.red('✗ ') + message);\n}\n\nexport function info(message: string): void {\n console.log(chalk.blue('ℹ ') + message);\n}\n\nexport function warn(message: string): void {\n console.log(chalk.yellow('⚠ ') + message);\n}\n","import { Command } from 'commander';\nimport ora from 'ora';\nimport type { RetrievalType } from 'aether-core';\nimport { getAether, closeAether } from '../utils/aether.js';\nimport { formatEvents, error, info } from '../utils/output.js';\n\nexport const queryCommand = new Command('query')\n .description('Query memories')\n .argument('<text>', 'Query text')\n .option('-a, --actor <actor>', 'Filter by actor')\n .option(\n '-t, --type <type>',\n 'Retrieval type (semantic, temporal, relational, hybrid)',\n 'hybrid'\n )\n .option('-l, --limit <n>', 'Maximum results', '10')\n .option('-v, --verbose', 'Show detailed output', false)\n .action(async (text: string, options) => {\n const spinner = ora('Searching memories...').start();\n\n try {\n const aether = await getAether();\n\n const events = await aether.retrieve(text, {\n actor: options.actor,\n retrievalType: options.type as RetrievalType,\n limit: parseInt(options.limit, 10),\n });\n\n spinner.stop();\n info(`Found ${events.length} memories`);\n console.log();\n console.log(formatEvents(events, options.verbose));\n } catch (err) {\n spinner.fail('Query failed');\n error(String(err));\n } finally {\n await closeAether();\n }\n });\n","import { Command } from 'commander';\nimport ora from 'ora';\nimport { getAether, closeAether } from '../utils/aether.js';\nimport { formatEvents, error, info } from '../utils/output.js';\n\nexport const historyCommand = new Command('history')\n .description('Get actor history')\n .argument('<actor>', 'Actor to get history for')\n .option('-l, --limit <n>', 'Maximum events', '20')\n .option('-v, --verbose', 'Show detailed output', false)\n .action(async (actor: string, options) => {\n const spinner = ora(`Fetching history for ${actor}...`).start();\n\n try {\n const aether = await getAether();\n\n const events = await aether.getHistory(actor, parseInt(options.limit, 10));\n\n spinner.stop();\n info(`Found ${events.length} events for ${actor}`);\n console.log();\n console.log(formatEvents(events, options.verbose));\n } catch (err) {\n spinner.fail('Failed to fetch history');\n error(String(err));\n } finally {\n await closeAether();\n }\n });\n","import { Command } from 'commander';\nimport chalk from 'chalk';\nimport {\n Aether,\n InMemoryStorageAdapter,\n VoyageProvider,\n MockEmbeddingProvider,\n} from 'aether-core';\nimport { createServer } from 'aether-server';\nimport { loadConfig, getEnvConfig } from '../utils/config.js';\nimport { info, success, error as logError, warn } from '../utils/output.js';\n\nexport const serveCommand = new Command('serve')\n .description('Start Aether REST/WebSocket server')\n .option('-p, --port <port>', 'Port number', '3000')\n .option('-H, --host <host>', 'Host to bind to', '0.0.0.0')\n .option('-k, --api-key <key>', 'API key for authentication')\n .option('--no-cors', 'Disable CORS')\n .option('--log', 'Enable request logging', true)\n .action(async (options) => {\n const port = parseInt(options.port, 10);\n const host = options.host;\n\n console.log();\n console.log(chalk.bold.cyan(' Aether Server'));\n console.log(chalk.gray(' ─'.repeat(20)));\n console.log();\n\n try {\n // Load configuration\n const fileConfig = loadConfig();\n const envConfig = getEnvConfig();\n const config = { ...fileConfig, ...envConfig };\n\n // Determine embedding provider\n const voyageApiKey = config.voyageApiKey || process.env['VOYAGE_API_KEY'];\n const embeddingProvider = voyageApiKey\n ? new VoyageProvider({ apiKey: voyageApiKey })\n : new MockEmbeddingProvider();\n\n if (!voyageApiKey) {\n warn('No VOYAGE_API_KEY found. Using mock embeddings.');\n warn('Set VOYAGE_API_KEY environment variable for production.');\n console.log();\n }\n\n // Create storage adapter (in-memory for now)\n const storageAdapter = new InMemoryStorageAdapter();\n\n info('Initializing Aether...');\n\n // Create and start server\n const server = await createServer({\n port,\n host,\n corsOrigin: options.cors ? true : false,\n logging: options.log,\n apiKey: options.apiKey,\n aether: {\n storage: { adapter: storageAdapter },\n embeddings: { provider: embeddingProvider },\n },\n });\n\n await server.listen({ port, host });\n\n console.log();\n success(`Server running at http://${host}:${port}`);\n console.log();\n console.log(chalk.gray(' Endpoints:'));\n console.log(chalk.gray(' ──────────'));\n console.log(` ${chalk.cyan('GET')} /health Health check`);\n console.log(` ${chalk.green('POST')} /api/v1/memory Add memory`);\n console.log(` ${chalk.cyan('GET')} /api/v1/memory Query memories`);\n console.log(` ${chalk.cyan('GET')} /api/v1/memory/:id Get by ID`);\n console.log(` ${chalk.red('DELETE')} /api/v1/memory/:id Delete memory`);\n console.log(` ${chalk.green('POST')} /api/v1/memory/batch Batch add`);\n console.log(` ${chalk.cyan('GET')} /api/v1/history/:actor Actor history`);\n console.log(` ${chalk.green('POST')} /api/v1/search Advanced search`);\n console.log(` ${chalk.cyan('GET')} /api/v1/stats Statistics`);\n console.log(` ${chalk.magenta('WS')} /ws WebSocket stream`);\n console.log();\n console.log(chalk.gray(' Press Ctrl+C to stop'));\n console.log();\n\n // Handle graceful shutdown\n const shutdown = async (signal: string) => {\n console.log();\n info(`Received ${signal}. Shutting down gracefully...`);\n await server.close();\n success('Server stopped.');\n process.exit(0);\n };\n\n process.on('SIGINT', () => shutdown('SIGINT'));\n process.on('SIGTERM', () => shutdown('SIGTERM'));\n\n } catch (err) {\n logError(`Failed to start server: ${err}`);\n process.exit(1);\n }\n });\n","import { Command } from 'commander';\nimport ora from 'ora';\nimport { getAether, closeAether } from '../utils/aether.js';\nimport { formatStats, error } from '../utils/output.js';\n\nexport const statsCommand = new Command('stats')\n .description('Show memory statistics')\n .action(async () => {\n const spinner = ora('Gathering statistics...').start();\n\n try {\n const aether = await getAether();\n const stats = await aether.stats();\n\n spinner.stop();\n console.log();\n console.log(formatStats(stats as unknown as Record<string, unknown>));\n } catch (err) {\n spinner.fail('Failed to get statistics');\n error(String(err));\n } finally {\n await closeAether();\n }\n });\n","import { Command } from 'commander';\nimport { writeFileSync } from 'node:fs';\nimport ora from 'ora';\nimport { getAether, closeAether } from '../utils/aether.js';\nimport { success, error, info } from '../utils/output.js';\n\nexport const exportCommand = new Command('export')\n .description('Export memories to file')\n .option('-f, --format <format>', 'Output format (json, csv)', 'json')\n .option('-o, --output <file>', 'Output file path')\n .option('-a, --actor <actor>', 'Filter by actor')\n .action(async (options) => {\n const spinner = ora('Exporting memories...').start();\n\n try {\n const aether = await getAether();\n\n // Get all events (or filtered by actor)\n let events;\n if (options.actor) {\n events = await aether.getHistory(options.actor, 10000);\n } else {\n // Get stats first to know all actors\n const stats = await aether.stats();\n events = [];\n\n // This is a limitation of the current implementation\n // In production, you'd want a getAllEvents method\n info(`Note: Export currently requires specifying an actor`);\n spinner.stop();\n return;\n }\n\n let output: string;\n const format = options.format.toLowerCase();\n\n if (format === 'json') {\n output = JSON.stringify(events, null, 2);\n } else if (format === 'csv') {\n const headers = ['id', 'timestamp', 'actor', 'action', 'content', 'context'];\n const rows = events.map((e) => [\n e.id,\n e.timestamp,\n e.actor,\n e.action,\n `\"${e.content.replace(/\"/g, '\"\"')}\"`,\n `\"${JSON.stringify(e.context).replace(/\"/g, '\"\"')}\"`,\n ]);\n output = [headers.join(','), ...rows.map((r) => r.join(','))].join('\\n');\n } else {\n throw new Error(`Unknown format: ${format}`);\n }\n\n if (options.output) {\n writeFileSync(options.output, output);\n spinner.stop();\n success(`Exported ${events.length} events to ${options.output}`);\n } else {\n spinner.stop();\n console.log(output);\n }\n } catch (err) {\n spinner.fail('Export failed');\n error(String(err));\n } finally {\n await closeAether();\n }\n });\n","import { Command } from 'commander';\nimport { createInterface } from 'node:readline';\nimport chalk from 'chalk';\nimport { getAether, closeAether } from '../utils/aether.js';\nimport { formatEvents, formatEvent, info, error as logError } from '../utils/output.js';\n\nexport const replCommand = new Command('repl')\n .description('Interactive REPL mode')\n .action(async () => {\n const aether = await getAether();\n\n console.log();\n console.log(chalk.bold.cyan('Aether Interactive REPL'));\n console.log(chalk.gray('Type \"help\" for available commands, \"exit\" to quit'));\n console.log();\n\n const rl = createInterface({\n input: process.stdin,\n output: process.stdout,\n prompt: chalk.green('aether> '),\n });\n\n const showHelp = () => {\n console.log(`\n${chalk.bold('Available Commands:')}\n\n ${chalk.cyan('add')} <content> Add a memory event\n ${chalk.cyan('add')} <content> --actor <a> Add with specific actor\n ${chalk.cyan('query')} <text> Search memories\n ${chalk.cyan('history')} <actor> Get actor history\n ${chalk.cyan('stats')} Show statistics\n ${chalk.cyan('clear')} Clear all memories\n ${chalk.cyan('help')} Show this help\n ${chalk.cyan('exit')} Exit REPL\n`);\n };\n\n rl.prompt();\n\n rl.on('line', async (line) => {\n const trimmed = line.trim();\n if (!trimmed) {\n rl.prompt();\n return;\n }\n\n const parts = trimmed.split(/\\s+/);\n const cmd = parts[0]?.toLowerCase();\n\n try {\n switch (cmd) {\n case 'help':\n showHelp();\n break;\n\n case 'exit':\n case 'quit':\n await closeAether();\n console.log(chalk.gray('Goodbye!'));\n process.exit(0);\n\n case 'add': {\n const content = parts.slice(1).join(' ');\n if (!content) {\n logError('Usage: add <content>');\n break;\n }\n const event = await aether.add(content);\n console.log(formatEvent(event));\n break;\n }\n\n case 'query': {\n const query = parts.slice(1).join(' ');\n if (!query) {\n logError('Usage: query <text>');\n break;\n }\n const results = await aether.retrieve(query, { limit: 5 });\n console.log(formatEvents(results));\n break;\n }\n\n case 'history': {\n const actor = parts[1];\n if (!actor) {\n logError('Usage: history <actor>');\n break;\n }\n const events = await aether.getHistory(actor, 10);\n console.log(formatEvents(events));\n break;\n }\n\n case 'stats': {\n const stats = await aether.stats();\n console.log(JSON.stringify(stats, null, 2));\n break;\n }\n\n case 'clear': {\n await aether.clear();\n info('All memories cleared');\n break;\n }\n\n default:\n logError(`Unknown command: ${cmd}. Type \"help\" for available commands.`);\n }\n } catch (err) {\n logError(String(err));\n }\n\n rl.prompt();\n });\n\n rl.on('close', async () => {\n await closeAether();\n console.log(chalk.gray('\\nGoodbye!'));\n process.exit(0);\n });\n });\n","import { Command } from 'commander';\nimport { saveConfig, type AetherCliConfig } from '../utils/config.js';\nimport { success, info } from '../utils/output.js';\n\nexport const initCommand = new Command('init')\n .description('Initialize Aether configuration')\n .option('-a, --adapter <type>', 'Storage adapter (in-memory, postgres, neo4j)', 'in-memory')\n .option('-k, --api-key <key>', 'VoyageAI API key')\n .action(async (options) => {\n const config: AetherCliConfig = {\n adapter: options.adapter as AetherCliConfig['adapter'],\n voyageApiKey: options.apiKey,\n };\n\n saveConfig(config);\n\n success('Aether configuration initialized!');\n info(`Storage adapter: ${config.adapter}`);\n if (config.voyageApiKey) {\n info('VoyageAI API key: configured');\n } else {\n info('VoyageAI API key: not set (using mock embeddings)');\n info('Set VOYAGE_API_KEY environment variable or run: aether init --api-key <key>');\n }\n });\n"],"mappings":"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","names":["Command","Command","ora","Command","ora","Command","ora","Command","ora","Command","chalk","InMemoryStorageAdapter","VoyageProvider","MockEmbeddingProvider","Command","chalk","VoyageProvider","MockEmbeddingProvider","InMemoryStorageAdapter","Command","ora","Command","ora","Command","writeFileSync","ora","Command","ora","writeFileSync","Command","chalk","Command","chalk","Command","Command","Command"]}
|
package/package.json
ADDED
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "aether-cli",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"description": "CLI for Aether Memory Framework",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"bin": {
|
|
7
|
+
"aether": "./dist/index.js"
|
|
8
|
+
},
|
|
9
|
+
"main": "./dist/index.js",
|
|
10
|
+
"types": "./dist/index.d.ts",
|
|
11
|
+
"files": [
|
|
12
|
+
"dist"
|
|
13
|
+
],
|
|
14
|
+
"dependencies": {
|
|
15
|
+
"commander": "^12.0.0",
|
|
16
|
+
"chalk": "^5.3.0",
|
|
17
|
+
"ora": "^8.0.0",
|
|
18
|
+
"inquirer": "^9.2.0",
|
|
19
|
+
"aether-core": "0.1.0",
|
|
20
|
+
"aether-server": "0.1.0"
|
|
21
|
+
},
|
|
22
|
+
"devDependencies": {
|
|
23
|
+
"@types/inquirer": "^9.0.0",
|
|
24
|
+
"@types/node": "^20.10.0",
|
|
25
|
+
"tsup": "^8.0.0",
|
|
26
|
+
"typescript": "^5.3.0"
|
|
27
|
+
},
|
|
28
|
+
"engines": {
|
|
29
|
+
"node": ">=18.0.0"
|
|
30
|
+
},
|
|
31
|
+
"publishConfig": {
|
|
32
|
+
"access": "public"
|
|
33
|
+
},
|
|
34
|
+
"keywords": [
|
|
35
|
+
"cli",
|
|
36
|
+
"aether",
|
|
37
|
+
"llm",
|
|
38
|
+
"memory"
|
|
39
|
+
],
|
|
40
|
+
"license": "MIT",
|
|
41
|
+
"scripts": {
|
|
42
|
+
"build": "tsup",
|
|
43
|
+
"dev": "tsup --watch",
|
|
44
|
+
"start": "node dist/index.js",
|
|
45
|
+
"typecheck": "tsc --noEmit",
|
|
46
|
+
"clean": "rm -rf dist .turbo"
|
|
47
|
+
}
|
|
48
|
+
}
|