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.
- package/dist/bin/anantham.js +12 -1
- package/dist/bin/anantham.js.map +1 -1
- package/dist/cli/command-parser.d.ts +5 -0
- package/dist/cli/command-parser.d.ts.map +1 -1
- package/dist/cli/command-parser.js +40 -9
- package/dist/cli/command-parser.js.map +1 -1
- package/dist/cli/command-registry.d.ts +8 -0
- package/dist/cli/command-registry.d.ts.map +1 -1
- package/dist/cli/command-registry.js +425 -4
- package/dist/cli/command-registry.js.map +1 -1
- package/dist/cli/error-handler.d.ts.map +1 -1
- package/dist/cli/error-handler.js +55 -1
- package/dist/cli/error-handler.js.map +1 -1
- package/dist/domain/tui.d.ts +1 -1
- package/dist/domain/tui.d.ts.map +1 -1
- package/dist/domain/tui.js +1 -0
- package/dist/domain/tui.js.map +1 -1
- package/dist/models/adapters/openai-compatible-adapter.d.ts.map +1 -1
- package/dist/models/adapters/openai-compatible-adapter.js +2 -1
- package/dist/models/adapters/openai-compatible-adapter.js.map +1 -1
- package/dist/models/provider-registry.d.ts +2 -2
- package/dist/persistence/index.d.ts +2 -0
- package/dist/persistence/index.d.ts.map +1 -1
- package/dist/persistence/index.js +2 -0
- package/dist/persistence/index.js.map +1 -1
- package/dist/persistence/token-metrics-manager.d.ts +88 -0
- package/dist/persistence/token-metrics-manager.d.ts.map +1 -0
- package/dist/persistence/token-metrics-manager.js +272 -0
- package/dist/persistence/token-metrics-manager.js.map +1 -0
- package/dist/persistence/user-config-manager.d.ts +40 -0
- package/dist/persistence/user-config-manager.d.ts.map +1 -0
- package/dist/persistence/user-config-manager.js +175 -0
- package/dist/persistence/user-config-manager.js.map +1 -0
- package/dist/tui/ansi-gradient.d.ts +43 -0
- package/dist/tui/ansi-gradient.d.ts.map +1 -0
- package/dist/tui/ansi-gradient.js +131 -0
- package/dist/tui/ansi-gradient.js.map +1 -0
- package/dist/tui/command-palette.d.ts +20 -0
- package/dist/tui/command-palette.d.ts.map +1 -0
- package/dist/tui/command-palette.js +241 -0
- package/dist/tui/command-palette.js.map +1 -0
- package/dist/tui/terminal-layout.d.ts +4 -0
- package/dist/tui/terminal-layout.d.ts.map +1 -1
- package/dist/tui/terminal-layout.js +42 -4
- package/dist/tui/terminal-layout.js.map +1 -1
- package/dist/tui/token-dashboard-renderer.d.ts +6 -0
- package/dist/tui/token-dashboard-renderer.d.ts.map +1 -0
- package/dist/tui/token-dashboard-renderer.js +115 -0
- package/dist/tui/token-dashboard-renderer.js.map +1 -0
- package/dist/tui/tui-application.d.ts +7 -0
- package/dist/tui/tui-application.d.ts.map +1 -1
- package/dist/tui/tui-application.js +110 -5
- package/dist/tui/tui-application.js.map +1 -1
- package/dist/tui/tui-controller.d.ts +78 -2
- package/dist/tui/tui-controller.d.ts.map +1 -1
- package/dist/tui/tui-controller.js +564 -24
- package/dist/tui/tui-controller.js.map +1 -1
- package/dist/tui/tui-renderer.d.ts +12 -1
- package/dist/tui/tui-renderer.d.ts.map +1 -1
- package/dist/tui/tui-renderer.js +104 -40
- package/dist/tui/tui-renderer.js.map +1 -1
- package/dist/tui/tui-sanitizer.d.ts +4 -0
- package/dist/tui/tui-sanitizer.d.ts.map +1 -1
- package/dist/tui/tui-sanitizer.js +6 -0
- package/dist/tui/tui-sanitizer.js.map +1 -1
- package/package.json +1 -1
package/dist/bin/anantham.js
CHANGED
|
@@ -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.
|
|
77
|
+
console.log("2.0.3");
|
|
67
78
|
process.exit(0);
|
|
68
79
|
}
|
|
69
80
|
else if (!arg.startsWith("-") && !executeCmd) {
|
package/dist/bin/anantham.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"anantham.js","sourceRoot":"","sources":["../../src/bin/anantham.ts"],"names":[],"mappings":";AAEA,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAC;AAC3D,OAAO,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAC;AAC3D,OAAO,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;
|
|
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;
|
|
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
|
|
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
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
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":"AAAA,OAAO,EAAsB,mBAAmB,EAAE,MAAM,kBAAkB,CAAC;AAE3E;;;;GAIG;AACH,MAAM,OAAO,aAAa;IACxB;;OAEG;IACI,KAAK,CAAC,QAAgB;QAC3B,MAAM,OAAO,GAAG,QAAQ,CAAC,IAAI,EAAE,CAAC;QAChC,IAAI,CAAC,OAAO,EAAE,CAAC;YACb,MAAM,IAAI,KAAK,CAAC,sBAAsB,CAAC,CAAC;QAC1C,CAAC;QAED,uDAAuD;QACvD,IAAI,sBAAsB,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC;YACzC,MAAM,IAAI,KAAK,CAAC,oDAAoD,CAAC,CAAC;QACxE,CAAC;QAED,MAAM,MAAM,GAAG,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;QACtC,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACxB,MAAM,IAAI,KAAK,CAAC,0BAA0B,CAAC,CAAC;QAC9C,CAAC;QAED,MAAM,UAAU,GAAG,MAAM,CAAC,CAAC,CAAE,CAAC;QAC9B,MAAM,cAAc,GAAG,UAAU,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC;
|
|
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;
|
|
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:
|
|
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.
|
|
608
|
+
message: "Anantham V2 v2.0.3",
|
|
531
609
|
data: {
|
|
532
|
-
version: "2.0.
|
|
533
|
-
releaseChannel: "
|
|
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
|