@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.
@@ -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;CA2F5E"}
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"}
@@ -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
- const modelName = flags.model || (providerName === 'zellrayy' ? 'claude-opus-4-8' : 'llama-3.3-70b-versatile');
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: 'info',
49
+ level: 'error', // Suppress internal logger for cleaner UI
54
50
  prefix: 'Astrive',
55
51
  colors: true,
56
- timestamp: true
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.question(bold('You: '), async (input) => {
77
- const trimmed = input.trim();
78
- if (trimmed.toLowerCase() === 'exit' || trimmed.toLowerCase() === 'quit') {
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 (!trimmed) {
83
- ask();
84
- return;
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
- const spinner = new Spinner();
87
- spinner.start('Thinking...');
88
- try {
89
- const response = await agent.chat({ message: trimmed }, {
90
- provider: providerName,
91
- model: modelName,
92
- planning: flags.tools !== 'false'
93
- });
94
- spinner.stop();
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
- catch (err) {
98
- spinner.fail('Error generating response');
99
- error(err.message);
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
- ask();
105
- return new Promise((resolve) => {
106
- rl.on('close', () => {
107
- info('Chat session ended.');
108
- agent.destroy().catch(() => { }).finally(() => resolve());
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":"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"}
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;;;;;;;;;;;CAWlB,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,CAS7B;AAED,wBAAgB,OAAO,IAAI,IAAI,CAE9B;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,CAAsD;IACpE,OAAO,CAAC,YAAY,CAAK;IACzB,OAAO,CAAC,KAAK,CAA+B;IAC5C,OAAO,CAAC,OAAO,CAAM;IAErB,KAAK,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI;IAUxB,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"}
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}✔${Colors.reset} ${msg}`);
22
+ console.log(`${Colors.green}[OK]${Colors.reset} ${msg}`);
21
23
  }
22
24
  export function error(msg) {
23
- console.log(`${Colors.red}✖${Colors.reset} ${msg}`);
25
+ console.log(`${Colors.red}[FAIL]${Colors.reset} ${msg}`);
24
26
  }
25
27
  export function warning(msg) {
26
- console.log(`${Colors.yellow}⚠${Colors.reset} ${msg}`);
28
+ console.log(`${Colors.yellow}[WARN]${Colors.reset} ${msg}`);
27
29
  }
28
30
  export function info(msg) {
29
- console.log(`${Colors.cyan}ℹ${Colors.reset} ${msg}`);
31
+ console.log(`${Colors.cyan}[INFO]${Colors.reset} ${msg}`);
30
32
  }
31
33
  export function banner() {
32
34
  console.log(`
33
- ${Colors.cyan}${Colors.bold}
34
- ___ __ _
35
- / _ | ___ / /_ ____(_) _____
36
- / __ |(_-</ __/ __/ / |/ / -_)
37
- /_/ |_/___/\\__/_/ /_/|___/\\__/
38
- ${Colors.reset}
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
- }, 80);
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}✔${Colors.reset} ${msg}`);
118
+ this.stop(`${Colors.green}[OK]${Colors.reset} ${msg}`);
90
119
  }
91
120
  fail(msg) {
92
- this.stop(`${Colors.red}✖${Colors.reset} ${msg}`);
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;CAClB,CAAC;AAEF,MAAM,UAAU,IAAI,CAAC,IAAY;IAC/B,OAAO,GAAG,MAAM,CAAC,IAAI,GAAG,IAAI,GAAG,MAAM,CAAC,KAAK,EAAE,CAAC;AAChD,CAAC;AAED,MAAM,UAAU,GAAG,CAAC,IAAY;IAC9B,OAAO,GAAG,MAAM,CAAC,GAAG,GAAG,IAAI,GAAG,MAAM,CAAC,KAAK,EAAE,CAAC;AAC/C,CAAC;AAED,MAAM,UAAU,OAAO,CAAC,GAAW;IACjC,OAAO,CAAC,GAAG,CAAC,GAAG,MAAM,CAAC,KAAK,IAAI,MAAM,CAAC,KAAK,IAAI,GAAG,EAAE,CAAC,CAAC;AACxD,CAAC;AAED,MAAM,UAAU,KAAK,CAAC,GAAW;IAC/B,OAAO,CAAC,GAAG,CAAC,GAAG,MAAM,CAAC,GAAG,IAAI,MAAM,CAAC,KAAK,IAAI,GAAG,EAAE,CAAC,CAAC;AACtD,CAAC;AAED,MAAM,UAAU,OAAO,CAAC,GAAW;IACjC,OAAO,CAAC,GAAG,CAAC,GAAG,MAAM,CAAC,MAAM,IAAI,MAAM,CAAC,KAAK,IAAI,GAAG,EAAE,CAAC,CAAC;AACzD,CAAC;AAED,MAAM,UAAU,IAAI,CAAC,GAAW;IAC9B,OAAO,CAAC,GAAG,CAAC,GAAG,MAAM,CAAC,IAAI,IAAI,MAAM,CAAC,KAAK,IAAI,GAAG,EAAE,CAAC,CAAC;AACvD,CAAC;AAED,MAAM,UAAU,MAAM;IACpB,OAAO,CAAC,GAAG,CAAC;EACZ,MAAM,CAAC,IAAI,GAAG,MAAM,CAAC,IAAI;;;;;EAKzB,MAAM,CAAC,KAAK;GACX,CAAC,CAAC;AACL,CAAC;AAED,MAAM,UAAU,OAAO;IACrB,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,0CAA0C,CAAC,CAAC,CAAC;AAC/D,CAAC;AAED,MAAM,UAAU,KAAK,CAAC,OAAiB,EAAE,IAAgB;IACvD,MAAM,SAAS,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC;IAC7C,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE;QACjB,GAAG,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,CAAC,EAAE,EAAE;YACtB,SAAS,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,CAAC;QAC7D,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,MAAM,QAAQ,GAAG,CAAC,GAAa,EAAE,QAAQ,GAAG,KAAK,EAAE,EAAE;QACnD,MAAM,SAAS,GAAG,GAAG,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC,EAAE,EAAE;YACpC,MAAM,MAAM,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;YACrD,OAAO,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC;QAC1C,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACZ,OAAO,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;IACzB,CAAC,CAAC;IAEF,QAAQ,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;IACxB,OAAO,EAAE,CAAC;IACV,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC;AACrC,CAAC;AAED,MAAM,OAAO,OAAO;IACV,MAAM,GAAG,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC;IAC5D,YAAY,GAAG,CAAC,CAAC;IACjB,KAAK,GAA0B,IAAI,CAAC;IACpC,OAAO,GAAG,EAAE,CAAC;IAErB,KAAK,CAAC,GAAW;QACf,IAAI,CAAC,OAAO,GAAG,GAAG,CAAC;QACnB,IAAI,IAAI,CAAC,KAAK;YAAE,aAAa,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAE1C,IAAI,CAAC,KAAK,GAAG,WAAW,CAAC,GAAG,EAAE;YAC5B,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,MAAM,CAAC,IAAI,GAAG,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,YAAY,CAAC,GAAG,MAAM,CAAC,KAAK,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC,CAAC;YACzG,IAAI,CAAC,YAAY,GAAG,CAAC,IAAI,CAAC,YAAY,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC;QACnE,CAAC,EAAE,EAAE,CAAC,CAAC;IACT,CAAC;IAED,IAAI,CAAC,GAAY;QACf,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;YACf,aAAa,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YAC1B,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC;QACpB,CAAC;QACD,IAAI,GAAG,EAAE,CAAC;YACR,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,GAAG,IAAI,CAAC,CAAC;QACrC,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC,CAAC,aAAa;QACjD,CAAC;IACH,CAAC;IAED,OAAO,CAAC,GAAW;QACjB,IAAI,CAAC,IAAI,CAAC,GAAG,MAAM,CAAC,KAAK,IAAI,MAAM,CAAC,KAAK,IAAI,GAAG,EAAE,CAAC,CAAC;IACtD,CAAC;IAED,IAAI,CAAC,GAAW;QACd,IAAI,CAAC,IAAI,CAAC,GAAG,MAAM,CAAC,GAAG,IAAI,MAAM,CAAC,KAAK,IAAI,GAAG,EAAE,CAAC,CAAC;IACpD,CAAC;CACF"}
1
+ {"version":3,"file":"ui.js","sourceRoot":"","sources":["../src/ui.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@astrive-ai/cli",
3
- "version": "1.0.34",
3
+ "version": "1.0.36",
4
4
  "type": "module",
5
5
  "bin": {
6
6
  "astrive": "dist/bin.js"
@@ -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
- const modelName = flags.model || (providerName === 'zellrayy' ? 'claude-opus-4-8' : 'llama-3.3-70b-versatile');
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: 'info',
55
+ level: 'error', // Suppress internal logger for cleaner UI
62
56
  prefix: 'Astrive',
63
57
  colors: true,
64
- timestamp: true
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.question(bold('You: '), async (input) => {
87
- const trimmed = input.trim();
88
- if (trimmed.toLowerCase() === 'exit' || trimmed.toLowerCase() === 'quit') {
89
- rl.close();
90
- return;
91
- }
105
+ rl.prompt();
106
+ };
107
+
108
+ let isProcessing = false;
92
109
 
93
- if (!trimmed) {
94
- ask();
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
- const spinner = new Spinner();
99
- spinner.start('Thinking...');
100
- try {
101
- const response = await agent.chat(
102
- { message: trimmed },
103
- {
104
- provider: providerName,
105
- model: modelName,
106
- planning: flags.tools !== 'false'
107
- }
108
- );
109
- spinner.stop();
110
- console.log(`${bold('Astrive:')} ${response.content}`);
111
- } catch (err: any) {
112
- spinner.fail('Error generating response');
113
- error(err.message);
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
- ask();
120
-
121
- return new Promise((resolve) => {
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}✔${Colors.reset} ${msg}`);
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}✖${Colors.reset} ${msg}`);
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}⚠${Colors.reset} ${msg}`);
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}ℹ${Colors.reset} ${msg}`);
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}${Colors.bold}
41
- ___ __ _
42
- / _ | ___ / /_ ____(_) _____
43
- / __ |(_-</ __/ __/ / |/ / -_)
44
- /_/ |_/___/\\__/_/ /_/|___/\\__/
45
- ${Colors.reset}
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
- }, 80);
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}✔${Colors.reset} ${msg}`);
135
+ this.stop(`${Colors.green}[OK]${Colors.reset} ${msg}`);
104
136
  }
105
137
 
106
138
  fail(msg: string): void {
107
- this.stop(`${Colors.red}✖${Colors.reset} ${msg}`);
139
+ this.stop(`${Colors.red}[FAIL]${Colors.reset} ${msg}`);
108
140
  }
109
141
  }