anantham-v2 2.0.1 → 2.0.3

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.
Files changed (66) hide show
  1. package/dist/bin/anantham.js +12 -1
  2. package/dist/bin/anantham.js.map +1 -1
  3. package/dist/cli/command-parser.d.ts +5 -0
  4. package/dist/cli/command-parser.d.ts.map +1 -1
  5. package/dist/cli/command-parser.js +40 -9
  6. package/dist/cli/command-parser.js.map +1 -1
  7. package/dist/cli/command-registry.d.ts +8 -0
  8. package/dist/cli/command-registry.d.ts.map +1 -1
  9. package/dist/cli/command-registry.js +425 -4
  10. package/dist/cli/command-registry.js.map +1 -1
  11. package/dist/cli/error-handler.d.ts.map +1 -1
  12. package/dist/cli/error-handler.js +55 -1
  13. package/dist/cli/error-handler.js.map +1 -1
  14. package/dist/domain/tui.d.ts +1 -1
  15. package/dist/domain/tui.d.ts.map +1 -1
  16. package/dist/domain/tui.js +1 -0
  17. package/dist/domain/tui.js.map +1 -1
  18. package/dist/models/adapters/openai-compatible-adapter.d.ts.map +1 -1
  19. package/dist/models/adapters/openai-compatible-adapter.js +2 -1
  20. package/dist/models/adapters/openai-compatible-adapter.js.map +1 -1
  21. package/dist/models/provider-registry.d.ts +2 -2
  22. package/dist/persistence/index.d.ts +2 -0
  23. package/dist/persistence/index.d.ts.map +1 -1
  24. package/dist/persistence/index.js +2 -0
  25. package/dist/persistence/index.js.map +1 -1
  26. package/dist/persistence/token-metrics-manager.d.ts +88 -0
  27. package/dist/persistence/token-metrics-manager.d.ts.map +1 -0
  28. package/dist/persistence/token-metrics-manager.js +272 -0
  29. package/dist/persistence/token-metrics-manager.js.map +1 -0
  30. package/dist/persistence/user-config-manager.d.ts +40 -0
  31. package/dist/persistence/user-config-manager.d.ts.map +1 -0
  32. package/dist/persistence/user-config-manager.js +175 -0
  33. package/dist/persistence/user-config-manager.js.map +1 -0
  34. package/dist/tui/ansi-gradient.d.ts +43 -0
  35. package/dist/tui/ansi-gradient.d.ts.map +1 -0
  36. package/dist/tui/ansi-gradient.js +131 -0
  37. package/dist/tui/ansi-gradient.js.map +1 -0
  38. package/dist/tui/command-palette.d.ts +20 -0
  39. package/dist/tui/command-palette.d.ts.map +1 -0
  40. package/dist/tui/command-palette.js +241 -0
  41. package/dist/tui/command-palette.js.map +1 -0
  42. package/dist/tui/terminal-layout.d.ts +4 -0
  43. package/dist/tui/terminal-layout.d.ts.map +1 -1
  44. package/dist/tui/terminal-layout.js +42 -4
  45. package/dist/tui/terminal-layout.js.map +1 -1
  46. package/dist/tui/token-dashboard-renderer.d.ts +6 -0
  47. package/dist/tui/token-dashboard-renderer.d.ts.map +1 -0
  48. package/dist/tui/token-dashboard-renderer.js +115 -0
  49. package/dist/tui/token-dashboard-renderer.js.map +1 -0
  50. package/dist/tui/tui-application.d.ts +7 -0
  51. package/dist/tui/tui-application.d.ts.map +1 -1
  52. package/dist/tui/tui-application.js +110 -5
  53. package/dist/tui/tui-application.js.map +1 -1
  54. package/dist/tui/tui-controller.d.ts +78 -2
  55. package/dist/tui/tui-controller.d.ts.map +1 -1
  56. package/dist/tui/tui-controller.js +564 -24
  57. package/dist/tui/tui-controller.js.map +1 -1
  58. package/dist/tui/tui-renderer.d.ts +12 -1
  59. package/dist/tui/tui-renderer.d.ts.map +1 -1
  60. package/dist/tui/tui-renderer.js +104 -40
  61. package/dist/tui/tui-renderer.js.map +1 -1
  62. package/dist/tui/tui-sanitizer.d.ts +4 -0
  63. package/dist/tui/tui-sanitizer.d.ts.map +1 -1
  64. package/dist/tui/tui-sanitizer.js +6 -0
  65. package/dist/tui/tui-sanitizer.js.map +1 -1
  66. package/package.json +1 -1
@@ -3,7 +3,18 @@ import path from "node:path";
3
3
  import { CliApplication } from "../cli/cli-application.js";
4
4
  import { TuiApplication } from "../tui/tui-application.js";
5
5
  import { ApiServer } from "../api/api-server.js";
6
+ import { UserConfigManager } from "../persistence/user-config-manager.js";
6
7
  async function main() {
8
+ try {
9
+ if (typeof process.loadEnvFile === "function") {
10
+ process.loadEnvFile();
11
+ }
12
+ }
13
+ catch { }
14
+ try {
15
+ UserConfigManager.getInstance().syncAllToProcessEnv();
16
+ }
17
+ catch { }
7
18
  const args = process.argv.slice(2);
8
19
  let dbPath = path.join(process.cwd(), ".anantham", "anantham.db");
9
20
  let outputMode = "text";
@@ -63,7 +74,7 @@ Options:
63
74
  process.exit(0);
64
75
  }
65
76
  else if (arg === "--version" || arg === "-v") {
66
- console.log("2.0.0-alpha.1");
77
+ console.log("2.0.3");
67
78
  process.exit(0);
68
79
  }
69
80
  else if (!arg.startsWith("-") && !executeCmd) {
@@ -1 +1 @@
1
- {"version":3,"file":"anantham.js","sourceRoot":"","sources":["../../src/bin/anantham.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"anantham.js","sourceRoot":"","sources":["../../src/bin/anantham.ts"],"names":[],"mappings":"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"}
@@ -1,3 +1,4 @@
1
+ import { z } from "zod";
1
2
  import { type ParsedCommand } from "../domain/cli.js";
2
3
  /**
3
4
  * Command Parser & Tokenizer.
@@ -5,6 +6,10 @@ import { type ParsedCommand } from "../domain/cli.js";
5
6
  * PRD Part 2 Section 170–175.
6
7
  */
7
8
  export declare class CommandParser {
9
+ /**
10
+ * Format a Zod validation error into a clean, single-line human-readable string.
11
+ */
12
+ static formatZodError(error: z.ZodError): string;
8
13
  /**
9
14
  * Parse a raw command string.
10
15
  */
@@ -1 +1 @@
1
- {"version":3,"file":"command-parser.d.ts","sourceRoot":"","sources":["../../src/cli/command-parser.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,aAAa,EAAuB,MAAM,kBAAkB,CAAC;AAE3E;;;;GAIG;AACH,qBAAa,aAAa;IACxB;;OAEG;IACI,KAAK,CAAC,QAAQ,EAAE,MAAM,GAAG,aAAa;IAmE7C;;OAEG;IACH,OAAO,CAAC,QAAQ;IAqDhB,OAAO,CAAC,WAAW;CASpB"}
1
+ {"version":3,"file":"command-parser.d.ts","sourceRoot":"","sources":["../../src/cli/command-parser.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,KAAK,aAAa,EAAuB,MAAM,kBAAkB,CAAC;AAE3E;;;;GAIG;AACH,qBAAa,aAAa;IACxB;;OAEG;WACW,cAAc,CAAC,KAAK,EAAE,CAAC,CAAC,QAAQ,GAAG,MAAM;IAgBvD;;OAEG;IACI,KAAK,CAAC,QAAQ,EAAE,MAAM,GAAG,aAAa;IA+E7C;;OAEG;IACH,OAAO,CAAC,QAAQ;IAqDhB,OAAO,CAAC,WAAW;CASpB"}
@@ -1,3 +1,4 @@
1
+ import { z } from "zod";
1
2
  import { ParsedCommandSchema } from "../domain/cli.js";
2
3
  /**
3
4
  * Command Parser & Tokenizer.
@@ -5,6 +6,24 @@ import { ParsedCommandSchema } from "../domain/cli.js";
5
6
  * PRD Part 2 Section 170–175.
6
7
  */
7
8
  export class CommandParser {
9
+ /**
10
+ * Format a Zod validation error into a clean, single-line human-readable string.
11
+ */
12
+ static formatZodError(error) {
13
+ const messages = error.issues.map((issue) => {
14
+ const field = issue.path.length > 0 ? `${issue.path.join(".")}: ` : "";
15
+ if (issue.code === "invalid_union" && Array.isArray(issue.unionErrors)) {
16
+ const branchMessages = issue.unionErrors
17
+ .flatMap((subErr) => (subErr.issues ?? []).map((subIssue) => subIssue.message))
18
+ .filter(Boolean);
19
+ if (branchMessages.length > 0) {
20
+ return `${field}Invalid input: ${branchMessages.join(" OR ")}`;
21
+ }
22
+ }
23
+ return `${field}${issue.message}`;
24
+ });
25
+ return `Command validation failed: ${messages.join("; ")}`;
26
+ }
8
27
  /**
9
28
  * Parse a raw command string.
10
29
  */
@@ -22,8 +41,12 @@ export class CommandParser {
22
41
  throw new Error("No command tokens found.");
23
42
  }
24
43
  const firstToken = tokens[0];
25
- const isSlashCommand = firstToken.startsWith("/");
26
- const commandName = isSlashCommand ? firstToken.slice(1).toLowerCase() : firstToken.toLowerCase();
44
+ const isSlashCommand = firstToken.startsWith("/") || firstToken.startsWith(":");
45
+ const rawName = isSlashCommand ? firstToken.replace(/^[/:]+/, "").toLowerCase() : firstToken.toLowerCase();
46
+ const commandName = rawName.trim();
47
+ if (!commandName) {
48
+ throw new Error("Empty command input.");
49
+ }
27
50
  const args = [];
28
51
  const options = {};
29
52
  for (let i = 1; i < tokens.length; i++) {
@@ -64,13 +87,21 @@ export class CommandParser {
64
87
  args.push(token);
65
88
  }
66
89
  }
67
- return ParsedCommandSchema.parse({
68
- raw: trimmed,
69
- name: commandName,
70
- args,
71
- options,
72
- isSlashCommand,
73
- });
90
+ try {
91
+ return ParsedCommandSchema.parse({
92
+ raw: trimmed,
93
+ name: commandName,
94
+ args,
95
+ options,
96
+ isSlashCommand,
97
+ });
98
+ }
99
+ catch (err) {
100
+ if (err instanceof z.ZodError) {
101
+ throw new Error(CommandParser.formatZodError(err));
102
+ }
103
+ throw err;
104
+ }
74
105
  }
75
106
  /**
76
107
  * Safe tokenizer handling double and single quotes.
@@ -1 +1 @@
1
- {"version":3,"file":"command-parser.js","sourceRoot":"","sources":["../../src/cli/command-parser.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"command-parser.js","sourceRoot":"","sources":["../../src/cli/command-parser.ts"],"names":[],"mappings":"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"}
@@ -10,6 +10,7 @@ import { SessionResumeEngine } from "../resume/session-resume-engine.js";
10
10
  import { ToolRegistry } from "../tools/tool-registry.js";
11
11
  import { PolicyEngine } from "../policy/policy-engine.js";
12
12
  import { TaskClaimManager } from "../tasks/task-claim-manager.js";
13
+ import { UserConfigManager } from "../persistence/user-config-manager.js";
13
14
  export type CommandHandler = (cmd: ParsedCommand, controller: SessionController) => Promise<CommandExecutionResult> | CommandExecutionResult;
14
15
  export interface CommandRegistryOptions {
15
16
  sessionController: SessionController;
@@ -24,6 +25,13 @@ export interface CommandRegistryOptions {
24
25
  claimManager?: TaskClaimManager;
25
26
  errorHandler?: CliErrorHandler;
26
27
  }
28
+ export interface ModelEntry {
29
+ id: string;
30
+ provider: string;
31
+ isCustom?: boolean;
32
+ }
33
+ export declare const CURATED_MODELS_BY_PROVIDER: Record<string, string[]>;
34
+ export declare function getNumberedModelList(configMgr: UserConfigManager): ModelEntry[];
27
35
  /**
28
36
  * Command Registry & Execution Dispatcher.
29
37
  * PRD Part 2 Section 170–175.
@@ -1 +1 @@
1
- {"version":3,"file":"command-registry.d.ts","sourceRoot":"","sources":["../../src/cli/command-registry.ts"],"names":[],"mappings":"AACA,OAAO,EACL,KAAK,aAAa,EAClB,KAAK,iBAAiB,EACtB,KAAK,sBAAsB,EAC5B,MAAM,kBAAkB,CAAC;AAG1B,OAAO,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAC;AAC5D,OAAO,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AAGrD,OAAO,EAAE,iBAAiB,EAAE,MAAM,mDAAmD,CAAC;AACtF,OAAO,EAAE,cAAc,EAAE,MAAM,gDAAgD,CAAC;AAChF,OAAO,EAAE,kBAAkB,EAAE,MAAM,oDAAoD,CAAC;AACxF,OAAO,EAAE,UAAU,EAAE,MAAM,+BAA+B,CAAC;AAC3D,OAAO,EAAE,YAAY,EAAE,MAAM,iCAAiC,CAAC;AAC/D,OAAO,EAAE,mBAAmB,EAAE,MAAM,oCAAoC,CAAC;AACzE,OAAO,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAC;AACzD,OAAO,EAAE,YAAY,EAAE,MAAM,4BAA4B,CAAC;AAC1D,OAAO,EAAE,gBAAgB,EAAE,MAAM,gCAAgC,CAAC;AAIlE,MAAM,MAAM,cAAc,GAAG,CAC3B,GAAG,EAAE,aAAa,EAClB,UAAU,EAAE,iBAAiB,KAC1B,OAAO,CAAC,sBAAsB,CAAC,GAAG,sBAAsB,CAAC;AAE9D,MAAM,WAAW,sBAAsB;IACrC,iBAAiB,EAAE,iBAAiB,CAAC;IACrC,WAAW,EAAE,iBAAiB,CAAC;IAC/B,QAAQ,EAAE,cAAc,CAAC;IACzB,YAAY,CAAC,EAAE,kBAAkB,CAAC;IAClC,UAAU,CAAC,EAAE,UAAU,CAAC;IACxB,MAAM,CAAC,EAAE,YAAY,CAAC;IACtB,YAAY,CAAC,EAAE,mBAAmB,CAAC;IACnC,YAAY,CAAC,EAAE,YAAY,CAAC;IAC5B,YAAY,CAAC,EAAE,YAAY,CAAC;IAC5B,YAAY,CAAC,EAAE,gBAAgB,CAAC;IAChC,YAAY,CAAC,EAAE,eAAe,CAAC;CAChC;AAED;;;GAGG;AACH,qBAAa,eAAe;IAC1B,OAAO,CAAC,WAAW,CAA6C;IAChE,OAAO,CAAC,QAAQ,CAA0C;IAC1D,OAAO,CAAC,QAAQ,CAAC,iBAAiB,CAAoB;IACtD,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAoB;IAChD,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAiB;IAC1C,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAqB;IACnD,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAa;IACzC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAe;IACvC,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAsB;IACpD,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAe;IAC7C,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAe;IAC7C,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAmB;IACjD,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAkB;gBAEnC,OAAO,EAAE,sBAAsB;IAgBpC,eAAe,CAAC,UAAU,EAAE,iBAAiB,EAAE,OAAO,EAAE,cAAc,GAAG,IAAI;IAS7E,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,iBAAiB,GAAG,SAAS;IAI1D,eAAe,IAAI,iBAAiB,EAAE;IAI7C;;OAEG;IACU,OAAO,CAAC,GAAG,EAAE,aAAa,GAAG,OAAO,CAAC,sBAAsB,CAAC;IAgBzE;;OAEG;IACH,OAAO,CAAC,uBAAuB;CA8jBhC"}
1
+ {"version":3,"file":"command-registry.d.ts","sourceRoot":"","sources":["../../src/cli/command-registry.ts"],"names":[],"mappings":"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"}
@@ -2,6 +2,83 @@ import { randomUUID } from "node:crypto";
2
2
  import { CliErrorHandler } from "./error-handler.js";
3
3
  import { ProjectDeletionSafetyManager } from "../workspace/project-deletion-safety.js";
4
4
  import { SlashMigrateCommand } from "./slash-migrate.js";
5
+ import { maskSecret } from "../models/secret-store.js";
6
+ import { UserConfigManager } from "../persistence/user-config-manager.js";
7
+ import { TokenMetricsManager } from "../persistence/token-metrics-manager.js";
8
+ export const CURATED_MODELS_BY_PROVIDER = {
9
+ openrouter: [
10
+ "openrouter/anthropic/claude-3.5-sonnet",
11
+ "openrouter/deepseek/deepseek-r1",
12
+ "openrouter/openai/gpt-4o",
13
+ "openrouter/google/gemini-2.5-pro",
14
+ "openrouter/meta-llama/llama-3.3-70b-instruct",
15
+ "openrouter/qwen/qwen-2.5-coder-32b-instruct",
16
+ ],
17
+ anthropic: [
18
+ "claude-3-5-sonnet-20241022",
19
+ "claude-3-5-haiku-20241022",
20
+ "claude-3-opus-20240229",
21
+ ],
22
+ openai: [
23
+ "gpt-4o",
24
+ "gpt-4o-mini",
25
+ "o1",
26
+ "o3-mini",
27
+ ],
28
+ gemini: [
29
+ "gemini-2.5-pro",
30
+ "gemini-2.5-flash",
31
+ "gemini-2.0-flash-thinking-exp",
32
+ ],
33
+ groq: [
34
+ "groq/llama-3.3-70b-versatile",
35
+ "groq/deepseek-r1-distill-llama-70b",
36
+ ],
37
+ deepseek: [
38
+ "deepseek-chat",
39
+ "deepseek-reasoner",
40
+ ],
41
+ ollama: [
42
+ "ollama/llama3.2",
43
+ "ollama/mistral",
44
+ "ollama/qwen2.5-coder",
45
+ ],
46
+ };
47
+ export function getNumberedModelList(configMgr) {
48
+ const result = [];
49
+ const configuredProviders = configMgr
50
+ .listKeys()
51
+ .filter((k) => k.configured)
52
+ .map((k) => k.provider);
53
+ // 1. Prioritize models for configured providers
54
+ for (const prov of configuredProviders) {
55
+ const list = CURATED_MODELS_BY_PROVIDER[prov] || [];
56
+ for (const id of list) {
57
+ if (!result.some((r) => r.id === id)) {
58
+ result.push({ id, provider: prov });
59
+ }
60
+ }
61
+ }
62
+ // 2. Custom models
63
+ for (const customId of configMgr.getCustomModels()) {
64
+ if (!result.some((r) => r.id === customId)) {
65
+ result.push({ id: customId, provider: "custom", isCustom: true });
66
+ }
67
+ }
68
+ // 3. Fallback default models if no keys configured
69
+ if (result.length === 0) {
70
+ const defaultOrder = ["openrouter", "gemini", "anthropic", "openai"];
71
+ for (const prov of defaultOrder) {
72
+ const list = CURATED_MODELS_BY_PROVIDER[prov] || [];
73
+ for (const id of list.slice(0, 2)) {
74
+ if (!result.some((r) => r.id === id)) {
75
+ result.push({ id, provider: prov });
76
+ }
77
+ }
78
+ }
79
+ }
80
+ return result;
81
+ }
5
82
  /**
6
83
  * Command Registry & Execution Dispatcher.
7
84
  * PRD Part 2 Section 170–175.
@@ -103,10 +180,11 @@ export class CommandRegistry {
103
180
  description: d.description,
104
181
  usage: d.usage,
105
182
  }));
183
+ const formatted = list.map((c) => ` ${c.command.padEnd(14)} — ${c.description}`).join("\n");
106
184
  return {
107
185
  success: true,
108
186
  commandName: "help",
109
- message: "Available Anantham V2 Commands",
187
+ message: `Available Anantham V2 Commands:\n${formatted}`,
110
188
  data: list,
111
189
  exitRequested: false,
112
190
  };
@@ -527,10 +605,10 @@ export class CommandRegistry {
527
605
  return {
528
606
  success: true,
529
607
  commandName: "version",
530
- message: "Anantham V2 v2.0.0-alpha.1",
608
+ message: "Anantham V2 v2.0.3",
531
609
  data: {
532
- version: "2.0.0-alpha.1",
533
- releaseChannel: "alpha",
610
+ version: "2.0.3",
611
+ releaseChannel: "release",
534
612
  },
535
613
  exitRequested: false,
536
614
  };
@@ -565,6 +643,349 @@ export class CommandRegistry {
565
643
  exitRequested: false,
566
644
  };
567
645
  });
646
+ // 14. /key & /connect
647
+ this.registerCommand({
648
+ name: "key",
649
+ description: "Manage provider API keys (list, set <provider> <key>, remove <provider>)",
650
+ aliases: ["keys", "apikey", "connect"],
651
+ usage: "/key [list | set <provider> <key> | remove <provider>]",
652
+ options: [],
653
+ }, (cmd, ctrl) => {
654
+ let sub = cmd.args[0]?.toLowerCase() || "list";
655
+ let providerArg = cmd.args[1];
656
+ let keyArg = cmd.args[2];
657
+ // Support direct /connect openrouter sk-... or /connect <provider>
658
+ if (cmd.name.toLowerCase() === "connect") {
659
+ sub = "set";
660
+ providerArg = cmd.args[0];
661
+ keyArg = cmd.args[1];
662
+ }
663
+ const configMgr = UserConfigManager.getInstance();
664
+ let workspaceDir = process.cwd();
665
+ const activeProjectId = ctrl.getContext().activeProjectId;
666
+ if (activeProjectId) {
667
+ const proj = this.projectRepo.findById(activeProjectId);
668
+ if (proj?.rootPath) {
669
+ workspaceDir = proj.rootPath;
670
+ }
671
+ }
672
+ if (sub === "set") {
673
+ const provider = providerArg?.toLowerCase();
674
+ const key = keyArg;
675
+ if (!provider || !key) {
676
+ throw new Error("Usage: /key set <provider> <apiKey> (e.g. /key set openrouter sk-or-v1-...)");
677
+ }
678
+ configMgr.setApiKey(provider, key, workspaceDir);
679
+ const envVar = `${provider.toUpperCase().replace(/-/g, "_")}_API_KEY`;
680
+ return {
681
+ success: true,
682
+ commandName: "key",
683
+ message: `✔ API key for provider '${provider}' connected successfully!\n Variable: ${envVar} = ${maskSecret(key)}\n Saved to ~/.anantham/config.json and workspace .env`,
684
+ data: { provider, envVar, maskedKey: maskSecret(key) },
685
+ exitRequested: false,
686
+ };
687
+ }
688
+ if (sub === "remove" || sub === "delete") {
689
+ const provider = providerArg?.toLowerCase();
690
+ if (!provider) {
691
+ throw new Error("Usage: /key remove <provider>");
692
+ }
693
+ configMgr.removeApiKey(provider, workspaceDir);
694
+ return {
695
+ success: true,
696
+ commandName: "key",
697
+ message: `✔ API key for provider '${provider}' removed from config and environment.`,
698
+ data: { provider },
699
+ exitRequested: false,
700
+ };
701
+ }
702
+ if (sub === "list") {
703
+ const list = configMgr.listKeys();
704
+ const rows = list.map((c) => ` ${c.provider.padEnd(12)} : ${c.masked.padEnd(16)} [${c.configured ? "✔ Configured" : "✖ Not Set"}]`);
705
+ return {
706
+ success: true,
707
+ commandName: "key",
708
+ message: `Configured AI Provider Keys:\n${rows.join("\n")}\n\nUse: /key set <provider> <apiKey> to connect a provider.`,
709
+ data: list,
710
+ exitRequested: false,
711
+ };
712
+ }
713
+ throw new Error(`Unknown key subcommand '${sub}'. Use 'list', 'set <provider> <key>', or 'remove <provider>'.`);
714
+ });
715
+ // 15. /model
716
+ this.registerCommand({
717
+ name: "model",
718
+ description: "Display, switch, or add active LLM models (supports /model <number>, /model add <id>)",
719
+ aliases: ["m"],
720
+ usage: "/model [<number> | <modelId> | add <modelId> | remove <modelId>]",
721
+ options: [],
722
+ }, (cmd, ctrl) => {
723
+ const configMgr = UserConfigManager.getInstance();
724
+ const activeProjectId = ctrl.getContext().activeProjectId;
725
+ const proj = activeProjectId ? this.projectRepo.findById(activeProjectId) : null;
726
+ const currentModel = proj?.modelProfile || configMgr.getDefaultModel();
727
+ if (cmd.args.length === 0) {
728
+ return {
729
+ success: true,
730
+ commandName: "model",
731
+ message: `Current active model: ${currentModel}\n\nQuick switch: /model <number> (e.g. /model 1)\nAdd custom: /model add <modelId>\nList models: /models`,
732
+ data: { model: currentModel },
733
+ exitRequested: false,
734
+ };
735
+ }
736
+ const sub = cmd.args[0].toLowerCase();
737
+ // /model add <modelId>
738
+ if (sub === "add") {
739
+ const modelId = cmd.args[1]?.trim();
740
+ if (!modelId) {
741
+ throw new Error("Usage: /model add <modelId> (e.g. /model add openrouter/mistralai/mistral-large)");
742
+ }
743
+ configMgr.addCustomModel(modelId);
744
+ configMgr.setDefaultModel(modelId);
745
+ if (proj) {
746
+ proj.modelProfile = modelId;
747
+ this.projectRepo.save(proj);
748
+ }
749
+ return {
750
+ success: true,
751
+ commandName: "model",
752
+ message: `✔ Added custom model '${modelId}' and switched to it.\n Saved to ~/.anantham/config.json and active project.`,
753
+ data: { model: modelId, custom: true },
754
+ exitRequested: false,
755
+ };
756
+ }
757
+ // /model remove <modelId>
758
+ if (sub === "remove" || sub === "delete") {
759
+ const modelId = cmd.args[1]?.trim();
760
+ if (!modelId) {
761
+ throw new Error("Usage: /model remove <modelId>");
762
+ }
763
+ const removed = configMgr.removeCustomModel(modelId);
764
+ return {
765
+ success: true,
766
+ commandName: "model",
767
+ message: removed
768
+ ? `✔ Removed custom model '${modelId}'.`
769
+ : `Model '${modelId}' was not in custom models list.`,
770
+ data: { model: modelId, removed },
771
+ exitRequested: false,
772
+ };
773
+ }
774
+ let targetModel = cmd.args[0].trim();
775
+ // Check if numeric selection (e.g. /model 1 or /model 2)
776
+ if (/^\d+$/.test(targetModel)) {
777
+ const num = parseInt(targetModel, 10);
778
+ const list = getNumberedModelList(configMgr);
779
+ if (num < 1 || num > list.length) {
780
+ throw new Error(`Invalid model index [${num}]. Run '/models' to view available numbers (1-${list.length}).`);
781
+ }
782
+ targetModel = list[num - 1].id;
783
+ }
784
+ configMgr.setDefaultModel(targetModel);
785
+ if (proj) {
786
+ proj.modelProfile = targetModel;
787
+ this.projectRepo.save(proj);
788
+ }
789
+ return {
790
+ success: true,
791
+ commandName: "model",
792
+ message: `✔ Active model switched to '${targetModel}' (persisted to config & project).`,
793
+ data: { model: targetModel },
794
+ exitRequested: false,
795
+ };
796
+ });
797
+ // 16. /models
798
+ this.registerCommand({
799
+ name: "models",
800
+ description: "List curated AI models, search OpenRouter models, or list by provider",
801
+ aliases: ["model-list"],
802
+ usage: "/models [all | <provider> | search <query> | fetch]",
803
+ options: [],
804
+ }, async (cmd, ctrl) => {
805
+ const configMgr = UserConfigManager.getInstance();
806
+ const activeProjectId = ctrl.getContext().activeProjectId;
807
+ const proj = activeProjectId ? this.projectRepo.findById(activeProjectId) : null;
808
+ const activeModel = proj?.modelProfile || configMgr.getDefaultModel();
809
+ const arg = cmd.args[0]?.toLowerCase();
810
+ // /models search <query> or /models fetch
811
+ if (arg === "search" || arg === "fetch") {
812
+ const query = cmd.args.slice(1).join(" ").toLowerCase();
813
+ const orKey = configMgr.getApiKey("openrouter");
814
+ if (!orKey) {
815
+ throw new Error("OpenRouter API key required to search live models. Connect it with: /key set openrouter <key>");
816
+ }
817
+ try {
818
+ const res = await fetch("https://openrouter.ai/api/v1/models", {
819
+ headers: { Authorization: `Bearer ${orKey}` },
820
+ signal: AbortSignal.timeout(6000),
821
+ });
822
+ if (!res.ok) {
823
+ throw new Error(`OpenRouter API responded with HTTP ${res.status}`);
824
+ }
825
+ const data = (await res.json());
826
+ let items = data.data || [];
827
+ if (query) {
828
+ items = items.filter((m) => m.id.toLowerCase().includes(query) || (m.name && m.name.toLowerCase().includes(query)));
829
+ }
830
+ const matched = items.slice(0, 8);
831
+ if (matched.length === 0) {
832
+ return {
833
+ success: true,
834
+ commandName: "models",
835
+ message: `No OpenRouter models found matching '${query}'.`,
836
+ data: [],
837
+ exitRequested: false,
838
+ };
839
+ }
840
+ const lines = matched.map((m) => ` • ${m.id} (${m.context_length ? `${Math.round(m.context_length / 1000)}k ctx` : "std"})`);
841
+ return {
842
+ success: true,
843
+ commandName: "models",
844
+ message: `OpenRouter Live Models${query ? ` (search: '${query}')` : " (top)"}:\n${lines.join("\n")}\n\nTo use: /model <modelId> or /model add <modelId>`,
845
+ data: matched.map((m) => m.id),
846
+ exitRequested: false,
847
+ };
848
+ }
849
+ catch (err) {
850
+ throw new Error(`Failed to query OpenRouter live models: ${err.message}`);
851
+ }
852
+ }
853
+ // /models all
854
+ if (arg === "all") {
855
+ const sections = [];
856
+ for (const [provider, models] of Object.entries(CURATED_MODELS_BY_PROVIDER)) {
857
+ sections.push(`[${provider.toUpperCase()}]:\n` + models.slice(0, 3).map((m) => ` • ${m}`).join("\n"));
858
+ }
859
+ return {
860
+ success: true,
861
+ commandName: "models",
862
+ message: `Curated AI Models Catalog:\n\n${sections.join("\n\n")}\n\nSwitch via: /model <modelId>`,
863
+ data: CURATED_MODELS_BY_PROVIDER,
864
+ exitRequested: false,
865
+ };
866
+ }
867
+ // Specific provider e.g. /models anthropic or /models openrouter
868
+ if (arg && CURATED_MODELS_BY_PROVIDER[arg]) {
869
+ const list = CURATED_MODELS_BY_PROVIDER[arg].map((m) => {
870
+ const activeTag = m === activeModel ? " (ACTIVE)" : "";
871
+ return ` • ${m}${activeTag}`;
872
+ }).join("\n");
873
+ return {
874
+ success: true,
875
+ commandName: "models",
876
+ message: `Models for [${arg.toUpperCase()}]:\n${list}\n\nSwitch via: /model <modelId>`,
877
+ data: CURATED_MODELS_BY_PROVIDER[arg],
878
+ exitRequested: false,
879
+ };
880
+ }
881
+ // Default: List models for configured providers + custom models
882
+ const configuredKeys = configMgr.listKeys().filter((k) => k.configured);
883
+ const list = getNumberedModelList(configMgr);
884
+ if (configuredKeys.length > 0) {
885
+ const provNames = configuredKeys.map((k) => k.provider.toUpperCase()).join(", ");
886
+ const rows = list.map((item, idx) => {
887
+ const num = `[${idx + 1}]`.padEnd(4);
888
+ const isActive = item.id === activeModel ? " (ACTIVE)" : "";
889
+ const customTag = item.isCustom ? " [Custom]" : "";
890
+ return ` ${num} ${item.id}${customTag}${isActive}`;
891
+ });
892
+ return {
893
+ success: true,
894
+ commandName: "models",
895
+ message: `Available Models for Configured Providers (${provNames}):\n${rows.join("\n")}\n\nSwitch: /model <number> (e.g. /model 1) | /model <modelId>\nCustom: /model add <id> | Search: /models search <query>`,
896
+ data: list,
897
+ exitRequested: false,
898
+ };
899
+ }
900
+ // Fallback when no keys configured
901
+ const fallbackRows = list.map((item, idx) => {
902
+ const num = `[${idx + 1}]`.padEnd(4);
903
+ const isActive = item.id === activeModel ? " (ACTIVE)" : "";
904
+ return ` ${num} ${item.id} [${item.provider}]${isActive}`;
905
+ });
906
+ return {
907
+ success: true,
908
+ commandName: "models",
909
+ message: `Curated AI Models (No API keys configured yet):\n${fallbackRows.join("\n")}\n\nConnect OpenRouter or other keys via:\n /key set openrouter <your-api-key>\nSwitch: /model <number> | View all: /models all`,
910
+ data: list,
911
+ exitRequested: false,
912
+ };
913
+ });
914
+ // /usage — Real-time Token Usage Matrix & Cost Attribution
915
+ this.registerCommand({
916
+ name: "usage",
917
+ description: "Display real-time token usage matrix, model leaderboard and cost attribution",
918
+ aliases: ["tokens", "metrics", "cost"],
919
+ usage: "/usage [today | mtd | models | trend]",
920
+ options: [],
921
+ }, () => {
922
+ const metrics = TokenMetricsManager.getInstance();
923
+ const today = metrics.getDailySummary();
924
+ const mtd = metrics.getMtdSummary();
925
+ const budget = metrics.getMonthlyBudget();
926
+ const topModels = metrics.getTopModels(4);
927
+ const lines = [
928
+ "Token Usage Matrix & Cost Analytics:",
929
+ ` Today's Tokens : ${today.totalTokens.toLocaleString()} (In: ${today.totalInputTokens.toLocaleString()} | Out: ${today.totalOutputTokens.toLocaleString()} | Cached: ${today.totalCachedTokens.toLocaleString()})`,
930
+ ` Today's Cost : $${today.totalCostUsd.toFixed(4)} USD (${today.requestCount} requests)`,
931
+ ` Month-to-Date : ${mtd.totalTokens.toLocaleString()} tokens | $${mtd.totalCostUsd.toFixed(2)} / $${budget.toFixed(0)} USD budget`,
932
+ "",
933
+ "Top Consuming Models:",
934
+ ];
935
+ for (const m of topModels) {
936
+ lines.push(` • ${m.modelId.padEnd(34)} : ${m.totalTokens.toLocaleString().padStart(10)} tokens | $${m.costUsd.toFixed(2)} (${m.percentage}%)`);
937
+ }
938
+ lines.push("");
939
+ lines.push("Interactive TUI: Run 'anantham --tui' and type '/usage' to view the full graphical matrix with neon sparklines.");
940
+ return {
941
+ success: true,
942
+ commandName: "usage",
943
+ message: lines.join("\n"),
944
+ data: { today, mtd, budget, topModels },
945
+ exitRequested: false,
946
+ };
947
+ });
948
+ // /teamwork-preview — Autonomous multi-worker preview harness
949
+ this.registerCommand({
950
+ name: "teamwork-preview",
951
+ description: "Autonomous agent multi-worker teamwork preview harness",
952
+ aliases: ["preview", "teamwork"],
953
+ usage: "/teamwork-preview [status | run]",
954
+ options: [],
955
+ }, () => {
956
+ return {
957
+ success: true,
958
+ commandName: "teamwork-preview",
959
+ message: [
960
+ "❖ Teamwork Preview Harness Status: ONLINE",
961
+ " Engine : Anantham V2 Autonomous Agent Coordinator",
962
+ " Parallel Workers : 4 active worker execution slots",
963
+ " Task Partitioning: Wave DAG with generation-fenced leases",
964
+ " Durability : SQLite WAL (synchronous = FULL, RPO-0)",
965
+ " Safety Boundary : ToolGateway sandboxed capability routing",
966
+ "",
967
+ "Autonomous team preview ready. Submit prompt tasks via interactive CLI or TUI.",
968
+ ].join("\n"),
969
+ data: { status: "ONLINE", workers: 4, mode: "wave_dag" },
970
+ exitRequested: false,
971
+ };
972
+ });
973
+ // /clear — Clear viewport
974
+ this.registerCommand({
975
+ name: "clear",
976
+ description: "Clear terminal viewport and command output buffer",
977
+ aliases: ["cls"],
978
+ usage: "/clear",
979
+ options: [],
980
+ }, () => {
981
+ return {
982
+ success: true,
983
+ commandName: "clear",
984
+ message: "",
985
+ data: {},
986
+ exitRequested: false,
987
+ };
988
+ });
568
989
  }
569
990
  }
570
991
  //# sourceMappingURL=command-registry.js.map