aether-cli 0.1.0 → 1.0.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.js CHANGED
@@ -7,7 +7,7 @@ var __require = /* @__PURE__ */ ((x) => typeof require !== "undefined" ? require
7
7
  });
8
8
 
9
9
  // src/index.ts
10
- import { Command as Command9 } from "commander";
10
+ import { Command as Command12 } from "commander";
11
11
 
12
12
  // src/commands/add.ts
13
13
  import { Command } from "commander";
@@ -286,10 +286,117 @@ var serveCommand = new Command4("serve").description("Start Aether REST/WebSocke
286
286
  }
287
287
  });
288
288
 
289
- // src/commands/stats.ts
289
+ // src/commands/studio.ts
290
290
  import { Command as Command5 } from "commander";
291
+ import { exec } from "child_process";
292
+ import chalk3 from "chalk";
293
+ import {
294
+ InMemoryStorageAdapter as InMemoryStorageAdapter3,
295
+ VoyageProvider as VoyageProvider3,
296
+ MockEmbeddingProvider as MockEmbeddingProvider3
297
+ } from "aether-core";
298
+ import { createServer as createServer2 } from "aether-server";
299
+ function openBrowser(url) {
300
+ const platform = process.platform;
301
+ let command;
302
+ switch (platform) {
303
+ case "darwin":
304
+ command = `open "${url}"`;
305
+ break;
306
+ case "win32":
307
+ command = `start "" "${url}"`;
308
+ break;
309
+ default:
310
+ command = `xdg-open "${url}"`;
311
+ }
312
+ exec(command, (err) => {
313
+ if (err) {
314
+ warn(`Could not open browser automatically. Please visit: ${url}`);
315
+ }
316
+ });
317
+ }
318
+ var studioCommand = new Command5("studio").description("Start Aether Studio - visual memory explorer").option("-p, --port <port>", "Port number", "3000").option("-H, --host <host>", "Host to bind to", "localhost").option("-u, --url <url>", "Connect to existing Aether server (opens browser only)").option("-k, --api-key <key>", "API key for authentication").option("--no-open", "Do not auto-open browser").option("--log", "Enable request logging", false).action(async (options) => {
319
+ console.log();
320
+ console.log(chalk3.bold.magenta(" \u2728 Aether Studio"));
321
+ console.log(chalk3.gray(" \u2500".repeat(20)));
322
+ console.log();
323
+ if (options.url) {
324
+ info(`Connecting to existing server at ${options.url}`);
325
+ console.log();
326
+ console.log(` ${chalk3.cyan("\u2192")} ${chalk3.bold(options.url)}`);
327
+ console.log();
328
+ console.log(chalk3.gray(" Tip: Make sure your app is running with aether.initialize({ studio: { port } })"));
329
+ console.log();
330
+ if (options.open !== false) {
331
+ openBrowser(options.url);
332
+ }
333
+ return;
334
+ }
335
+ const port = parseInt(options.port, 10);
336
+ const host = options.host;
337
+ try {
338
+ const fileConfig = loadConfig();
339
+ const envConfig = getEnvConfig();
340
+ const config = { ...fileConfig, ...envConfig };
341
+ const voyageApiKey = config.voyageApiKey || process.env["VOYAGE_API_KEY"];
342
+ const embeddingProvider = voyageApiKey ? new VoyageProvider3({ apiKey: voyageApiKey }) : new MockEmbeddingProvider3();
343
+ if (!voyageApiKey) {
344
+ warn("No VOYAGE_API_KEY found. Using mock embeddings.");
345
+ console.log();
346
+ }
347
+ const storageAdapter = new InMemoryStorageAdapter3();
348
+ info("Starting Aether Studio...");
349
+ const server = await createServer2({
350
+ port,
351
+ host,
352
+ corsOrigin: true,
353
+ logging: options.log,
354
+ apiKey: options.apiKey,
355
+ studio: true,
356
+ aether: {
357
+ storage: { adapter: storageAdapter },
358
+ embeddings: { provider: embeddingProvider }
359
+ }
360
+ });
361
+ await server.listen({ port, host });
362
+ const url = `http://${host === "0.0.0.0" ? "localhost" : host}:${port}`;
363
+ console.log();
364
+ success("Aether Studio is running!");
365
+ console.log();
366
+ console.log(` ${chalk3.cyan("\u2192")} ${chalk3.bold(url)}`);
367
+ console.log();
368
+ console.log(chalk3.gray(" Features:"));
369
+ console.log(chalk3.gray(" \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500"));
370
+ console.log(` ${chalk3.green("\u2022")} Add and search memories`);
371
+ console.log(` ${chalk3.green("\u2022")} Timeline visualization`);
372
+ console.log(` ${chalk3.green("\u2022")} Graph visualization`);
373
+ console.log(` ${chalk3.green("\u2022")} Real-time updates via WebSocket`);
374
+ console.log();
375
+ console.log(chalk3.gray(" API endpoints available at /api/v1/*"));
376
+ console.log(chalk3.gray(" Press Ctrl+C to stop"));
377
+ console.log();
378
+ if (options.open !== false) {
379
+ setTimeout(() => openBrowser(url), 500);
380
+ }
381
+ const shutdown = async (signal) => {
382
+ console.log();
383
+ info(`Shutting down...`);
384
+ await server.close();
385
+ success("Goodbye!");
386
+ process.exit(0);
387
+ };
388
+ process.on("SIGINT", () => shutdown("SIGINT"));
389
+ process.on("SIGTERM", () => shutdown("SIGTERM"));
390
+ } catch (err) {
391
+ error(`Failed to start studio: ${err}`);
392
+ process.exit(1);
393
+ }
394
+ });
395
+
396
+ // src/commands/stats.ts
397
+ import { Command as Command6 } from "commander";
291
398
  import ora4 from "ora";
292
- var statsCommand = new Command5("stats").description("Show memory statistics").action(async () => {
399
+ var statsCommand = new Command6("stats").description("Show memory statistics").action(async () => {
293
400
  const spinner = ora4("Gathering statistics...").start();
294
401
  try {
295
402
  const aether = await getAether();
@@ -306,10 +413,10 @@ var statsCommand = new Command5("stats").description("Show memory statistics").a
306
413
  });
307
414
 
308
415
  // src/commands/export.ts
309
- import { Command as Command6 } from "commander";
416
+ import { Command as Command7 } from "commander";
310
417
  import { writeFileSync as writeFileSync2 } from "fs";
311
418
  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) => {
419
+ var exportCommand = new Command7("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
420
  const spinner = ora5("Exporting memories...").start();
314
421
  try {
315
422
  const aether = await getAether();
@@ -358,32 +465,32 @@ var exportCommand = new Command6("export").description("Export memories to file"
358
465
  });
359
466
 
360
467
  // src/commands/repl.ts
361
- import { Command as Command7 } from "commander";
468
+ import { Command as Command8 } from "commander";
362
469
  import { createInterface } from "readline";
363
- import chalk3 from "chalk";
364
- var replCommand = new Command7("repl").description("Interactive REPL mode").action(async () => {
470
+ import chalk4 from "chalk";
471
+ var replCommand = new Command8("repl").description("Interactive REPL mode").action(async () => {
365
472
  const aether = await getAether();
366
473
  console.log();
367
- console.log(chalk3.bold.cyan("Aether Interactive REPL"));
368
- console.log(chalk3.gray('Type "help" for available commands, "exit" to quit'));
474
+ console.log(chalk4.bold.cyan("Aether Interactive REPL"));
475
+ console.log(chalk4.gray('Type "help" for available commands, "exit" to quit'));
369
476
  console.log();
370
477
  const rl = createInterface({
371
478
  input: process.stdin,
372
479
  output: process.stdout,
373
- prompt: chalk3.green("aether> ")
480
+ prompt: chalk4.green("aether> ")
374
481
  });
375
482
  const showHelp = () => {
376
483
  console.log(`
377
- ${chalk3.bold("Available Commands:")}
484
+ ${chalk4.bold("Available Commands:")}
378
485
 
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
486
+ ${chalk4.cyan("add")} <content> Add a memory event
487
+ ${chalk4.cyan("add")} <content> --actor <a> Add with specific actor
488
+ ${chalk4.cyan("query")} <text> Search memories
489
+ ${chalk4.cyan("history")} <actor> Get actor history
490
+ ${chalk4.cyan("stats")} Show statistics
491
+ ${chalk4.cyan("clear")} Clear all memories
492
+ ${chalk4.cyan("help")} Show this help
493
+ ${chalk4.cyan("exit")} Exit REPL
387
494
  `);
388
495
  };
389
496
  rl.prompt();
@@ -403,7 +510,7 @@ ${chalk3.bold("Available Commands:")}
403
510
  case "exit":
404
511
  case "quit":
405
512
  await closeAether();
406
- console.log(chalk3.gray("Goodbye!"));
513
+ console.log(chalk4.gray("Goodbye!"));
407
514
  process.exit(0);
408
515
  case "add": {
409
516
  const content = parts.slice(1).join(" ");
@@ -455,14 +562,14 @@ ${chalk3.bold("Available Commands:")}
455
562
  });
456
563
  rl.on("close", async () => {
457
564
  await closeAether();
458
- console.log(chalk3.gray("\nGoodbye!"));
565
+ console.log(chalk4.gray("\nGoodbye!"));
459
566
  process.exit(0);
460
567
  });
461
568
  });
462
569
 
463
570
  // 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) => {
571
+ import { Command as Command9 } from "commander";
572
+ var initCommand = new Command9("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
573
  const config = {
467
574
  adapter: options.adapter,
468
575
  voyageApiKey: options.apiKey
@@ -478,14 +585,388 @@ var initCommand = new Command8("init").description("Initialize Aether configurat
478
585
  }
479
586
  });
480
587
 
588
+ // src/commands/trajectory.ts
589
+ import { Command as Command10 } from "commander";
590
+ import ora6 from "ora";
591
+ import chalk5 from "chalk";
592
+ function formatTrajectory(traj, verbose = false) {
593
+ const lines = [];
594
+ const statusColor = traj.status === "active" ? chalk5.blue : traj.status === "completed" ? chalk5.green : chalk5.gray;
595
+ const outcomeColor = traj.outcome === "success" ? chalk5.green : traj.outcome === "failure" ? chalk5.red : traj.outcome === "partial" ? chalk5.yellow : chalk5.gray;
596
+ lines.push(
597
+ chalk5.cyan(`[${traj.id.slice(0, 12)}]`) + " " + statusColor(`[${traj.status}]`) + (traj.outcome ? " " + outcomeColor(`(${traj.outcome})`) : "")
598
+ );
599
+ lines.push(chalk5.yellow(` Actor: ${traj.actor}`));
600
+ lines.push(chalk5.gray(` Started: ${new Date(traj.startTime).toLocaleString()}`));
601
+ if (traj.endTime) {
602
+ lines.push(chalk5.gray(` Ended: ${new Date(traj.endTime).toLocaleString()}`));
603
+ }
604
+ lines.push(chalk5.white(` Events: ${traj.events.length}`));
605
+ if (verbose && Object.keys(traj.context).length > 0) {
606
+ lines.push(chalk5.gray(` Context: ${JSON.stringify(traj.context)}`));
607
+ }
608
+ return lines.join("\n");
609
+ }
610
+ function formatTrajectories(trajectories, verbose = false) {
611
+ if (trajectories.length === 0) {
612
+ return chalk5.gray("No trajectories found.");
613
+ }
614
+ return trajectories.map((t) => formatTrajectory(t, verbose)).join("\n\n");
615
+ }
616
+ var trajectoryCommand = new Command10("trajectory").description("Manage trajectories (agent reasoning paths)").alias("traj");
617
+ trajectoryCommand.command("start").description("Start a new trajectory").argument("<actor>", "Actor for the trajectory").option("-c, --context <json>", "Context JSON").action(async (actor, options) => {
618
+ const spinner = ora6("Starting trajectory...").start();
619
+ try {
620
+ const aether = await getAether();
621
+ let context;
622
+ if (options.context) {
623
+ try {
624
+ context = JSON.parse(options.context);
625
+ } catch {
626
+ spinner.fail("Invalid JSON for context");
627
+ return;
628
+ }
629
+ }
630
+ const trajectoryId = await aether.startTrajectory(actor, context);
631
+ spinner.stop();
632
+ success(`Trajectory started: ${trajectoryId}`);
633
+ console.log(chalk5.gray("Save this ID to add events and end the trajectory."));
634
+ } catch (err) {
635
+ spinner.fail("Failed to start trajectory");
636
+ error(String(err));
637
+ } finally {
638
+ await closeAether();
639
+ }
640
+ });
641
+ trajectoryCommand.command("end").description("End an active trajectory").argument("<id>", "Trajectory ID").option("-o, --outcome <outcome>", "Outcome: success, failure, partial").action(async (id, options) => {
642
+ const spinner = ora6("Ending trajectory...").start();
643
+ try {
644
+ const aether = await getAether();
645
+ const outcome = options.outcome;
646
+ const trajectory = await aether.endTrajectory(id, outcome);
647
+ spinner.stop();
648
+ success(`Trajectory ended`);
649
+ console.log(formatTrajectory(trajectory, true));
650
+ } catch (err) {
651
+ spinner.fail("Failed to end trajectory");
652
+ error(String(err));
653
+ } finally {
654
+ await closeAether();
655
+ }
656
+ });
657
+ trajectoryCommand.command("get").description("Get trajectory details").argument("<id>", "Trajectory ID").option("-v, --verbose", "Show detailed output", false).option("-e, --events", "Include event details", false).action(async (id, options) => {
658
+ const spinner = ora6("Fetching trajectory...").start();
659
+ try {
660
+ const aether = await getAether();
661
+ const trajectory = await aether.getTrajectory(id);
662
+ if (!trajectory) {
663
+ spinner.fail("Trajectory not found");
664
+ return;
665
+ }
666
+ spinner.stop();
667
+ console.log(formatTrajectory(trajectory, options.verbose));
668
+ if (options.events) {
669
+ const events = await aether.getTrajectoryEvents(id);
670
+ console.log("\n" + chalk5.bold("Events:"));
671
+ for (const event of events) {
672
+ console.log(
673
+ chalk5.gray(" - ") + chalk5.cyan(event.id.slice(0, 8)) + " " + chalk5.yellow(event.action) + ": " + chalk5.white(event.content.slice(0, 60) + (event.content.length > 60 ? "..." : ""))
674
+ );
675
+ }
676
+ }
677
+ } catch (err) {
678
+ spinner.fail("Failed to fetch trajectory");
679
+ error(String(err));
680
+ } finally {
681
+ await closeAether();
682
+ }
683
+ });
684
+ trajectoryCommand.command("list").description("List trajectories for an actor").argument("<actor>", "Actor to list trajectories for").option("-s, --status <status>", "Filter by status: active, completed, abandoned").option("-o, --outcome <outcome>", "Filter by outcome: success, failure, partial").option("-l, --limit <n>", "Maximum trajectories", "20").option("-v, --verbose", "Show detailed output", false).action(async (actor, options) => {
685
+ const spinner = ora6(`Fetching trajectories for ${actor}...`).start();
686
+ try {
687
+ const aether = await getAether();
688
+ const status = options.status ? [options.status] : void 0;
689
+ const outcome = options.outcome ? [options.outcome] : void 0;
690
+ const trajectories = await aether.getTrajectories({
691
+ actor,
692
+ status,
693
+ outcome,
694
+ limit: parseInt(options.limit, 10)
695
+ });
696
+ spinner.stop();
697
+ info(`Found ${trajectories.length} trajectories for ${actor}`);
698
+ console.log();
699
+ console.log(formatTrajectories(trajectories, options.verbose));
700
+ } catch (err) {
701
+ spinner.fail("Failed to fetch trajectories");
702
+ error(String(err));
703
+ } finally {
704
+ await closeAether();
705
+ }
706
+ });
707
+ trajectoryCommand.command("infer").description("Auto-infer trajectories from events").argument("<actor>", "Actor to infer trajectories for").option("-g, --gap <ms>", "Max gap between events (ms)", "1800000").option("-m, --min-events <n>", "Minimum events per trajectory", "2").option("-v, --verbose", "Show detailed output", false).action(async (actor, options) => {
708
+ const spinner = ora6(`Inferring trajectories for ${actor}...`).start();
709
+ try {
710
+ const aether = await getAether();
711
+ const trajectories = await aether.inferTrajectories(actor, {
712
+ maxGapMs: parseInt(options.gap, 10),
713
+ minEvents: parseInt(options.minEvents, 10)
714
+ });
715
+ spinner.stop();
716
+ success(`Inferred ${trajectories.length} trajectories`);
717
+ console.log();
718
+ console.log(formatTrajectories(trajectories, options.verbose));
719
+ } catch (err) {
720
+ spinner.fail("Failed to infer trajectories");
721
+ error(String(err));
722
+ } finally {
723
+ await closeAether();
724
+ }
725
+ });
726
+ trajectoryCommand.command("stats").description("Get trajectory statistics for an actor").argument("<actor>", "Actor to get stats for").action(async (actor) => {
727
+ const spinner = ora6(`Fetching trajectory stats for ${actor}...`).start();
728
+ try {
729
+ const aether = await getAether();
730
+ const stats = await aether.getTrajectoryStats(actor);
731
+ spinner.stop();
732
+ console.log(chalk5.bold(`Trajectory Statistics for ${actor}`));
733
+ console.log(chalk5.gray("\u2500".repeat(40)));
734
+ console.log(`${chalk5.cyan("Total")}: ${stats.total}`);
735
+ console.log(`${chalk5.cyan("By Status")}:`);
736
+ console.log(` Active: ${stats.byStatus.active}`);
737
+ console.log(` Completed: ${stats.byStatus.completed}`);
738
+ console.log(` Abandoned: ${stats.byStatus.abandoned}`);
739
+ console.log(`${chalk5.cyan("By Outcome")}:`);
740
+ console.log(` Success: ${chalk5.green(stats.byOutcome.success)}`);
741
+ console.log(` Failure: ${chalk5.red(stats.byOutcome.failure)}`);
742
+ console.log(` Partial: ${chalk5.yellow(stats.byOutcome.partial)}`);
743
+ console.log(`${chalk5.cyan("Avg Events")}: ${stats.avgEvents.toFixed(1)}`);
744
+ console.log(`${chalk5.cyan("Avg Duration")}: ${(stats.avgDurationMs / 1e3).toFixed(1)}s`);
745
+ console.log(`${chalk5.cyan("Success Rate")}: ${(stats.successRate * 100).toFixed(1)}%`);
746
+ } catch (err) {
747
+ spinner.fail("Failed to fetch trajectory stats");
748
+ error(String(err));
749
+ } finally {
750
+ await closeAether();
751
+ }
752
+ });
753
+
754
+ // src/commands/patterns.ts
755
+ import { Command as Command11 } from "commander";
756
+ import ora7 from "ora";
757
+ import chalk6 from "chalk";
758
+ function formatPattern(pattern) {
759
+ const lines = [];
760
+ lines.push(chalk6.cyan(`[${pattern.id}]`) + " " + chalk6.white(pattern.sequence.join(" \u2192 ")));
761
+ lines.push(
762
+ chalk6.gray(` Frequency: ${pattern.frequency}`) + chalk6.gray(` | Confidence: ${(pattern.confidence * 100).toFixed(0)}%`) + chalk6.gray(` | Support: ${(pattern.support * 100).toFixed(0)}%`)
763
+ );
764
+ if (pattern.avgDurationMs) {
765
+ lines.push(chalk6.gray(` Avg Duration: ${(pattern.avgDurationMs / 1e3).toFixed(1)}s`));
766
+ }
767
+ return lines.join("\n");
768
+ }
769
+ function formatAnomaly(anomaly) {
770
+ const lines = [];
771
+ const severityColor = anomaly.severity === "high" ? chalk6.red : anomaly.severity === "medium" ? chalk6.yellow : chalk6.gray;
772
+ lines.push(
773
+ severityColor(`[${anomaly.severity.toUpperCase()}]`) + " " + chalk6.cyan(`Event: ${anomaly.eventId.slice(0, 8)}`)
774
+ );
775
+ lines.push(chalk6.white(` ${anomaly.reason}`));
776
+ lines.push(
777
+ chalk6.gray(` Expected: ${anomaly.expectedAction}`) + chalk6.gray(` | Deviation: ${(anomaly.deviationScore * 100).toFixed(0)}%`)
778
+ );
779
+ return lines.join("\n");
780
+ }
781
+ function formatPrediction(pred) {
782
+ const prob = pred.probability * 100;
783
+ const bar = "\u2588".repeat(Math.floor(prob / 5)) + "\u2591".repeat(20 - Math.floor(prob / 5));
784
+ return chalk6.cyan(pred.action.padEnd(15)) + chalk6.gray(` [${bar}] `) + chalk6.white(`${prob.toFixed(0)}%`) + (pred.suggestedContent ? chalk6.gray(` - ${pred.suggestedContent}`) : "");
785
+ }
786
+ function formatTransitionMatrix(matrix) {
787
+ const lines = [];
788
+ lines.push(chalk6.bold("Transition Probabilities"));
789
+ lines.push(chalk6.gray("\u2500".repeat(60)));
790
+ const maxActionLen = Math.max(...matrix.actions.map((a) => a.length));
791
+ for (let i = 0; i < matrix.actions.length; i++) {
792
+ const from = matrix.actions[i].padEnd(maxActionLen);
793
+ const probs = matrix.probabilities[i];
794
+ const indexed = probs.map((p, j) => ({ action: matrix.actions[j], prob: p }));
795
+ const top = indexed.filter((x) => x.prob > 0).sort((a, b) => b.prob - a.prob).slice(0, 3);
796
+ if (top.length === 0) continue;
797
+ const transitions = top.map((t) => `${t.action} (${(t.prob * 100).toFixed(0)}%)`).join(", ");
798
+ lines.push(chalk6.yellow(from) + chalk6.gray(" \u2192 ") + chalk6.white(transitions));
799
+ }
800
+ lines.push(chalk6.gray(`
801
+ Total transitions: ${matrix.totalTransitions}`));
802
+ return lines.join("\n");
803
+ }
804
+ var patternsCommand = new Command11("patterns").description("Pattern detection and prediction").alias("pat");
805
+ patternsCommand.command("detect").description("Detect behavioral patterns for an actor").argument("<actor>", "Actor to detect patterns for").option("-f, --min-frequency <n>", "Minimum pattern frequency", "2").option("-c, --min-confidence <n>", "Minimum confidence (0-1)", "0.5").option("-l, --limit <n>", "Maximum patterns to return", "20").action(async (actor, options) => {
806
+ const spinner = ora7(`Detecting patterns for ${actor}...`).start();
807
+ try {
808
+ const aether = await getAether();
809
+ const patterns = await aether.detectPatterns(actor, {
810
+ minFrequency: parseInt(options.minFrequency, 10),
811
+ minConfidence: parseFloat(options.minConfidence)
812
+ });
813
+ spinner.stop();
814
+ if (patterns.length === 0) {
815
+ info(`No patterns found for ${actor}`);
816
+ return;
817
+ }
818
+ info(`Found ${patterns.length} patterns for ${actor}`);
819
+ console.log();
820
+ for (const pattern of patterns.slice(0, parseInt(options.limit, 10))) {
821
+ console.log(formatPattern(pattern));
822
+ console.log();
823
+ }
824
+ } catch (err) {
825
+ spinner.fail("Failed to detect patterns");
826
+ error(String(err));
827
+ } finally {
828
+ await closeAether();
829
+ }
830
+ });
831
+ patternsCommand.command("anomalies").description("Find behavioral anomalies for an actor").argument("<actor>", "Actor to find anomalies for").option("-s, --severity <level>", "Filter by severity: low, medium, high").option("-m, --min-deviation <n>", "Minimum deviation score (0-1)", "0.3").option("-l, --limit <n>", "Maximum anomalies to return", "20").action(async (actor, options) => {
832
+ const spinner = ora7(`Finding anomalies for ${actor}...`).start();
833
+ try {
834
+ const aether = await getAether();
835
+ const anomalies = await aether.findAnomalies(actor, {
836
+ minDeviationScore: parseFloat(options.minDeviation),
837
+ severities: options.severity ? [options.severity] : void 0,
838
+ limit: parseInt(options.limit, 10)
839
+ });
840
+ spinner.stop();
841
+ if (anomalies.length === 0) {
842
+ info(`No anomalies found for ${actor}`);
843
+ return;
844
+ }
845
+ const highCount = anomalies.filter((a) => a.severity === "high").length;
846
+ if (highCount > 0) {
847
+ warn(`Found ${highCount} high-severity anomalies!`);
848
+ }
849
+ info(`Found ${anomalies.length} anomalies for ${actor}`);
850
+ console.log();
851
+ for (const anomaly of anomalies) {
852
+ console.log(formatAnomaly(anomaly));
853
+ console.log();
854
+ }
855
+ } catch (err) {
856
+ spinner.fail("Failed to find anomalies");
857
+ error(String(err));
858
+ } finally {
859
+ await closeAether();
860
+ }
861
+ });
862
+ patternsCommand.command("transitions").description("Get action transition probabilities for an actor").argument("<actor>", "Actor to get transitions for").action(async (actor) => {
863
+ const spinner = ora7(`Computing transitions for ${actor}...`).start();
864
+ try {
865
+ const aether = await getAether();
866
+ const matrix = await aether.getTransitionProbabilities(actor);
867
+ spinner.stop();
868
+ console.log(formatTransitionMatrix(matrix));
869
+ } catch (err) {
870
+ spinner.fail("Failed to compute transitions");
871
+ error(String(err));
872
+ } finally {
873
+ await closeAether();
874
+ }
875
+ });
876
+ patternsCommand.command("predict").description("Predict next actions from an event").argument("<actor>", "Actor").argument("<event-id>", "Current event ID").option("-k, --top-k <n>", "Number of predictions", "5").action(async (actor, eventId, options) => {
877
+ const spinner = ora7("Predicting next actions...").start();
878
+ try {
879
+ const aether = await getAether();
880
+ const predictions = await aether.predictNext(actor, eventId, {
881
+ topK: parseInt(options.topK, 10)
882
+ });
883
+ spinner.stop();
884
+ if (predictions.length === 0) {
885
+ info("No predictions available");
886
+ return;
887
+ }
888
+ console.log(chalk6.bold("Predicted Next Actions:"));
889
+ console.log(chalk6.gray("\u2500".repeat(50)));
890
+ for (const pred of predictions) {
891
+ console.log(formatPrediction(pred));
892
+ }
893
+ } catch (err) {
894
+ spinner.fail("Failed to predict");
895
+ error(String(err));
896
+ } finally {
897
+ await closeAether();
898
+ }
899
+ });
900
+ patternsCommand.command("simulate").description("Simulate a proposed action").argument("<actor>", "Actor").argument("<action>", "Proposed action").option("-e, --event-id <id>", "Current event ID").option("-c, --context <json>", "Context JSON").action(async (actor, action, options) => {
901
+ const spinner = ora7("Running simulation...").start();
902
+ try {
903
+ const aether = await getAether();
904
+ let context;
905
+ if (options.context) {
906
+ try {
907
+ context = JSON.parse(options.context);
908
+ } catch {
909
+ spinner.fail("Invalid JSON for context");
910
+ return;
911
+ }
912
+ }
913
+ const result = await aether.simulate(actor, action, {
914
+ currentEventId: options.eventId,
915
+ context
916
+ });
917
+ spinner.stop();
918
+ console.log(chalk6.bold("Simulation Result"));
919
+ console.log(chalk6.gray("\u2500".repeat(40)));
920
+ console.log(`${chalk6.cyan("Proposed Action")}: ${result.proposedAction}`);
921
+ const outcomeColor = result.likelyOutcome === "success" ? chalk6.green : result.likelyOutcome === "failure" ? chalk6.red : chalk6.yellow;
922
+ console.log(`${chalk6.cyan("Likely Outcome")}: ${outcomeColor(result.likelyOutcome)}`);
923
+ console.log(`${chalk6.cyan("Confidence")}: ${(result.confidence * 100).toFixed(0)}%`);
924
+ if (result.similarPastCases.length > 0) {
925
+ console.log(`
926
+ ${chalk6.bold("Similar Past Cases")}:`);
927
+ for (const c of result.similarPastCases.slice(0, 3)) {
928
+ const caseOutcome = c.outcome === "success" ? chalk6.green(c.outcome) : c.outcome === "failure" ? chalk6.red(c.outcome) : chalk6.yellow(c.outcome);
929
+ console.log(
930
+ chalk6.gray(" - ") + chalk6.cyan(c.trajectoryId.slice(0, 12)) + ` \u2192 ${caseOutcome}` + chalk6.gray(` (${(c.similarity * 100).toFixed(0)}% similar)`)
931
+ );
932
+ }
933
+ }
934
+ if (result.riskAssessment) {
935
+ const riskColor = result.riskAssessment.level === "high" ? chalk6.red : result.riskAssessment.level === "medium" ? chalk6.yellow : chalk6.green;
936
+ console.log(`
937
+ ${chalk6.bold("Risk Assessment")}: ${riskColor(result.riskAssessment.level)}`);
938
+ for (const risk of result.riskAssessment.risks) {
939
+ console.log(
940
+ chalk6.gray(" - ") + risk.description + chalk6.gray(` (${(risk.probability * 100).toFixed(0)}%)`)
941
+ );
942
+ }
943
+ }
944
+ if (result.predictedFollowUp.length > 0) {
945
+ console.log(`
946
+ ${chalk6.bold("Predicted Follow-up")}:`);
947
+ for (const pred of result.predictedFollowUp.slice(0, 3)) {
948
+ console.log(formatPrediction(pred));
949
+ }
950
+ }
951
+ } catch (err) {
952
+ spinner.fail("Simulation failed");
953
+ error(String(err));
954
+ } finally {
955
+ await closeAether();
956
+ }
957
+ });
958
+
481
959
  // src/index.ts
482
- var program = new Command9();
960
+ var program = new Command12();
483
961
  program.name("aether").description("CLI for Aether Memory Framework - Event-driven memory for LLM agents").version("0.1.0");
484
962
  program.addCommand(initCommand);
485
963
  program.addCommand(addCommand);
486
964
  program.addCommand(queryCommand);
487
965
  program.addCommand(historyCommand);
966
+ program.addCommand(trajectoryCommand);
967
+ program.addCommand(patternsCommand);
488
968
  program.addCommand(serveCommand);
969
+ program.addCommand(studioCommand);
489
970
  program.addCommand(statsCommand);
490
971
  program.addCommand(exportCommand);
491
972
  program.addCommand(replCommand);
package/dist/index.js.map CHANGED
@@ -1 +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"]}
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/studio.ts","../src/commands/stats.ts","../src/commands/export.ts","../src/commands/repl.ts","../src/commands/init.ts","../src/commands/trajectory.ts","../src/commands/patterns.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 { studioCommand } from './commands/studio.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';\nimport { trajectoryCommand } from './commands/trajectory.js';\nimport { patternsCommand } from './commands/patterns.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(trajectoryCommand);\nprogram.addCommand(patternsCommand);\nprogram.addCommand(serveCommand);\nprogram.addCommand(studioCommand);\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 { exec } from 'child_process';\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\nfunction openBrowser(url: string) {\n const platform = process.platform;\n let command: string;\n\n switch (platform) {\n case 'darwin':\n command = `open \"${url}\"`;\n break;\n case 'win32':\n command = `start \"\" \"${url}\"`;\n break;\n default:\n command = `xdg-open \"${url}\"`;\n }\n\n exec(command, (err) => {\n if (err) {\n warn(`Could not open browser automatically. Please visit: ${url}`);\n }\n });\n}\n\nexport const studioCommand = new Command('studio')\n .description('Start Aether Studio - visual memory explorer')\n .option('-p, --port <port>', 'Port number', '3000')\n .option('-H, --host <host>', 'Host to bind to', 'localhost')\n .option('-u, --url <url>', 'Connect to existing Aether server (opens browser only)')\n .option('-k, --api-key <key>', 'API key for authentication')\n .option('--no-open', 'Do not auto-open browser')\n .option('--log', 'Enable request logging', false)\n .action(async (options) => {\n console.log();\n console.log(chalk.bold.magenta(' ✨ Aether Studio'));\n console.log(chalk.gray(' ─'.repeat(20)));\n console.log();\n\n // If URL provided, just open browser to existing server\n if (options.url) {\n info(`Connecting to existing server at ${options.url}`);\n console.log();\n console.log(` ${chalk.cyan('→')} ${chalk.bold(options.url)}`);\n console.log();\n console.log(chalk.gray(' Tip: Make sure your app is running with aether.initialize({ studio: { port } })'));\n console.log();\n\n if (options.open !== false) {\n openBrowser(options.url);\n }\n return;\n }\n\n const port = parseInt(options.port, 10);\n const host = options.host;\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 console.log();\n }\n\n // Create storage adapter (in-memory for now)\n const storageAdapter = new InMemoryStorageAdapter();\n\n info('Starting Aether Studio...');\n\n // Create and start server with studio enabled\n const server = await createServer({\n port,\n host,\n corsOrigin: true,\n logging: options.log,\n apiKey: options.apiKey,\n studio: true,\n aether: {\n storage: { adapter: storageAdapter },\n embeddings: { provider: embeddingProvider },\n },\n });\n\n await server.listen({ port, host });\n\n const url = `http://${host === '0.0.0.0' ? 'localhost' : host}:${port}`;\n\n console.log();\n success('Aether Studio is running!');\n console.log();\n console.log(` ${chalk.cyan('→')} ${chalk.bold(url)}`);\n console.log();\n console.log(chalk.gray(' Features:'));\n console.log(chalk.gray(' ─────────'));\n console.log(` ${chalk.green('•')} Add and search memories`);\n console.log(` ${chalk.green('•')} Timeline visualization`);\n console.log(` ${chalk.green('•')} Graph visualization`);\n console.log(` ${chalk.green('•')} Real-time updates via WebSocket`);\n console.log();\n console.log(chalk.gray(' API endpoints available at /api/v1/*'));\n console.log(chalk.gray(' Press Ctrl+C to stop'));\n console.log();\n\n // Auto-open browser\n if (options.open !== false) {\n setTimeout(() => openBrowser(url), 500);\n }\n\n // Handle graceful shutdown\n const shutdown = async (signal: string) => {\n console.log();\n info(`Shutting down...`);\n await server.close();\n success('Goodbye!');\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 studio: ${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","import { Command } from 'commander';\nimport ora from 'ora';\nimport chalk from 'chalk';\nimport { getAether, closeAether } from '../utils/aether.js';\nimport { error, info, success } from '../utils/output.js';\nimport type { Trajectory, TrajectoryStatus, TrajectoryOutcome } from 'aether-core';\n\nfunction formatTrajectory(traj: Trajectory, verbose = false): string {\n const lines: string[] = [];\n\n const statusColor =\n traj.status === 'active' ? chalk.blue : traj.status === 'completed' ? chalk.green : chalk.gray;\n const outcomeColor =\n traj.outcome === 'success'\n ? chalk.green\n : traj.outcome === 'failure'\n ? chalk.red\n : traj.outcome === 'partial'\n ? chalk.yellow\n : chalk.gray;\n\n lines.push(\n chalk.cyan(`[${traj.id.slice(0, 12)}]`) +\n ' ' +\n statusColor(`[${traj.status}]`) +\n (traj.outcome ? ' ' + outcomeColor(`(${traj.outcome})`) : '')\n );\n\n lines.push(chalk.yellow(` Actor: ${traj.actor}`));\n lines.push(chalk.gray(` Started: ${new Date(traj.startTime).toLocaleString()}`));\n if (traj.endTime) {\n lines.push(chalk.gray(` Ended: ${new Date(traj.endTime).toLocaleString()}`));\n }\n lines.push(chalk.white(` Events: ${traj.events.length}`));\n\n if (verbose && Object.keys(traj.context).length > 0) {\n lines.push(chalk.gray(` Context: ${JSON.stringify(traj.context)}`));\n }\n\n return lines.join('\\n');\n}\n\nfunction formatTrajectories(trajectories: Trajectory[], verbose = false): string {\n if (trajectories.length === 0) {\n return chalk.gray('No trajectories found.');\n }\n\n return trajectories.map((t) => formatTrajectory(t, verbose)).join('\\n\\n');\n}\n\nexport const trajectoryCommand = new Command('trajectory')\n .description('Manage trajectories (agent reasoning paths)')\n .alias('traj');\n\n// Start a new trajectory\ntrajectoryCommand\n .command('start')\n .description('Start a new trajectory')\n .argument('<actor>', 'Actor for the trajectory')\n .option('-c, --context <json>', 'Context JSON')\n .action(async (actor: string, options) => {\n const spinner = ora('Starting trajectory...').start();\n\n try {\n const aether = await getAether();\n\n let context: Record<string, unknown> | undefined;\n if (options.context) {\n try {\n context = JSON.parse(options.context);\n } catch {\n spinner.fail('Invalid JSON for context');\n return;\n }\n }\n\n const trajectoryId = await aether.startTrajectory(actor, context);\n\n spinner.stop();\n success(`Trajectory started: ${trajectoryId}`);\n console.log(chalk.gray('Save this ID to add events and end the trajectory.'));\n } catch (err) {\n spinner.fail('Failed to start trajectory');\n error(String(err));\n } finally {\n await closeAether();\n }\n });\n\n// End a trajectory\ntrajectoryCommand\n .command('end')\n .description('End an active trajectory')\n .argument('<id>', 'Trajectory ID')\n .option('-o, --outcome <outcome>', 'Outcome: success, failure, partial')\n .action(async (id: string, options) => {\n const spinner = ora('Ending trajectory...').start();\n\n try {\n const aether = await getAether();\n\n const outcome = options.outcome as TrajectoryOutcome | undefined;\n const trajectory = await aether.endTrajectory(id, outcome);\n\n spinner.stop();\n success(`Trajectory ended`);\n console.log(formatTrajectory(trajectory, true));\n } catch (err) {\n spinner.fail('Failed to end trajectory');\n error(String(err));\n } finally {\n await closeAether();\n }\n });\n\n// Get a trajectory\ntrajectoryCommand\n .command('get')\n .description('Get trajectory details')\n .argument('<id>', 'Trajectory ID')\n .option('-v, --verbose', 'Show detailed output', false)\n .option('-e, --events', 'Include event details', false)\n .action(async (id: string, options) => {\n const spinner = ora('Fetching trajectory...').start();\n\n try {\n const aether = await getAether();\n\n const trajectory = await aether.getTrajectory(id);\n\n if (!trajectory) {\n spinner.fail('Trajectory not found');\n return;\n }\n\n spinner.stop();\n console.log(formatTrajectory(trajectory, options.verbose));\n\n if (options.events) {\n const events = await aether.getTrajectoryEvents(id);\n console.log('\\n' + chalk.bold('Events:'));\n for (const event of events) {\n console.log(\n chalk.gray(' - ') +\n chalk.cyan(event.id.slice(0, 8)) +\n ' ' +\n chalk.yellow(event.action) +\n ': ' +\n chalk.white(event.content.slice(0, 60) + (event.content.length > 60 ? '...' : ''))\n );\n }\n }\n } catch (err) {\n spinner.fail('Failed to fetch trajectory');\n error(String(err));\n } finally {\n await closeAether();\n }\n });\n\n// List trajectories\ntrajectoryCommand\n .command('list')\n .description('List trajectories for an actor')\n .argument('<actor>', 'Actor to list trajectories for')\n .option('-s, --status <status>', 'Filter by status: active, completed, abandoned')\n .option('-o, --outcome <outcome>', 'Filter by outcome: success, failure, partial')\n .option('-l, --limit <n>', 'Maximum trajectories', '20')\n .option('-v, --verbose', 'Show detailed output', false)\n .action(async (actor: string, options) => {\n const spinner = ora(`Fetching trajectories for ${actor}...`).start();\n\n try {\n const aether = await getAether();\n\n const status = options.status ? ([options.status] as TrajectoryStatus[]) : undefined;\n const outcome = options.outcome ? ([options.outcome] as TrajectoryOutcome[]) : undefined;\n\n const trajectories = await aether.getTrajectories({\n actor,\n status,\n outcome,\n limit: parseInt(options.limit, 10),\n });\n\n spinner.stop();\n info(`Found ${trajectories.length} trajectories for ${actor}`);\n console.log();\n console.log(formatTrajectories(trajectories, options.verbose));\n } catch (err) {\n spinner.fail('Failed to fetch trajectories');\n error(String(err));\n } finally {\n await closeAether();\n }\n });\n\n// Infer trajectories\ntrajectoryCommand\n .command('infer')\n .description('Auto-infer trajectories from events')\n .argument('<actor>', 'Actor to infer trajectories for')\n .option('-g, --gap <ms>', 'Max gap between events (ms)', '1800000')\n .option('-m, --min-events <n>', 'Minimum events per trajectory', '2')\n .option('-v, --verbose', 'Show detailed output', false)\n .action(async (actor: string, options) => {\n const spinner = ora(`Inferring trajectories for ${actor}...`).start();\n\n try {\n const aether = await getAether();\n\n const trajectories = await aether.inferTrajectories(actor, {\n maxGapMs: parseInt(options.gap, 10),\n minEvents: parseInt(options.minEvents, 10),\n });\n\n spinner.stop();\n success(`Inferred ${trajectories.length} trajectories`);\n console.log();\n console.log(formatTrajectories(trajectories, options.verbose));\n } catch (err) {\n spinner.fail('Failed to infer trajectories');\n error(String(err));\n } finally {\n await closeAether();\n }\n });\n\n// Get trajectory stats\ntrajectoryCommand\n .command('stats')\n .description('Get trajectory statistics for an actor')\n .argument('<actor>', 'Actor to get stats for')\n .action(async (actor: string) => {\n const spinner = ora(`Fetching trajectory stats for ${actor}...`).start();\n\n try {\n const aether = await getAether();\n\n const stats = await aether.getTrajectoryStats(actor);\n\n spinner.stop();\n console.log(chalk.bold(`Trajectory Statistics for ${actor}`));\n console.log(chalk.gray('─'.repeat(40)));\n console.log(`${chalk.cyan('Total')}: ${stats.total}`);\n console.log(`${chalk.cyan('By Status')}:`);\n console.log(` Active: ${stats.byStatus.active}`);\n console.log(` Completed: ${stats.byStatus.completed}`);\n console.log(` Abandoned: ${stats.byStatus.abandoned}`);\n console.log(`${chalk.cyan('By Outcome')}:`);\n console.log(` Success: ${chalk.green(stats.byOutcome.success)}`);\n console.log(` Failure: ${chalk.red(stats.byOutcome.failure)}`);\n console.log(` Partial: ${chalk.yellow(stats.byOutcome.partial)}`);\n console.log(`${chalk.cyan('Avg Events')}: ${stats.avgEvents.toFixed(1)}`);\n console.log(`${chalk.cyan('Avg Duration')}: ${(stats.avgDurationMs / 1000).toFixed(1)}s`);\n console.log(`${chalk.cyan('Success Rate')}: ${(stats.successRate * 100).toFixed(1)}%`);\n } catch (err) {\n spinner.fail('Failed to fetch trajectory stats');\n error(String(err));\n } finally {\n await closeAether();\n }\n });\n","import { Command } from 'commander';\nimport ora from 'ora';\nimport chalk from 'chalk';\nimport { getAether, closeAether } from '../utils/aether.js';\nimport { error, info, warn } from '../utils/output.js';\nimport type { Pattern, Anomaly, Prediction, TransitionMatrix } from 'aether-core';\n\nfunction formatPattern(pattern: Pattern): string {\n const lines: string[] = [];\n\n lines.push(chalk.cyan(`[${pattern.id}]`) + ' ' + chalk.white(pattern.sequence.join(' → ')));\n lines.push(\n chalk.gray(` Frequency: ${pattern.frequency}`) +\n chalk.gray(` | Confidence: ${(pattern.confidence * 100).toFixed(0)}%`) +\n chalk.gray(` | Support: ${(pattern.support * 100).toFixed(0)}%`)\n );\n\n if (pattern.avgDurationMs) {\n lines.push(chalk.gray(` Avg Duration: ${(pattern.avgDurationMs / 1000).toFixed(1)}s`));\n }\n\n return lines.join('\\n');\n}\n\nfunction formatAnomaly(anomaly: Anomaly): string {\n const lines: string[] = [];\n\n const severityColor =\n anomaly.severity === 'high'\n ? chalk.red\n : anomaly.severity === 'medium'\n ? chalk.yellow\n : chalk.gray;\n\n lines.push(\n severityColor(`[${anomaly.severity.toUpperCase()}]`) +\n ' ' +\n chalk.cyan(`Event: ${anomaly.eventId.slice(0, 8)}`)\n );\n lines.push(chalk.white(` ${anomaly.reason}`));\n lines.push(\n chalk.gray(` Expected: ${anomaly.expectedAction}`) +\n chalk.gray(` | Deviation: ${(anomaly.deviationScore * 100).toFixed(0)}%`)\n );\n\n return lines.join('\\n');\n}\n\nfunction formatPrediction(pred: Prediction): string {\n const prob = pred.probability * 100;\n const bar = '█'.repeat(Math.floor(prob / 5)) + '░'.repeat(20 - Math.floor(prob / 5));\n\n return (\n chalk.cyan(pred.action.padEnd(15)) +\n chalk.gray(` [${bar}] `) +\n chalk.white(`${prob.toFixed(0)}%`) +\n (pred.suggestedContent ? chalk.gray(` - ${pred.suggestedContent}`) : '')\n );\n}\n\nfunction formatTransitionMatrix(matrix: TransitionMatrix): string {\n const lines: string[] = [];\n\n lines.push(chalk.bold('Transition Probabilities'));\n lines.push(chalk.gray('─'.repeat(60)));\n\n const maxActionLen = Math.max(...matrix.actions.map((a) => a.length));\n\n for (let i = 0; i < matrix.actions.length; i++) {\n const from = matrix.actions[i].padEnd(maxActionLen);\n const probs = matrix.probabilities[i];\n\n // Find top 3 transitions\n const indexed = probs.map((p, j) => ({ action: matrix.actions[j], prob: p }));\n const top = indexed.filter((x) => x.prob > 0).sort((a, b) => b.prob - a.prob).slice(0, 3);\n\n if (top.length === 0) continue;\n\n const transitions = top\n .map((t) => `${t.action} (${(t.prob * 100).toFixed(0)}%)`)\n .join(', ');\n\n lines.push(chalk.yellow(from) + chalk.gray(' → ') + chalk.white(transitions));\n }\n\n lines.push(chalk.gray(`\\nTotal transitions: ${matrix.totalTransitions}`));\n\n return lines.join('\\n');\n}\n\nexport const patternsCommand = new Command('patterns')\n .description('Pattern detection and prediction')\n .alias('pat');\n\n// Detect patterns\npatternsCommand\n .command('detect')\n .description('Detect behavioral patterns for an actor')\n .argument('<actor>', 'Actor to detect patterns for')\n .option('-f, --min-frequency <n>', 'Minimum pattern frequency', '2')\n .option('-c, --min-confidence <n>', 'Minimum confidence (0-1)', '0.5')\n .option('-l, --limit <n>', 'Maximum patterns to return', '20')\n .action(async (actor: string, options) => {\n const spinner = ora(`Detecting patterns for ${actor}...`).start();\n\n try {\n const aether = await getAether();\n\n const patterns = await aether.detectPatterns(actor, {\n minFrequency: parseInt(options.minFrequency, 10),\n minConfidence: parseFloat(options.minConfidence),\n });\n\n spinner.stop();\n\n if (patterns.length === 0) {\n info(`No patterns found for ${actor}`);\n return;\n }\n\n info(`Found ${patterns.length} patterns for ${actor}`);\n console.log();\n for (const pattern of patterns.slice(0, parseInt(options.limit, 10))) {\n console.log(formatPattern(pattern));\n console.log();\n }\n } catch (err) {\n spinner.fail('Failed to detect patterns');\n error(String(err));\n } finally {\n await closeAether();\n }\n });\n\n// Find anomalies\npatternsCommand\n .command('anomalies')\n .description('Find behavioral anomalies for an actor')\n .argument('<actor>', 'Actor to find anomalies for')\n .option('-s, --severity <level>', 'Filter by severity: low, medium, high')\n .option('-m, --min-deviation <n>', 'Minimum deviation score (0-1)', '0.3')\n .option('-l, --limit <n>', 'Maximum anomalies to return', '20')\n .action(async (actor: string, options) => {\n const spinner = ora(`Finding anomalies for ${actor}...`).start();\n\n try {\n const aether = await getAether();\n\n const anomalies = await aether.findAnomalies(actor, {\n minDeviationScore: parseFloat(options.minDeviation),\n severities: options.severity ? [options.severity] : undefined,\n limit: parseInt(options.limit, 10),\n });\n\n spinner.stop();\n\n if (anomalies.length === 0) {\n info(`No anomalies found for ${actor}`);\n return;\n }\n\n const highCount = anomalies.filter((a) => a.severity === 'high').length;\n if (highCount > 0) {\n warn(`Found ${highCount} high-severity anomalies!`);\n }\n\n info(`Found ${anomalies.length} anomalies for ${actor}`);\n console.log();\n for (const anomaly of anomalies) {\n console.log(formatAnomaly(anomaly));\n console.log();\n }\n } catch (err) {\n spinner.fail('Failed to find anomalies');\n error(String(err));\n } finally {\n await closeAether();\n }\n });\n\n// Get transition probabilities\npatternsCommand\n .command('transitions')\n .description('Get action transition probabilities for an actor')\n .argument('<actor>', 'Actor to get transitions for')\n .action(async (actor: string) => {\n const spinner = ora(`Computing transitions for ${actor}...`).start();\n\n try {\n const aether = await getAether();\n\n const matrix = await aether.getTransitionProbabilities(actor);\n\n spinner.stop();\n console.log(formatTransitionMatrix(matrix));\n } catch (err) {\n spinner.fail('Failed to compute transitions');\n error(String(err));\n } finally {\n await closeAether();\n }\n });\n\n// Predict next actions\npatternsCommand\n .command('predict')\n .description('Predict next actions from an event')\n .argument('<actor>', 'Actor')\n .argument('<event-id>', 'Current event ID')\n .option('-k, --top-k <n>', 'Number of predictions', '5')\n .action(async (actor: string, eventId: string, options) => {\n const spinner = ora('Predicting next actions...').start();\n\n try {\n const aether = await getAether();\n\n const predictions = await aether.predictNext(actor, eventId, {\n topK: parseInt(options.topK, 10),\n });\n\n spinner.stop();\n\n if (predictions.length === 0) {\n info('No predictions available');\n return;\n }\n\n console.log(chalk.bold('Predicted Next Actions:'));\n console.log(chalk.gray('─'.repeat(50)));\n for (const pred of predictions) {\n console.log(formatPrediction(pred));\n }\n } catch (err) {\n spinner.fail('Failed to predict');\n error(String(err));\n } finally {\n await closeAether();\n }\n });\n\n// Simulate an action\npatternsCommand\n .command('simulate')\n .description('Simulate a proposed action')\n .argument('<actor>', 'Actor')\n .argument('<action>', 'Proposed action')\n .option('-e, --event-id <id>', 'Current event ID')\n .option('-c, --context <json>', 'Context JSON')\n .action(async (actor: string, action: string, options) => {\n const spinner = ora('Running simulation...').start();\n\n try {\n const aether = await getAether();\n\n let context: Record<string, unknown> | undefined;\n if (options.context) {\n try {\n context = JSON.parse(options.context);\n } catch {\n spinner.fail('Invalid JSON for context');\n return;\n }\n }\n\n const result = await aether.simulate(actor, action, {\n currentEventId: options.eventId,\n context,\n });\n\n spinner.stop();\n\n console.log(chalk.bold('Simulation Result'));\n console.log(chalk.gray('─'.repeat(40)));\n console.log(`${chalk.cyan('Proposed Action')}: ${result.proposedAction}`);\n\n const outcomeColor =\n result.likelyOutcome === 'success'\n ? chalk.green\n : result.likelyOutcome === 'failure'\n ? chalk.red\n : chalk.yellow;\n console.log(`${chalk.cyan('Likely Outcome')}: ${outcomeColor(result.likelyOutcome)}`);\n console.log(`${chalk.cyan('Confidence')}: ${(result.confidence * 100).toFixed(0)}%`);\n\n if (result.similarPastCases.length > 0) {\n console.log(`\\n${chalk.bold('Similar Past Cases')}:`);\n for (const c of result.similarPastCases.slice(0, 3)) {\n const caseOutcome =\n c.outcome === 'success'\n ? chalk.green(c.outcome)\n : c.outcome === 'failure'\n ? chalk.red(c.outcome)\n : chalk.yellow(c.outcome);\n console.log(\n chalk.gray(' - ') +\n chalk.cyan(c.trajectoryId.slice(0, 12)) +\n ` → ${caseOutcome}` +\n chalk.gray(` (${(c.similarity * 100).toFixed(0)}% similar)`)\n );\n }\n }\n\n if (result.riskAssessment) {\n const riskColor =\n result.riskAssessment.level === 'high'\n ? chalk.red\n : result.riskAssessment.level === 'medium'\n ? chalk.yellow\n : chalk.green;\n console.log(`\\n${chalk.bold('Risk Assessment')}: ${riskColor(result.riskAssessment.level)}`);\n for (const risk of result.riskAssessment.risks) {\n console.log(\n chalk.gray(' - ') +\n risk.description +\n chalk.gray(` (${(risk.probability * 100).toFixed(0)}%)`)\n );\n }\n }\n\n if (result.predictedFollowUp.length > 0) {\n console.log(`\\n${chalk.bold('Predicted Follow-up')}:`);\n for (const pred of result.predictedFollowUp.slice(0, 3)) {\n console.log(formatPrediction(pred));\n }\n }\n } catch (err) {\n spinner.fail('Simulation failed');\n error(String(err));\n } finally {\n await closeAether();\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","chalk","InMemoryStorageAdapter","VoyageProvider","MockEmbeddingProvider","createServer","Command","chalk","VoyageProvider","MockEmbeddingProvider","InMemoryStorageAdapter","createServer","Command","ora","Command","ora","Command","writeFileSync","ora","Command","ora","writeFileSync","Command","chalk","Command","chalk","Command","Command","Command","ora","chalk","chalk","Command","ora","Command","ora","chalk","chalk","Command","ora","Command"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "aether-cli",
3
- "version": "0.1.0",
3
+ "version": "1.0.0",
4
4
  "description": "CLI for Aether Memory Framework",
5
5
  "type": "module",
6
6
  "bin": {
@@ -16,8 +16,8 @@
16
16
  "chalk": "^5.3.0",
17
17
  "ora": "^8.0.0",
18
18
  "inquirer": "^9.2.0",
19
- "aether-core": "0.1.0",
20
- "aether-server": "0.1.0"
19
+ "aether-core": "1.0.0",
20
+ "aether-server": "1.0.0"
21
21
  },
22
22
  "devDependencies": {
23
23
  "@types/inquirer": "^9.0.0",