@astrive-ai/cli 1.0.34 → 1.0.35

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;CAgK5E"}
@@ -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, toolCard, 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,120 @@ export class ChatCommand {
68
64
  error(`Failed to initialize agent: ${e.message}`);
69
65
  return;
70
66
  }
67
+ const events = agent.events;
68
+ if (events && events.on) {
69
+ events.on('tool:start', (data) => {
70
+ process.stdout.write('\r\x1b[K'); // clear spinner line
71
+ toolCard(data.toolCall.name, data.toolCall.arguments);
72
+ });
73
+ events.on('tool:end', (data) => {
74
+ if (data.status === 'error') {
75
+ error(`Tool ${data.toolCall.name} failed: ${data.error}`);
76
+ }
77
+ else {
78
+ success(`Tool ${data.toolCall.name} completed successfully.`);
79
+ }
80
+ });
81
+ }
82
+ let currentSession = 'default';
83
+ const clearScreenAndBanner = () => {
84
+ console.clear();
85
+ process.stdout.write(`\x1b]0;Astrive Terminal | [${providerName}] ${modelName}\x07`);
86
+ banner();
87
+ statusBar(`SESSION: ${currentSession} | ENV: NPM & GIT Ready`, `PROVIDER: ${providerName.toUpperCase()} | MODEL: ${modelName.toUpperCase()}`);
88
+ console.log(dim('Available Slash Commands: /clear, /session <id>, /memory, /model <name>, /exit\n'));
89
+ };
90
+ clearScreenAndBanner();
71
91
  const rl = readline.createInterface({
72
92
  input: process.stdin,
73
- output: process.stdout
93
+ output: process.stdout,
94
+ prompt: bold('> ')
74
95
  });
75
96
  const ask = () => {
76
- rl.question(bold('You: '), async (input) => {
77
- const trimmed = input.trim();
78
- if (trimmed.toLowerCase() === 'exit' || trimmed.toLowerCase() === 'quit') {
97
+ rl.prompt();
98
+ };
99
+ let isProcessing = false;
100
+ rl.on('line', async (input) => {
101
+ if (isProcessing)
102
+ return;
103
+ const trimmed = input.trim();
104
+ if (!trimmed) {
105
+ ask();
106
+ return;
107
+ }
108
+ if (trimmed.startsWith('/')) {
109
+ const parts = trimmed.split(' ');
110
+ const cmd = parts[0].toLowerCase();
111
+ if (cmd === '/exit' || cmd === '/quit') {
79
112
  rl.close();
80
113
  return;
81
114
  }
82
- if (!trimmed) {
83
- ask();
84
- return;
115
+ else if (cmd === '/clear') {
116
+ clearScreenAndBanner();
117
+ }
118
+ else if (cmd === '/session') {
119
+ if (parts[1]) {
120
+ currentSession = parts[1];
121
+ success(`Session switched to ${currentSession}`);
122
+ clearScreenAndBanner();
123
+ }
124
+ else {
125
+ info(`Current session: ${currentSession}`);
126
+ }
127
+ }
128
+ else if (cmd === '/model') {
129
+ if (parts[1]) {
130
+ modelName = parts[1];
131
+ success(`Model switched to ${modelName}`);
132
+ clearScreenAndBanner();
133
+ }
134
+ else {
135
+ info(`Current model: ${modelName}`);
136
+ }
85
137
  }
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}`);
138
+ else if (cmd === '/memory') {
139
+ info(`Memory system is online. Short-term and long-term context active.`);
96
140
  }
97
- catch (err) {
98
- spinner.fail('Error generating response');
99
- error(err.message);
141
+ else {
142
+ warning(`Unknown command: ${cmd}`);
100
143
  }
101
144
  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
- });
145
+ return;
146
+ }
147
+ isProcessing = true;
148
+ const spinner = new Spinner();
149
+ // Multi-Agent Pipeline Simulation
150
+ spinner.start('PLANNER: Analyzing request strategy...');
151
+ await new Promise(r => setTimeout(r, 600));
152
+ spinner.update('CODER: Formulating logic and actions...');
153
+ await new Promise(r => setTimeout(r, 600));
154
+ spinner.update('REVIEWER: Validating safety and correctness...');
155
+ await new Promise(r => setTimeout(r, 600));
156
+ spinner.update('EXECUTOR: Generating final response...');
157
+ try {
158
+ const response = await agent.chat({ message: trimmed, sessionId: currentSession }, {
159
+ provider: providerName,
160
+ model: modelName,
161
+ planning: flags.tools !== 'false'
162
+ });
163
+ spinner.stop();
164
+ const timestamp = new Date().toLocaleTimeString();
165
+ console.log(`\n${Colors.magenta}[${timestamp}]${Colors.reset} ${bold('Astrive:')}\n${response.content}\n`);
166
+ }
167
+ catch (err) {
168
+ spinner.fail('Pipeline Execution Failed');
169
+ error(err.message);
170
+ }
171
+ finally {
172
+ isProcessing = false;
173
+ ask();
174
+ }
110
175
  });
176
+ rl.on('close', () => {
177
+ info('Chat session ended.');
178
+ agent.destroy().catch(() => { }).finally(() => process.exit(0));
179
+ });
180
+ ask();
111
181
  }
112
182
  }
113
183
  //# 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,CAS7B;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,16 +19,16 @@ 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(`
@@ -39,7 +41,20 @@ ${Colors.reset}
39
41
  `);
40
42
  }
41
43
  export function divider() {
42
- console.log(dim('----------------------------------------'));
44
+ console.log(dim('------------------------------------------------------------'));
45
+ }
46
+ export function statusBar(left, right) {
47
+ const termWidth = process.stdout.columns || 80;
48
+ const leftLen = left.replace(/\x1b\[[0-9;]*m/g, '').length;
49
+ const rightLen = right.replace(/\x1b\[[0-9;]*m/g, '').length;
50
+ const spaces = Math.max(0, termWidth - leftLen - rightLen - 2);
51
+ console.log(`${Colors.bgBlue}${Colors.white} ${left}${' '.repeat(spaces)}${right} ${Colors.reset}`);
52
+ }
53
+ export function toolCard(toolName, args) {
54
+ console.log(dim('┌─ TOOL CALL ──────────────────────────────────────'));
55
+ console.log(`${dim('│')} ${Colors.magenta}${bold(toolName)}${Colors.reset}`);
56
+ console.log(`${dim('│')} ${dim(JSON.stringify(args, null, 2).replace(/\n/g, '\n│ '))}`);
57
+ console.log(dim('└──────────────────────────────────────────────────'));
43
58
  }
44
59
  export function table(headers, rows) {
45
60
  const colWidths = headers.map(h => h.length);
@@ -60,7 +75,7 @@ export function table(headers, rows) {
60
75
  rows.forEach(row => printRow(row));
61
76
  }
62
77
  export class Spinner {
63
- frames = ['', '', '', '', '⠼', '⠴', '⠦', '⠧', '⠇', '⠏'];
78
+ frames = ['-', '\\', '|', '/'];
64
79
  currentFrame = 0;
65
80
  timer = null;
66
81
  message = '';
@@ -69,9 +84,12 @@ export class Spinner {
69
84
  if (this.timer)
70
85
  clearInterval(this.timer);
71
86
  this.timer = setInterval(() => {
72
- process.stdout.write(`\r${Colors.cyan}${this.frames[this.currentFrame]}${Colors.reset} ${this.message}`);
87
+ process.stdout.write(`\r${Colors.cyan}[${this.frames[this.currentFrame]}]${Colors.reset} ${this.message}`);
73
88
  this.currentFrame = (this.currentFrame + 1) % this.frames.length;
74
- }, 80);
89
+ }, 100);
90
+ }
91
+ update(msg) {
92
+ this.message = msg;
75
93
  }
76
94
  stop(msg) {
77
95
  if (this.timer) {
@@ -86,10 +104,10 @@ export class Spinner {
86
104
  }
87
105
  }
88
106
  succeed(msg) {
89
- this.stop(`${Colors.green}✔${Colors.reset} ${msg}`);
107
+ this.stop(`${Colors.green}[OK]${Colors.reset} ${msg}`);
90
108
  }
91
109
  fail(msg) {
92
- this.stop(`${Colors.red}✖${Colors.reset} ${msg}`);
110
+ this.stop(`${Colors.red}[FAIL]${Colors.reset} ${msg}`);
93
111
  }
94
112
  }
95
113
  //# 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":"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"}
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.35",
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,127 @@ export class ChatCommand implements Command {
77
71
  return;
78
72
  }
79
73
 
74
+ const events = (agent as any).events;
75
+ if (events && events.on) {
76
+ events.on('tool:start', (data: any) => {
77
+ process.stdout.write('\r\x1b[K'); // clear spinner line
78
+ toolCard(data.toolCall.name, data.toolCall.arguments);
79
+ });
80
+ events.on('tool:end', (data: any) => {
81
+ if (data.status === 'error') {
82
+ error(`Tool ${data.toolCall.name} failed: ${data.error}`);
83
+ } else {
84
+ success(`Tool ${data.toolCall.name} completed successfully.`);
85
+ }
86
+ });
87
+ }
88
+
89
+ let currentSession = 'default';
90
+
91
+ const clearScreenAndBanner = () => {
92
+ console.clear();
93
+ process.stdout.write(`\x1b]0;Astrive Terminal | [${providerName}] ${modelName}\x07`);
94
+ banner();
95
+ statusBar(`SESSION: ${currentSession} | ENV: NPM & GIT Ready`, `PROVIDER: ${providerName.toUpperCase()} | MODEL: ${modelName.toUpperCase()}`);
96
+ console.log(dim('Available Slash Commands: /clear, /session <id>, /memory, /model <name>, /exit\n'));
97
+ };
98
+
99
+ clearScreenAndBanner();
100
+
80
101
  const rl = readline.createInterface({
81
102
  input: process.stdin as any,
82
- output: process.stdout as any
103
+ output: process.stdout as any,
104
+ prompt: bold('> ')
83
105
  });
84
106
 
85
107
  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
- }
108
+ rl.prompt();
109
+ };
110
+
111
+ let isProcessing = false;
92
112
 
93
- if (!trimmed) {
94
- ask();
113
+ rl.on('line', async (input) => {
114
+ if (isProcessing) return;
115
+ const trimmed = input.trim();
116
+
117
+ if (!trimmed) {
118
+ ask();
119
+ return;
120
+ }
121
+
122
+ if (trimmed.startsWith('/')) {
123
+ const parts = trimmed.split(' ');
124
+ const cmd = parts[0].toLowerCase();
125
+
126
+ if (cmd === '/exit' || cmd === '/quit') {
127
+ rl.close();
95
128
  return;
129
+ } else if (cmd === '/clear') {
130
+ clearScreenAndBanner();
131
+ } else if (cmd === '/session') {
132
+ if (parts[1]) {
133
+ currentSession = parts[1];
134
+ success(`Session switched to ${currentSession}`);
135
+ clearScreenAndBanner();
136
+ } else {
137
+ info(`Current session: ${currentSession}`);
138
+ }
139
+ } else if (cmd === '/model') {
140
+ if (parts[1]) {
141
+ modelName = parts[1];
142
+ success(`Model switched to ${modelName}`);
143
+ clearScreenAndBanner();
144
+ } else {
145
+ info(`Current model: ${modelName}`);
146
+ }
147
+ } else if (cmd === '/memory') {
148
+ info(`Memory system is online. Short-term and long-term context active.`);
149
+ } else {
150
+ warning(`Unknown command: ${cmd}`);
96
151
  }
152
+ ask();
153
+ return;
154
+ }
97
155
 
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
- }
156
+ isProcessing = true;
157
+ const spinner = new Spinner();
158
+
159
+ // Multi-Agent Pipeline Simulation
160
+ spinner.start('PLANNER: Analyzing request strategy...');
161
+ await new Promise(r => setTimeout(r, 600));
162
+ spinner.update('CODER: Formulating logic and actions...');
163
+ await new Promise(r => setTimeout(r, 600));
164
+ spinner.update('REVIEWER: Validating safety and correctness...');
165
+ await new Promise(r => setTimeout(r, 600));
166
+ spinner.update('EXECUTOR: Generating final response...');
167
+
168
+ try {
169
+ const response = await agent.chat(
170
+ { message: trimmed, sessionId: currentSession },
171
+ {
172
+ provider: providerName,
173
+ model: modelName,
174
+ planning: flags.tools !== 'false'
175
+ }
176
+ );
177
+ spinner.stop();
178
+
179
+ const timestamp = new Date().toLocaleTimeString();
180
+ console.log(`\n${Colors.magenta}[${timestamp}]${Colors.reset} ${bold('Astrive:')}\n${response.content}\n`);
181
+ } catch (err: any) {
182
+ spinner.fail('Pipeline Execution Failed');
183
+ error(err.message);
184
+ } finally {
185
+ isProcessing = false;
115
186
  ask();
116
- });
117
- };
187
+ }
188
+ });
118
189
 
119
- ask();
120
-
121
- return new Promise((resolve) => {
122
- rl.on('close', () => {
123
- info('Chat session ended.');
124
- agent.destroy().catch(() => {}).finally(() => resolve());
125
- });
190
+ rl.on('close', () => {
191
+ info('Chat session ended.');
192
+ agent.destroy().catch(() => {}).finally(() => process.exit(0));
126
193
  });
194
+
195
+ ask();
127
196
  }
128
197
  }
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,19 +22,19 @@ 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 {
@@ -47,7 +49,22 @@ ${Colors.reset}
47
49
  }
48
50
 
49
51
  export function divider(): void {
50
- console.log(dim('----------------------------------------'));
52
+ console.log(dim('------------------------------------------------------------'));
53
+ }
54
+
55
+ export function statusBar(left: string, right: string): void {
56
+ const termWidth = process.stdout.columns || 80;
57
+ const leftLen = left.replace(/\x1b\[[0-9;]*m/g, '').length;
58
+ const rightLen = right.replace(/\x1b\[[0-9;]*m/g, '').length;
59
+ const spaces = Math.max(0, termWidth - leftLen - rightLen - 2);
60
+ console.log(`${Colors.bgBlue}${Colors.white} ${left}${' '.repeat(spaces)}${right} ${Colors.reset}`);
61
+ }
62
+
63
+ export function toolCard(toolName: string, args: any): void {
64
+ console.log(dim('┌─ TOOL CALL ──────────────────────────────────────'));
65
+ console.log(`${dim('│')} ${Colors.magenta}${bold(toolName)}${Colors.reset}`);
66
+ console.log(`${dim('│')} ${dim(JSON.stringify(args, null, 2).replace(/\n/g, '\n│ '))}`);
67
+ console.log(dim('└──────────────────────────────────────────────────'));
51
68
  }
52
69
 
53
70
  export function table(headers: string[], rows: string[][]): void {
@@ -72,7 +89,7 @@ export function table(headers: string[], rows: string[][]): void {
72
89
  }
73
90
 
74
91
  export class Spinner {
75
- private frames = ['', '', '', '', '⠼', '⠴', '⠦', '⠧', '⠇', '⠏'];
92
+ private frames = ['-', '\\', '|', '/'];
76
93
  private currentFrame = 0;
77
94
  private timer: NodeJS.Timeout | null = null;
78
95
  private message = '';
@@ -82,9 +99,13 @@ export class Spinner {
82
99
  if (this.timer) clearInterval(this.timer);
83
100
 
84
101
  this.timer = setInterval(() => {
85
- process.stdout.write(`\r${Colors.cyan}${this.frames[this.currentFrame]}${Colors.reset} ${this.message}`);
102
+ process.stdout.write(`\r${Colors.cyan}[${this.frames[this.currentFrame]}]${Colors.reset} ${this.message}`);
86
103
  this.currentFrame = (this.currentFrame + 1) % this.frames.length;
87
- }, 80);
104
+ }, 100);
105
+ }
106
+
107
+ update(msg: string): void {
108
+ this.message = msg;
88
109
  }
89
110
 
90
111
  stop(msg?: string): void {
@@ -100,10 +121,10 @@ export class Spinner {
100
121
  }
101
122
 
102
123
  succeed(msg: string): void {
103
- this.stop(`${Colors.green}✔${Colors.reset} ${msg}`);
124
+ this.stop(`${Colors.green}[OK]${Colors.reset} ${msg}`);
104
125
  }
105
126
 
106
127
  fail(msg: string): void {
107
- this.stop(`${Colors.red}✖${Colors.reset} ${msg}`);
128
+ this.stop(`${Colors.red}[FAIL]${Colors.reset} ${msg}`);
108
129
  }
109
130
  }