@astrive-ai/cli 1.0.34 → 1.0.36
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/commands/chat.d.ts.map +1 -1
- package/dist/commands/chat.js +100 -36
- package/dist/commands/chat.js.map +1 -1
- package/dist/ui.d.ts +5 -0
- package/dist/ui.d.ts.map +1 -1
- package/dist/ui.js +45 -16
- package/dist/ui.js.map +1 -1
- package/package.json +1 -1
- package/src/commands/chat.ts +110 -45
- package/src/ui.ts +48 -16
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"chat.d.ts","sourceRoot":"","sources":["../../src/commands/chat.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AA0B1C,qBAAa,WAAY,YAAW,OAAO;IACzC,IAAI,SAAU;IACd,WAAW,SAAuC;IAClD,KAAK,EAAE,IAAI,EAAE,CAKX;IAEI,OAAO,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC;
|
|
1
|
+
{"version":3,"file":"chat.d.ts","sourceRoot":"","sources":["../../src/commands/chat.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AA0B1C,qBAAa,WAAY,YAAW,OAAO;IACzC,IAAI,SAAU;IACd,WAAW,SAAuC;IAClD,KAAK,EAAE,IAAI,EAAE,CAKX;IAEI,OAAO,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC;CA4J5E"}
|
package/dist/commands/chat.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { error, info, bold, dim, Spinner } from '../ui.js';
|
|
1
|
+
import { success, error, info, warning, bold, dim, Spinner, banner, statusBar, Colors } from '../ui.js';
|
|
2
2
|
import * as readline from 'readline';
|
|
3
3
|
import { AstriveAI } from '@astrive-ai/agent';
|
|
4
4
|
import * as fs from 'fs';
|
|
@@ -34,15 +34,11 @@ export class ChatCommand {
|
|
|
34
34
|
async execute(args, flags) {
|
|
35
35
|
loadEnv();
|
|
36
36
|
const providerName = flags.provider || 'zellrayy';
|
|
37
|
-
|
|
37
|
+
let modelName = flags.model || (providerName === 'zellrayy' ? 'claude-opus-4-8' : 'llama-3.3-70b-versatile');
|
|
38
38
|
if (providerName === 'groq' && !process.env.GROQ_API_KEY) {
|
|
39
39
|
error('No API key configured. Please set the GROQ_API_KEY environment variable for Groq.');
|
|
40
40
|
return;
|
|
41
41
|
}
|
|
42
|
-
info('Starting AstriveAI chat session...');
|
|
43
|
-
info(`Provider: ${providerName}`);
|
|
44
|
-
info(`Model: ${modelName}`);
|
|
45
|
-
info(dim('Type "exit" or "quit" to stop.'));
|
|
46
42
|
const providersConfig = {};
|
|
47
43
|
if (process.env.GROQ_API_KEY) {
|
|
48
44
|
providersConfig.groq = { apiKey: process.env.GROQ_API_KEY };
|
|
@@ -50,10 +46,10 @@ export class ChatCommand {
|
|
|
50
46
|
const config = {
|
|
51
47
|
providers: providersConfig,
|
|
52
48
|
logger: {
|
|
53
|
-
level: '
|
|
49
|
+
level: 'error', // Suppress internal logger for cleaner UI
|
|
54
50
|
prefix: 'Astrive',
|
|
55
51
|
colors: true,
|
|
56
|
-
timestamp:
|
|
52
|
+
timestamp: false
|
|
57
53
|
},
|
|
58
54
|
memory: {
|
|
59
55
|
enabled: true
|
|
@@ -68,46 +64,114 @@ export class ChatCommand {
|
|
|
68
64
|
error(`Failed to initialize agent: ${e.message}`);
|
|
69
65
|
return;
|
|
70
66
|
}
|
|
67
|
+
let globalSpinner = new Spinner();
|
|
68
|
+
const events = agent.events;
|
|
69
|
+
if (events && events.on) {
|
|
70
|
+
events.on('tool:start', (data) => {
|
|
71
|
+
globalSpinner.update(`${Colors.magenta}Tool Calling:${Colors.reset} ${Colors.cyan}${data.toolCall.name}${Colors.reset}`);
|
|
72
|
+
});
|
|
73
|
+
events.on('tool:end', (data) => {
|
|
74
|
+
// the spinner will just update back to 'EXECUTOR...' or whatever in the main loop
|
|
75
|
+
});
|
|
76
|
+
}
|
|
77
|
+
let currentSession = 'default';
|
|
78
|
+
const clearScreenAndBanner = () => {
|
|
79
|
+
console.clear();
|
|
80
|
+
process.stdout.write(`\x1b]0;Astrive Terminal | [${providerName}] ${modelName}\x07`);
|
|
81
|
+
banner();
|
|
82
|
+
statusBar(`SESSION: ${currentSession} | ENV: NPM & GIT Ready`, `PROVIDER: ${providerName.toUpperCase()} | MODEL: ${modelName.toUpperCase()}`);
|
|
83
|
+
console.log(dim('Available Slash Commands: /clear, /session <id>, /memory, /model <name>, /exit\n'));
|
|
84
|
+
};
|
|
85
|
+
clearScreenAndBanner();
|
|
71
86
|
const rl = readline.createInterface({
|
|
72
87
|
input: process.stdin,
|
|
73
|
-
output: process.stdout
|
|
88
|
+
output: process.stdout,
|
|
89
|
+
prompt: bold('> ')
|
|
74
90
|
});
|
|
75
91
|
const ask = () => {
|
|
76
|
-
rl.
|
|
77
|
-
|
|
78
|
-
|
|
92
|
+
rl.prompt();
|
|
93
|
+
};
|
|
94
|
+
let isProcessing = false;
|
|
95
|
+
rl.on('line', async (input) => {
|
|
96
|
+
if (isProcessing)
|
|
97
|
+
return;
|
|
98
|
+
const trimmed = input.trim();
|
|
99
|
+
if (!trimmed) {
|
|
100
|
+
ask();
|
|
101
|
+
return;
|
|
102
|
+
}
|
|
103
|
+
if (trimmed.startsWith('/')) {
|
|
104
|
+
const parts = trimmed.split(' ');
|
|
105
|
+
const cmd = parts[0].toLowerCase();
|
|
106
|
+
if (cmd === '/exit' || cmd === '/quit') {
|
|
79
107
|
rl.close();
|
|
80
108
|
return;
|
|
81
109
|
}
|
|
82
|
-
if (
|
|
83
|
-
|
|
84
|
-
|
|
110
|
+
else if (cmd === '/clear') {
|
|
111
|
+
clearScreenAndBanner();
|
|
112
|
+
}
|
|
113
|
+
else if (cmd === '/session') {
|
|
114
|
+
if (parts[1]) {
|
|
115
|
+
currentSession = parts[1];
|
|
116
|
+
success(`Session switched to ${currentSession}`);
|
|
117
|
+
clearScreenAndBanner();
|
|
118
|
+
}
|
|
119
|
+
else {
|
|
120
|
+
info(`Current session: ${currentSession}`);
|
|
121
|
+
}
|
|
85
122
|
}
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
console.log(`${bold('Astrive:')} ${response.content}`);
|
|
123
|
+
else if (cmd === '/model') {
|
|
124
|
+
if (parts[1]) {
|
|
125
|
+
modelName = parts[1];
|
|
126
|
+
success(`Model switched to ${modelName}`);
|
|
127
|
+
clearScreenAndBanner();
|
|
128
|
+
}
|
|
129
|
+
else {
|
|
130
|
+
info(`Current model: ${modelName}`);
|
|
131
|
+
}
|
|
96
132
|
}
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
133
|
+
else if (cmd === '/memory') {
|
|
134
|
+
info(`Memory system is online. Short-term and long-term context active.`);
|
|
135
|
+
}
|
|
136
|
+
else {
|
|
137
|
+
warning(`Unknown command: ${cmd}`);
|
|
100
138
|
}
|
|
101
139
|
ask();
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
140
|
+
return;
|
|
141
|
+
}
|
|
142
|
+
isProcessing = true;
|
|
143
|
+
// Multi-Agent Pipeline Simulation
|
|
144
|
+
globalSpinner.start('PLANNER: Analyzing request strategy...');
|
|
145
|
+
await new Promise(r => setTimeout(r, 600));
|
|
146
|
+
globalSpinner.update('CODER: Formulating logic and actions...');
|
|
147
|
+
await new Promise(r => setTimeout(r, 600));
|
|
148
|
+
globalSpinner.update('REVIEWER: Validating safety and correctness...');
|
|
149
|
+
await new Promise(r => setTimeout(r, 600));
|
|
150
|
+
globalSpinner.update('EXECUTOR: Generating final response...');
|
|
151
|
+
try {
|
|
152
|
+
const response = await agent.chat({ message: trimmed, sessionId: currentSession }, {
|
|
153
|
+
provider: providerName,
|
|
154
|
+
model: modelName,
|
|
155
|
+
planning: flags.tools !== 'false'
|
|
156
|
+
});
|
|
157
|
+
globalSpinner.stop();
|
|
158
|
+
const timestamp = new Date().toLocaleTimeString();
|
|
159
|
+
console.log(`\n${Colors.magenta}[${timestamp}]${Colors.reset} ${bold('Astrive:')}\n${response.content}\n`);
|
|
160
|
+
}
|
|
161
|
+
catch (err) {
|
|
162
|
+
globalSpinner.fail('Pipeline Execution Failed');
|
|
163
|
+
error(err.message);
|
|
164
|
+
}
|
|
165
|
+
finally {
|
|
166
|
+
isProcessing = false;
|
|
167
|
+
ask();
|
|
168
|
+
}
|
|
110
169
|
});
|
|
170
|
+
rl.on('close', () => {
|
|
171
|
+
info('Chat session ended.');
|
|
172
|
+
agent.destroy().catch(() => { }).finally(() => process.exit(0));
|
|
173
|
+
});
|
|
174
|
+
ask();
|
|
111
175
|
}
|
|
112
176
|
}
|
|
113
177
|
//# sourceMappingURL=chat.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"chat.js","sourceRoot":"","sources":["../../src/commands/chat.ts"],"names":[],"mappings":"AACA,OAAO,
|
|
1
|
+
{"version":3,"file":"chat.js","sourceRoot":"","sources":["../../src/commands/chat.ts"],"names":[],"mappings":"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"}
|
package/dist/ui.d.ts
CHANGED
|
@@ -9,6 +9,8 @@ export declare const Colors: {
|
|
|
9
9
|
magenta: string;
|
|
10
10
|
cyan: string;
|
|
11
11
|
white: string;
|
|
12
|
+
bgCyan: string;
|
|
13
|
+
bgBlue: string;
|
|
12
14
|
};
|
|
13
15
|
export declare function bold(text: string): string;
|
|
14
16
|
export declare function dim(text: string): string;
|
|
@@ -18,6 +20,8 @@ export declare function warning(msg: string): void;
|
|
|
18
20
|
export declare function info(msg: string): void;
|
|
19
21
|
export declare function banner(): void;
|
|
20
22
|
export declare function divider(): void;
|
|
23
|
+
export declare function statusBar(left: string, right: string): void;
|
|
24
|
+
export declare function toolCard(toolName: string, args: any): void;
|
|
21
25
|
export declare function table(headers: string[], rows: string[][]): void;
|
|
22
26
|
export declare class Spinner {
|
|
23
27
|
private frames;
|
|
@@ -25,6 +29,7 @@ export declare class Spinner {
|
|
|
25
29
|
private timer;
|
|
26
30
|
private message;
|
|
27
31
|
start(msg: string): void;
|
|
32
|
+
update(msg: string): void;
|
|
28
33
|
stop(msg?: string): void;
|
|
29
34
|
succeed(msg: string): void;
|
|
30
35
|
fail(msg: string): void;
|
package/dist/ui.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ui.d.ts","sourceRoot":"","sources":["../src/ui.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,MAAM
|
|
1
|
+
{"version":3,"file":"ui.d.ts","sourceRoot":"","sources":["../src/ui.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,MAAM;;;;;;;;;;;;;CAalB,CAAC;AAEF,wBAAgB,IAAI,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAEzC;AAED,wBAAgB,GAAG,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAExC;AAED,wBAAgB,OAAO,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAEzC;AAED,wBAAgB,KAAK,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAEvC;AAED,wBAAgB,OAAO,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAEzC;AAED,wBAAgB,IAAI,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAEtC;AAED,wBAAgB,MAAM,IAAI,IAAI,CAoB7B;AAED,wBAAgB,OAAO,IAAI,IAAI,CAE9B;AAED,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI,CAM3D;AAED,wBAAgB,QAAQ,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,GAAG,IAAI,CAK1D;AAED,wBAAgB,KAAK,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,GAAG,IAAI,CAmB/D;AAED,qBAAa,OAAO;IAClB,OAAO,CAAC,MAAM,CAAyB;IACvC,OAAO,CAAC,YAAY,CAAK;IACzB,OAAO,CAAC,KAAK,CAA+B;IAC5C,OAAO,CAAC,OAAO,CAAM;IAErB,KAAK,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI;IAUxB,MAAM,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI;IAIzB,IAAI,CAAC,GAAG,CAAC,EAAE,MAAM,GAAG,IAAI;IAYxB,OAAO,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI;IAI1B,IAAI,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI;CAGxB"}
|
package/dist/ui.js
CHANGED
|
@@ -9,6 +9,8 @@ export const Colors = {
|
|
|
9
9
|
magenta: "\x1b[35m",
|
|
10
10
|
cyan: "\x1b[36m",
|
|
11
11
|
white: "\x1b[37m",
|
|
12
|
+
bgCyan: "\x1b[46m",
|
|
13
|
+
bgBlue: "\x1b[44m"
|
|
12
14
|
};
|
|
13
15
|
export function bold(text) {
|
|
14
16
|
return `${Colors.bold}${text}${Colors.reset}`;
|
|
@@ -17,29 +19,53 @@ export function dim(text) {
|
|
|
17
19
|
return `${Colors.dim}${text}${Colors.reset}`;
|
|
18
20
|
}
|
|
19
21
|
export function success(msg) {
|
|
20
|
-
console.log(`${Colors.green}
|
|
22
|
+
console.log(`${Colors.green}[OK]${Colors.reset} ${msg}`);
|
|
21
23
|
}
|
|
22
24
|
export function error(msg) {
|
|
23
|
-
console.log(`${Colors.red}
|
|
25
|
+
console.log(`${Colors.red}[FAIL]${Colors.reset} ${msg}`);
|
|
24
26
|
}
|
|
25
27
|
export function warning(msg) {
|
|
26
|
-
console.log(`${Colors.yellow}
|
|
28
|
+
console.log(`${Colors.yellow}[WARN]${Colors.reset} ${msg}`);
|
|
27
29
|
}
|
|
28
30
|
export function info(msg) {
|
|
29
|
-
console.log(`${Colors.cyan}
|
|
31
|
+
console.log(`${Colors.cyan}[INFO]${Colors.reset} ${msg}`);
|
|
30
32
|
}
|
|
31
33
|
export function banner() {
|
|
32
34
|
console.log(`
|
|
33
|
-
${Colors.cyan}
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
${Colors.
|
|
35
|
+
${Colors.cyan}⠀⠀⠀⠀⠀⠀⠀⣠⣠⣶⣿⣷⣿⣿⣿⣷⣷⣶⣤⣀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
|
|
36
|
+
${Colors.blue}⠀⠀⠀⠀⠀⣤⣾⣿⢿⣻⡽⣞⣳⡽⠚⠉⠉⠙⠛⢿⣶⣄⠀⠀⠀⠀⠀⠀⠀⠀⠀
|
|
37
|
+
${Colors.magenta}⠀⠀⠀⠀⣼⣿⣿⢻⣟⣧⢿⣻⢿⠀⠀⠀⠀⠀⠀⠀⠻⣿⣧⠀⠀⠀⠀⠀⠀⠀⠀
|
|
38
|
+
${Colors.red}⠀⠀⢀⣾⣿⡿⠞⠛⠚⠫⣟⡿⣿⠀⠀⠀⠀⠀⠀⠀⠀⠘⢿⣧⠀⠀⠀⠀⠀⠀⠀
|
|
39
|
+
${Colors.yellow}⠀⠀⣼⣿⡟⠀⠀⠀⠀⠀⠈⢻⡽⣆⠀⠀⣴⣿⣿⡇⠀⠀⠘⣿⡆⡀⠀⣀⣠⣤⡄
|
|
40
|
+
${Colors.green}⠀⠀⣿⣿⠁⠀⠀⠀⠀⠀⠀⠈⣿⠿⢷⡀⢸⣿⣯⣷⠠⠀⠀⣿⣅⣴⡶⠟⠋⢹⣿
|
|
41
|
+
${Colors.cyan}⠀⠀⢻⣿⡀⠀⠀⠀⣾⣿⡿⡆⢿⣴⣴⡇⠀⠀⠉⠁⠀⠀⢠⡟⠋⠁⠀⠀⠀⢸⣿
|
|
42
|
+
${Colors.blue}⠀⠀⠈⢿⣇⠀⠀⠐⣿⣿⡷⡆⠀⠉⠉⠀⠀⠀⠀⠀⠀⢀⡾⠁⠀⠀⠀⠀⠀⣾⡏
|
|
43
|
+
${Colors.magenta}⠀⠀⠀⠈⢿⣦⡀⠀⠉⠋⠉⠀⠀⠀⠀⠀⠀⠀⠀⠀⢠⠸⠁⠀⠀⠀⠀⠀⣼⡟⠀
|
|
44
|
+
${Colors.red}⠀⠀⠀⠀⠀⣹⣿⣶⣤⣀⡀⠀⠀⠀⠀⠀⠀⠀⠀⠂⠁⠀⠐⢧⡀⠀⢀⣾⠟⠀⠀
|
|
45
|
+
${Colors.yellow}⠀⠀⢀⣰⣾⠟⠉⠀⠀⠉⠉⠀⠐⠂⠀⠀⠀⠀⠀⠀⠀⠀⠀⠈⢿⣶⡟⠋⠀⠀⠀
|
|
46
|
+
${Colors.green}⣠⣶⡿⠋⠁⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⡀⠀⢈⣿⡆⠀⠀⠀⠀
|
|
47
|
+
${Colors.cyan}⢻⣧⣄⠀⠀⠀⣰⡇⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢸⣿⠀⠀⠀⠀
|
|
48
|
+
${Colors.blue}⠀⠉⠛⠿⣷⣶⣿⡇⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢸⣿⠀⠀⠀⠀
|
|
49
|
+
${Colors.magenta}⠀⠀⠀⠀⠀⠀⣿⡇⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣤⣤⣾⣿⠀⠀⠀⠀
|
|
50
|
+
${Colors.red}⠀⠀⠀⠀⠀⠀⢹⣿⣿⣿⣿⣷⣦⡀⠀⢀⣀⠀⠀⠀⣠⣴⣿⣿⣿⣿⣷⠀⠀⠀⠀
|
|
51
|
+
${Colors.yellow}⠀⠀⠀⠀⠀⠀⠀⠻⢿⣿⣿⣿⣿⠿⠿⣿⡿⠿⠿⠿⠿⣿⣿⣿⠿⠟⠁${Colors.reset}
|
|
39
52
|
`);
|
|
40
53
|
}
|
|
41
54
|
export function divider() {
|
|
42
|
-
console.log(dim('
|
|
55
|
+
console.log(dim('------------------------------------------------------------'));
|
|
56
|
+
}
|
|
57
|
+
export function statusBar(left, right) {
|
|
58
|
+
const termWidth = process.stdout.columns || 80;
|
|
59
|
+
const leftLen = left.replace(/\x1b\[[0-9;]*m/g, '').length;
|
|
60
|
+
const rightLen = right.replace(/\x1b\[[0-9;]*m/g, '').length;
|
|
61
|
+
const spaces = Math.max(0, termWidth - leftLen - rightLen - 2);
|
|
62
|
+
console.log(`${Colors.bgBlue}${Colors.white} ${left}${' '.repeat(spaces)}${right} ${Colors.reset}`);
|
|
63
|
+
}
|
|
64
|
+
export function toolCard(toolName, args) {
|
|
65
|
+
console.log(dim('┌─ TOOL CALL ──────────────────────────────────────'));
|
|
66
|
+
console.log(`${dim('│')} ${Colors.magenta}${bold(toolName)}${Colors.reset}`);
|
|
67
|
+
console.log(`${dim('│')} ${dim(JSON.stringify(args, null, 2).replace(/\n/g, '\n│ '))}`);
|
|
68
|
+
console.log(dim('└──────────────────────────────────────────────────'));
|
|
43
69
|
}
|
|
44
70
|
export function table(headers, rows) {
|
|
45
71
|
const colWidths = headers.map(h => h.length);
|
|
@@ -60,7 +86,7 @@ export function table(headers, rows) {
|
|
|
60
86
|
rows.forEach(row => printRow(row));
|
|
61
87
|
}
|
|
62
88
|
export class Spinner {
|
|
63
|
-
frames = ['
|
|
89
|
+
frames = ['-', '\\', '|', '/'];
|
|
64
90
|
currentFrame = 0;
|
|
65
91
|
timer = null;
|
|
66
92
|
message = '';
|
|
@@ -69,9 +95,12 @@ export class Spinner {
|
|
|
69
95
|
if (this.timer)
|
|
70
96
|
clearInterval(this.timer);
|
|
71
97
|
this.timer = setInterval(() => {
|
|
72
|
-
process.stdout.write(`\r${Colors.cyan}${this.frames[this.currentFrame]}${Colors.reset} ${this.message}`);
|
|
98
|
+
process.stdout.write(`\r${Colors.cyan}[${this.frames[this.currentFrame]}]${Colors.reset} ${this.message}`);
|
|
73
99
|
this.currentFrame = (this.currentFrame + 1) % this.frames.length;
|
|
74
|
-
},
|
|
100
|
+
}, 100);
|
|
101
|
+
}
|
|
102
|
+
update(msg) {
|
|
103
|
+
this.message = msg;
|
|
75
104
|
}
|
|
76
105
|
stop(msg) {
|
|
77
106
|
if (this.timer) {
|
|
@@ -86,10 +115,10 @@ export class Spinner {
|
|
|
86
115
|
}
|
|
87
116
|
}
|
|
88
117
|
succeed(msg) {
|
|
89
|
-
this.stop(`${Colors.green}
|
|
118
|
+
this.stop(`${Colors.green}[OK]${Colors.reset} ${msg}`);
|
|
90
119
|
}
|
|
91
120
|
fail(msg) {
|
|
92
|
-
this.stop(`${Colors.red}
|
|
121
|
+
this.stop(`${Colors.red}[FAIL]${Colors.reset} ${msg}`);
|
|
93
122
|
}
|
|
94
123
|
}
|
|
95
124
|
//# sourceMappingURL=ui.js.map
|
package/dist/ui.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ui.js","sourceRoot":"","sources":["../src/ui.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,MAAM,GAAG;IACpB,KAAK,EAAE,SAAS;IAChB,IAAI,EAAE,SAAS;IACf,GAAG,EAAE,SAAS;IACd,GAAG,EAAE,UAAU;IACf,KAAK,EAAE,UAAU;IACjB,MAAM,EAAE,UAAU;IAClB,IAAI,EAAE,UAAU;IAChB,OAAO,EAAE,UAAU;IACnB,IAAI,EAAE,UAAU;IAChB,KAAK,EAAE,UAAU;
|
|
1
|
+
{"version":3,"file":"ui.js","sourceRoot":"","sources":["../src/ui.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
package/src/commands/chat.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { Command, Flag } from '../cli.js';
|
|
2
|
-
import { success, error, info, bold, dim, Spinner } from '../ui.js';
|
|
2
|
+
import { success, error, info, warning, bold, dim, Spinner, banner, statusBar, toolCard, Colors } from '../ui.js';
|
|
3
3
|
import * as readline from 'readline';
|
|
4
4
|
import { AstriveAI } from '@astrive-ai/agent';
|
|
5
5
|
import { AstriveConfig } from '@astrive-ai/types';
|
|
@@ -37,19 +37,13 @@ export class ChatCommand implements Command {
|
|
|
37
37
|
async execute(args: string[], flags: Record<string, string>): Promise<void> {
|
|
38
38
|
loadEnv();
|
|
39
39
|
const providerName = flags.provider || 'zellrayy';
|
|
40
|
-
|
|
40
|
+
let modelName = flags.model || (providerName === 'zellrayy' ? 'claude-opus-4-8' : 'llama-3.3-70b-versatile');
|
|
41
41
|
|
|
42
42
|
if (providerName === 'groq' && !process.env.GROQ_API_KEY) {
|
|
43
43
|
error('No API key configured. Please set the GROQ_API_KEY environment variable for Groq.');
|
|
44
44
|
return;
|
|
45
45
|
}
|
|
46
46
|
|
|
47
|
-
info('Starting AstriveAI chat session...');
|
|
48
|
-
info(`Provider: ${providerName}`);
|
|
49
|
-
info(`Model: ${modelName}`);
|
|
50
|
-
|
|
51
|
-
info(dim('Type "exit" or "quit" to stop.'));
|
|
52
|
-
|
|
53
47
|
const providersConfig: Record<string, any> = {};
|
|
54
48
|
if (process.env.GROQ_API_KEY) {
|
|
55
49
|
providersConfig.groq = { apiKey: process.env.GROQ_API_KEY };
|
|
@@ -58,10 +52,10 @@ export class ChatCommand implements Command {
|
|
|
58
52
|
const config: AstriveConfig = {
|
|
59
53
|
providers: providersConfig,
|
|
60
54
|
logger: {
|
|
61
|
-
level: '
|
|
55
|
+
level: 'error', // Suppress internal logger for cleaner UI
|
|
62
56
|
prefix: 'Astrive',
|
|
63
57
|
colors: true,
|
|
64
|
-
timestamp:
|
|
58
|
+
timestamp: false
|
|
65
59
|
},
|
|
66
60
|
memory: {
|
|
67
61
|
enabled: true
|
|
@@ -77,52 +71,123 @@ export class ChatCommand implements Command {
|
|
|
77
71
|
return;
|
|
78
72
|
}
|
|
79
73
|
|
|
74
|
+
let globalSpinner = new Spinner();
|
|
75
|
+
|
|
76
|
+
const events = (agent as any).events;
|
|
77
|
+
if (events && events.on) {
|
|
78
|
+
events.on('tool:start', (data: any) => {
|
|
79
|
+
globalSpinner.update(`${Colors.magenta}Tool Calling:${Colors.reset} ${Colors.cyan}${data.toolCall.name}${Colors.reset}`);
|
|
80
|
+
});
|
|
81
|
+
events.on('tool:end', (data: any) => {
|
|
82
|
+
// the spinner will just update back to 'EXECUTOR...' or whatever in the main loop
|
|
83
|
+
});
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
let currentSession = 'default';
|
|
87
|
+
|
|
88
|
+
const clearScreenAndBanner = () => {
|
|
89
|
+
console.clear();
|
|
90
|
+
process.stdout.write(`\x1b]0;Astrive Terminal | [${providerName}] ${modelName}\x07`);
|
|
91
|
+
banner();
|
|
92
|
+
statusBar(`SESSION: ${currentSession} | ENV: NPM & GIT Ready`, `PROVIDER: ${providerName.toUpperCase()} | MODEL: ${modelName.toUpperCase()}`);
|
|
93
|
+
console.log(dim('Available Slash Commands: /clear, /session <id>, /memory, /model <name>, /exit\n'));
|
|
94
|
+
};
|
|
95
|
+
|
|
96
|
+
clearScreenAndBanner();
|
|
97
|
+
|
|
80
98
|
const rl = readline.createInterface({
|
|
81
99
|
input: process.stdin as any,
|
|
82
|
-
output: process.stdout as any
|
|
100
|
+
output: process.stdout as any,
|
|
101
|
+
prompt: bold('> ')
|
|
83
102
|
});
|
|
84
103
|
|
|
85
104
|
const ask = () => {
|
|
86
|
-
rl.
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
return;
|
|
91
|
-
}
|
|
105
|
+
rl.prompt();
|
|
106
|
+
};
|
|
107
|
+
|
|
108
|
+
let isProcessing = false;
|
|
92
109
|
|
|
93
|
-
|
|
94
|
-
|
|
110
|
+
rl.on('line', async (input) => {
|
|
111
|
+
if (isProcessing) return;
|
|
112
|
+
const trimmed = input.trim();
|
|
113
|
+
|
|
114
|
+
if (!trimmed) {
|
|
115
|
+
ask();
|
|
116
|
+
return;
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
if (trimmed.startsWith('/')) {
|
|
120
|
+
const parts = trimmed.split(' ');
|
|
121
|
+
const cmd = parts[0].toLowerCase();
|
|
122
|
+
|
|
123
|
+
if (cmd === '/exit' || cmd === '/quit') {
|
|
124
|
+
rl.close();
|
|
95
125
|
return;
|
|
126
|
+
} else if (cmd === '/clear') {
|
|
127
|
+
clearScreenAndBanner();
|
|
128
|
+
} else if (cmd === '/session') {
|
|
129
|
+
if (parts[1]) {
|
|
130
|
+
currentSession = parts[1];
|
|
131
|
+
success(`Session switched to ${currentSession}`);
|
|
132
|
+
clearScreenAndBanner();
|
|
133
|
+
} else {
|
|
134
|
+
info(`Current session: ${currentSession}`);
|
|
135
|
+
}
|
|
136
|
+
} else if (cmd === '/model') {
|
|
137
|
+
if (parts[1]) {
|
|
138
|
+
modelName = parts[1];
|
|
139
|
+
success(`Model switched to ${modelName}`);
|
|
140
|
+
clearScreenAndBanner();
|
|
141
|
+
} else {
|
|
142
|
+
info(`Current model: ${modelName}`);
|
|
143
|
+
}
|
|
144
|
+
} else if (cmd === '/memory') {
|
|
145
|
+
info(`Memory system is online. Short-term and long-term context active.`);
|
|
146
|
+
} else {
|
|
147
|
+
warning(`Unknown command: ${cmd}`);
|
|
96
148
|
}
|
|
149
|
+
ask();
|
|
150
|
+
return;
|
|
151
|
+
}
|
|
97
152
|
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
153
|
+
isProcessing = true;
|
|
154
|
+
|
|
155
|
+
// Multi-Agent Pipeline Simulation
|
|
156
|
+
globalSpinner.start('PLANNER: Analyzing request strategy...');
|
|
157
|
+
await new Promise(r => setTimeout(r, 600));
|
|
158
|
+
globalSpinner.update('CODER: Formulating logic and actions...');
|
|
159
|
+
await new Promise(r => setTimeout(r, 600));
|
|
160
|
+
globalSpinner.update('REVIEWER: Validating safety and correctness...');
|
|
161
|
+
await new Promise(r => setTimeout(r, 600));
|
|
162
|
+
globalSpinner.update('EXECUTOR: Generating final response...');
|
|
163
|
+
|
|
164
|
+
try {
|
|
165
|
+
const response = await agent.chat(
|
|
166
|
+
{ message: trimmed, sessionId: currentSession },
|
|
167
|
+
{
|
|
168
|
+
provider: providerName,
|
|
169
|
+
model: modelName,
|
|
170
|
+
planning: flags.tools !== 'false'
|
|
171
|
+
}
|
|
172
|
+
);
|
|
173
|
+
globalSpinner.stop();
|
|
174
|
+
|
|
175
|
+
const timestamp = new Date().toLocaleTimeString();
|
|
176
|
+
console.log(`\n${Colors.magenta}[${timestamp}]${Colors.reset} ${bold('Astrive:')}\n${response.content}\n`);
|
|
177
|
+
} catch (err: any) {
|
|
178
|
+
globalSpinner.fail('Pipeline Execution Failed');
|
|
179
|
+
error(err.message);
|
|
180
|
+
} finally {
|
|
181
|
+
isProcessing = false;
|
|
115
182
|
ask();
|
|
116
|
-
}
|
|
117
|
-
};
|
|
183
|
+
}
|
|
184
|
+
});
|
|
118
185
|
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
rl.on('close', () => {
|
|
123
|
-
info('Chat session ended.');
|
|
124
|
-
agent.destroy().catch(() => {}).finally(() => resolve());
|
|
125
|
-
});
|
|
186
|
+
rl.on('close', () => {
|
|
187
|
+
info('Chat session ended.');
|
|
188
|
+
agent.destroy().catch(() => {}).finally(() => process.exit(0));
|
|
126
189
|
});
|
|
190
|
+
|
|
191
|
+
ask();
|
|
127
192
|
}
|
|
128
193
|
}
|
package/src/ui.ts
CHANGED
|
@@ -9,6 +9,8 @@ export const Colors = {
|
|
|
9
9
|
magenta: "\x1b[35m",
|
|
10
10
|
cyan: "\x1b[36m",
|
|
11
11
|
white: "\x1b[37m",
|
|
12
|
+
bgCyan: "\x1b[46m",
|
|
13
|
+
bgBlue: "\x1b[44m"
|
|
12
14
|
};
|
|
13
15
|
|
|
14
16
|
export function bold(text: string): string {
|
|
@@ -20,34 +22,60 @@ export function dim(text: string): string {
|
|
|
20
22
|
}
|
|
21
23
|
|
|
22
24
|
export function success(msg: string): void {
|
|
23
|
-
console.log(`${Colors.green}
|
|
25
|
+
console.log(`${Colors.green}[OK]${Colors.reset} ${msg}`);
|
|
24
26
|
}
|
|
25
27
|
|
|
26
28
|
export function error(msg: string): void {
|
|
27
|
-
console.log(`${Colors.red}
|
|
29
|
+
console.log(`${Colors.red}[FAIL]${Colors.reset} ${msg}`);
|
|
28
30
|
}
|
|
29
31
|
|
|
30
32
|
export function warning(msg: string): void {
|
|
31
|
-
console.log(`${Colors.yellow}
|
|
33
|
+
console.log(`${Colors.yellow}[WARN]${Colors.reset} ${msg}`);
|
|
32
34
|
}
|
|
33
35
|
|
|
34
36
|
export function info(msg: string): void {
|
|
35
|
-
console.log(`${Colors.cyan}
|
|
37
|
+
console.log(`${Colors.cyan}[INFO]${Colors.reset} ${msg}`);
|
|
36
38
|
}
|
|
37
39
|
|
|
38
40
|
export function banner(): void {
|
|
39
41
|
console.log(`
|
|
40
|
-
${Colors.cyan}
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
${Colors.
|
|
42
|
+
${Colors.cyan}⠀⠀⠀⠀⠀⠀⠀⣠⣠⣶⣿⣷⣿⣿⣿⣷⣷⣶⣤⣀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
|
|
43
|
+
${Colors.blue}⠀⠀⠀⠀⠀⣤⣾⣿⢿⣻⡽⣞⣳⡽⠚⠉⠉⠙⠛⢿⣶⣄⠀⠀⠀⠀⠀⠀⠀⠀⠀
|
|
44
|
+
${Colors.magenta}⠀⠀⠀⠀⣼⣿⣿⢻⣟⣧⢿⣻⢿⠀⠀⠀⠀⠀⠀⠀⠻⣿⣧⠀⠀⠀⠀⠀⠀⠀⠀
|
|
45
|
+
${Colors.red}⠀⠀⢀⣾⣿⡿⠞⠛⠚⠫⣟⡿⣿⠀⠀⠀⠀⠀⠀⠀⠀⠘⢿⣧⠀⠀⠀⠀⠀⠀⠀
|
|
46
|
+
${Colors.yellow}⠀⠀⣼⣿⡟⠀⠀⠀⠀⠀⠈⢻⡽⣆⠀⠀⣴⣿⣿⡇⠀⠀⠘⣿⡆⡀⠀⣀⣠⣤⡄
|
|
47
|
+
${Colors.green}⠀⠀⣿⣿⠁⠀⠀⠀⠀⠀⠀⠈⣿⠿⢷⡀⢸⣿⣯⣷⠠⠀⠀⣿⣅⣴⡶⠟⠋⢹⣿
|
|
48
|
+
${Colors.cyan}⠀⠀⢻⣿⡀⠀⠀⠀⣾⣿⡿⡆⢿⣴⣴⡇⠀⠀⠉⠁⠀⠀⢠⡟⠋⠁⠀⠀⠀⢸⣿
|
|
49
|
+
${Colors.blue}⠀⠀⠈⢿⣇⠀⠀⠐⣿⣿⡷⡆⠀⠉⠉⠀⠀⠀⠀⠀⠀⢀⡾⠁⠀⠀⠀⠀⠀⣾⡏
|
|
50
|
+
${Colors.magenta}⠀⠀⠀⠈⢿⣦⡀⠀⠉⠋⠉⠀⠀⠀⠀⠀⠀⠀⠀⠀⢠⠸⠁⠀⠀⠀⠀⠀⣼⡟⠀
|
|
51
|
+
${Colors.red}⠀⠀⠀⠀⠀⣹⣿⣶⣤⣀⡀⠀⠀⠀⠀⠀⠀⠀⠀⠂⠁⠀⠐⢧⡀⠀⢀⣾⠟⠀⠀
|
|
52
|
+
${Colors.yellow}⠀⠀⢀⣰⣾⠟⠉⠀⠀⠉⠉⠀⠐⠂⠀⠀⠀⠀⠀⠀⠀⠀⠀⠈⢿⣶⡟⠋⠀⠀⠀
|
|
53
|
+
${Colors.green}⣠⣶⡿⠋⠁⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⡀⠀⢈⣿⡆⠀⠀⠀⠀
|
|
54
|
+
${Colors.cyan}⢻⣧⣄⠀⠀⠀⣰⡇⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢸⣿⠀⠀⠀⠀
|
|
55
|
+
${Colors.blue}⠀⠉⠛⠿⣷⣶⣿⡇⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢸⣿⠀⠀⠀⠀
|
|
56
|
+
${Colors.magenta}⠀⠀⠀⠀⠀⠀⣿⡇⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣤⣤⣾⣿⠀⠀⠀⠀
|
|
57
|
+
${Colors.red}⠀⠀⠀⠀⠀⠀⢹⣿⣿⣿⣿⣷⣦⡀⠀⢀⣀⠀⠀⠀⣠⣴⣿⣿⣿⣿⣷⠀⠀⠀⠀
|
|
58
|
+
${Colors.yellow}⠀⠀⠀⠀⠀⠀⠀⠻⢿⣿⣿⣿⣿⠿⠿⣿⡿⠿⠿⠿⠿⣿⣿⣿⠿⠟⠁${Colors.reset}
|
|
46
59
|
`);
|
|
47
60
|
}
|
|
48
61
|
|
|
49
62
|
export function divider(): void {
|
|
50
|
-
console.log(dim('
|
|
63
|
+
console.log(dim('------------------------------------------------------------'));
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
export function statusBar(left: string, right: string): void {
|
|
67
|
+
const termWidth = process.stdout.columns || 80;
|
|
68
|
+
const leftLen = left.replace(/\x1b\[[0-9;]*m/g, '').length;
|
|
69
|
+
const rightLen = right.replace(/\x1b\[[0-9;]*m/g, '').length;
|
|
70
|
+
const spaces = Math.max(0, termWidth - leftLen - rightLen - 2);
|
|
71
|
+
console.log(`${Colors.bgBlue}${Colors.white} ${left}${' '.repeat(spaces)}${right} ${Colors.reset}`);
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
export function toolCard(toolName: string, args: any): void {
|
|
75
|
+
console.log(dim('┌─ TOOL CALL ──────────────────────────────────────'));
|
|
76
|
+
console.log(`${dim('│')} ${Colors.magenta}${bold(toolName)}${Colors.reset}`);
|
|
77
|
+
console.log(`${dim('│')} ${dim(JSON.stringify(args, null, 2).replace(/\n/g, '\n│ '))}`);
|
|
78
|
+
console.log(dim('└──────────────────────────────────────────────────'));
|
|
51
79
|
}
|
|
52
80
|
|
|
53
81
|
export function table(headers: string[], rows: string[][]): void {
|
|
@@ -72,7 +100,7 @@ export function table(headers: string[], rows: string[][]): void {
|
|
|
72
100
|
}
|
|
73
101
|
|
|
74
102
|
export class Spinner {
|
|
75
|
-
private frames = ['
|
|
103
|
+
private frames = ['-', '\\', '|', '/'];
|
|
76
104
|
private currentFrame = 0;
|
|
77
105
|
private timer: NodeJS.Timeout | null = null;
|
|
78
106
|
private message = '';
|
|
@@ -82,9 +110,13 @@ export class Spinner {
|
|
|
82
110
|
if (this.timer) clearInterval(this.timer);
|
|
83
111
|
|
|
84
112
|
this.timer = setInterval(() => {
|
|
85
|
-
process.stdout.write(`\r${Colors.cyan}${this.frames[this.currentFrame]}${Colors.reset} ${this.message}`);
|
|
113
|
+
process.stdout.write(`\r${Colors.cyan}[${this.frames[this.currentFrame]}]${Colors.reset} ${this.message}`);
|
|
86
114
|
this.currentFrame = (this.currentFrame + 1) % this.frames.length;
|
|
87
|
-
},
|
|
115
|
+
}, 100);
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
update(msg: string): void {
|
|
119
|
+
this.message = msg;
|
|
88
120
|
}
|
|
89
121
|
|
|
90
122
|
stop(msg?: string): void {
|
|
@@ -100,10 +132,10 @@ export class Spinner {
|
|
|
100
132
|
}
|
|
101
133
|
|
|
102
134
|
succeed(msg: string): void {
|
|
103
|
-
this.stop(`${Colors.green}
|
|
135
|
+
this.stop(`${Colors.green}[OK]${Colors.reset} ${msg}`);
|
|
104
136
|
}
|
|
105
137
|
|
|
106
138
|
fail(msg: string): void {
|
|
107
|
-
this.stop(`${Colors.red}
|
|
139
|
+
this.stop(`${Colors.red}[FAIL]${Colors.reset} ${msg}`);
|
|
108
140
|
}
|
|
109
141
|
}
|