@astrive-ai/cli 1.0.33 → 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.
- package/dist/commands/chat.d.ts.map +1 -1
- package/dist/commands/chat.js +106 -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 +28 -10
- package/dist/ui.js.map +1 -1
- package/package.json +1 -1
- package/src/commands/chat.ts +114 -45
- package/src/ui.ts +31 -10
|
@@ -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;CAgK5E"}
|
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, 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
|
-
|
|
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,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.
|
|
77
|
-
|
|
78
|
-
|
|
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 (
|
|
83
|
-
|
|
84
|
-
|
|
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
|
-
|
|
87
|
-
|
|
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
|
-
|
|
98
|
-
|
|
99
|
-
error(err.message);
|
|
141
|
+
else {
|
|
142
|
+
warning(`Unknown command: ${cmd}`);
|
|
100
143
|
}
|
|
101
144
|
ask();
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
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":"AACA,OAAO,
|
|
1
|
+
{"version":3,"file":"chat.js","sourceRoot":"","sources":["../../src/commands/chat.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,GAAG,EAAE,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,UAAU,CAAC;AAClH,OAAO,KAAK,QAAQ,MAAM,UAAU,CAAC;AACrC,OAAO,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC;AAE9C,OAAO,KAAK,EAAE,MAAM,IAAI,CAAC;AACzB,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAE7B,SAAS,OAAO;IACd,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,MAAM,CAAC,CAAC;IACpD,IAAI,EAAE,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;QAC3B,MAAM,OAAO,GAAG,EAAE,CAAC,YAAY,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;QACjD,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE;YACjC,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,+BAA+B,CAAC,CAAC;YAC1D,IAAI,KAAK,EAAE,CAAC;gBACV,MAAM,GAAG,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;gBACrB,IAAI,KAAK,GAAG,KAAK,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;gBAC3B,IAAI,KAAK,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC;oBAAE,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;gBAC7E,IAAI,KAAK,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC;oBAAE,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;gBAC7E,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC;oBAAE,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC;YAClD,CAAC;QACH,CAAC,CAAC,CAAC;IACL,CAAC;AACH,CAAC;AAGD,MAAM,OAAO,WAAW;IACtB,IAAI,GAAG,MAAM,CAAC;IACd,WAAW,GAAG,mCAAmC,CAAC;IAClD,KAAK,GAAW;QACd,EAAE,IAAI,EAAE,UAAU,EAAE,WAAW,EAAE,oBAAoB,EAAE,IAAI,EAAE,QAAQ,EAAE;QACvE,EAAE,IAAI,EAAE,OAAO,EAAE,WAAW,EAAE,cAAc,EAAE,IAAI,EAAE,QAAQ,EAAE;QAC9D,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,eAAe,EAAE,IAAI,EAAE,QAAQ,EAAE;QAChE,EAAE,IAAI,EAAE,OAAO,EAAE,WAAW,EAAE,cAAc,EAAE,IAAI,EAAE,SAAS,EAAE;KAChE,CAAC;IAEF,KAAK,CAAC,OAAO,CAAC,IAAc,EAAE,KAA6B;QACzD,OAAO,EAAE,CAAC;QACV,MAAM,YAAY,GAAG,KAAK,CAAC,QAAQ,IAAI,UAAU,CAAC;QAClD,IAAI,SAAS,GAAG,KAAK,CAAC,KAAK,IAAI,CAAC,YAAY,KAAK,UAAU,CAAC,CAAC,CAAC,iBAAiB,CAAC,CAAC,CAAC,yBAAyB,CAAC,CAAC;QAE7G,IAAI,YAAY,KAAK,MAAM,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,YAAY,EAAE,CAAC;YACzD,KAAK,CAAC,mFAAmF,CAAC,CAAC;YAC3F,OAAO;QACT,CAAC;QAED,MAAM,eAAe,GAAwB,EAAE,CAAC;QAChD,IAAI,OAAO,CAAC,GAAG,CAAC,YAAY,EAAE,CAAC;YAC7B,eAAe,CAAC,IAAI,GAAG,EAAE,MAAM,EAAE,OAAO,CAAC,GAAG,CAAC,YAAY,EAAE,CAAC;QAC9D,CAAC;QAED,MAAM,MAAM,GAAkB;YAC5B,SAAS,EAAE,eAAe;YAC1B,MAAM,EAAE;gBACN,KAAK,EAAE,OAAO,EAAE,0CAA0C;gBAC1D,MAAM,EAAE,SAAS;gBACjB,MAAM,EAAE,IAAI;gBACZ,SAAS,EAAE,KAAK;aACjB;YACD,MAAM,EAAE;gBACN,OAAO,EAAE,IAAI;aACd;YACD,YAAY,EAAE,KAAK,CAAC,MAAM,IAAI,4KAA4K;SAC3M,CAAC;QAEF,MAAM,KAAK,GAAG,IAAI,SAAS,CAAC,MAAM,CAAC,CAAC;QACpC,IAAI,CAAC;YACH,MAAM,KAAK,CAAC,IAAI,EAAE,CAAC;QACrB,CAAC;QAAC,OAAO,CAAM,EAAE,CAAC;YAChB,KAAK,CAAC,+BAA+B,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC;YAClD,OAAO;QACT,CAAC;QAED,MAAM,MAAM,GAAI,KAAa,CAAC,MAAM,CAAC;QACrC,IAAI,MAAM,IAAI,MAAM,CAAC,EAAE,EAAE,CAAC;YACxB,MAAM,CAAC,EAAE,CAAC,YAAY,EAAE,CAAC,IAAS,EAAE,EAAE;gBACpC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC,CAAC,qBAAqB;gBACvD,QAAQ,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC;YACxD,CAAC,CAAC,CAAC;YACH,MAAM,CAAC,EAAE,CAAC,UAAU,EAAE,CAAC,IAAS,EAAE,EAAE;gBAClC,IAAI,IAAI,CAAC,MAAM,KAAK,OAAO,EAAE,CAAC;oBAC5B,KAAK,CAAC,QAAQ,IAAI,CAAC,QAAQ,CAAC,IAAI,YAAY,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC;gBAC5D,CAAC;qBAAM,CAAC;oBACN,OAAO,CAAC,QAAQ,IAAI,CAAC,QAAQ,CAAC,IAAI,0BAA0B,CAAC,CAAC;gBAChE,CAAC;YACH,CAAC,CAAC,CAAC;QACL,CAAC;QAED,IAAI,cAAc,GAAG,SAAS,CAAC;QAE/B,MAAM,oBAAoB,GAAG,GAAG,EAAE;YAChC,OAAO,CAAC,KAAK,EAAE,CAAC;YAChB,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,8BAA8B,YAAY,KAAK,SAAS,MAAM,CAAC,CAAC;YACrF,MAAM,EAAE,CAAC;YACT,SAAS,CAAC,YAAY,cAAc,yBAAyB,EAAE,aAAa,YAAY,CAAC,WAAW,EAAE,aAAa,SAAS,CAAC,WAAW,EAAE,EAAE,CAAC,CAAC;YAC9I,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,kFAAkF,CAAC,CAAC,CAAC;QACvG,CAAC,CAAC;QAEF,oBAAoB,EAAE,CAAC;QAEvB,MAAM,EAAE,GAAG,QAAQ,CAAC,eAAe,CAAC;YAClC,KAAK,EAAE,OAAO,CAAC,KAAY;YAC3B,MAAM,EAAE,OAAO,CAAC,MAAa;YAC7B,MAAM,EAAE,IAAI,CAAC,IAAI,CAAC;SACnB,CAAC,CAAC;QAEH,MAAM,GAAG,GAAG,GAAG,EAAE;YACf,EAAE,CAAC,MAAM,EAAE,CAAC;QACd,CAAC,CAAC;QAEF,IAAI,YAAY,GAAG,KAAK,CAAC;QAEzB,EAAE,CAAC,EAAE,CAAC,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE;YAC5B,IAAI,YAAY;gBAAE,OAAO;YACzB,MAAM,OAAO,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC;YAE7B,IAAI,CAAC,OAAO,EAAE,CAAC;gBACb,GAAG,EAAE,CAAC;gBACN,OAAO;YACT,CAAC;YAED,IAAI,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;gBAC5B,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;gBACjC,MAAM,GAAG,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC;gBAEnC,IAAI,GAAG,KAAK,OAAO,IAAI,GAAG,KAAK,OAAO,EAAE,CAAC;oBACvC,EAAE,CAAC,KAAK,EAAE,CAAC;oBACX,OAAO;gBACT,CAAC;qBAAM,IAAI,GAAG,KAAK,QAAQ,EAAE,CAAC;oBAC5B,oBAAoB,EAAE,CAAC;gBACzB,CAAC;qBAAM,IAAI,GAAG,KAAK,UAAU,EAAE,CAAC;oBAC9B,IAAI,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC;wBACb,cAAc,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;wBAC1B,OAAO,CAAC,uBAAuB,cAAc,EAAE,CAAC,CAAC;wBACjD,oBAAoB,EAAE,CAAC;oBACzB,CAAC;yBAAM,CAAC;wBACN,IAAI,CAAC,oBAAoB,cAAc,EAAE,CAAC,CAAC;oBAC7C,CAAC;gBACH,CAAC;qBAAM,IAAI,GAAG,KAAK,QAAQ,EAAE,CAAC;oBAC5B,IAAI,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC;wBACb,SAAS,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;wBACrB,OAAO,CAAC,qBAAqB,SAAS,EAAE,CAAC,CAAC;wBAC1C,oBAAoB,EAAE,CAAC;oBACzB,CAAC;yBAAM,CAAC;wBACN,IAAI,CAAC,kBAAkB,SAAS,EAAE,CAAC,CAAC;oBACtC,CAAC;gBACH,CAAC;qBAAM,IAAI,GAAG,KAAK,SAAS,EAAE,CAAC;oBAC7B,IAAI,CAAC,mEAAmE,CAAC,CAAC;gBAC5E,CAAC;qBAAM,CAAC;oBACN,OAAO,CAAC,oBAAoB,GAAG,EAAE,CAAC,CAAC;gBACrC,CAAC;gBACD,GAAG,EAAE,CAAC;gBACN,OAAO;YACT,CAAC;YAED,YAAY,GAAG,IAAI,CAAC;YACpB,MAAM,OAAO,GAAG,IAAI,OAAO,EAAE,CAAC;YAE9B,kCAAkC;YAClC,OAAO,CAAC,KAAK,CAAC,wCAAwC,CAAC,CAAC;YACxD,MAAM,IAAI,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,UAAU,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC;YAC3C,OAAO,CAAC,MAAM,CAAC,yCAAyC,CAAC,CAAC;YAC1D,MAAM,IAAI,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,UAAU,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC;YAC3C,OAAO,CAAC,MAAM,CAAC,gDAAgD,CAAC,CAAC;YACjE,MAAM,IAAI,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,UAAU,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC;YAC3C,OAAO,CAAC,MAAM,CAAC,wCAAwC,CAAC,CAAC;YAEzD,IAAI,CAAC;gBACH,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,IAAI,CAC/B,EAAE,OAAO,EAAE,OAAO,EAAE,SAAS,EAAE,cAAc,EAAE,EAC/C;oBACE,QAAQ,EAAE,YAAY;oBACtB,KAAK,EAAE,SAAS;oBAChB,QAAQ,EAAE,KAAK,CAAC,KAAK,KAAK,OAAO;iBAClC,CACF,CAAC;gBACF,OAAO,CAAC,IAAI,EAAE,CAAC;gBAEf,MAAM,SAAS,GAAG,IAAI,IAAI,EAAE,CAAC,kBAAkB,EAAE,CAAC;gBAClD,OAAO,CAAC,GAAG,CAAC,KAAK,MAAM,CAAC,OAAO,IAAI,SAAS,IAAI,MAAM,CAAC,KAAK,IAAI,IAAI,CAAC,UAAU,CAAC,KAAK,QAAQ,CAAC,OAAO,IAAI,CAAC,CAAC;YAC7G,CAAC;YAAC,OAAO,GAAQ,EAAE,CAAC;gBAClB,OAAO,CAAC,IAAI,CAAC,2BAA2B,CAAC,CAAC;gBAC1C,KAAK,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;YACrB,CAAC;oBAAS,CAAC;gBACT,YAAY,GAAG,KAAK,CAAC;gBACrB,GAAG,EAAE,CAAC;YACR,CAAC;QACH,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,EAAE,CAAC,OAAO,EAAE,GAAG,EAAE;YAClB,IAAI,CAAC,qBAAqB,CAAC,CAAC;YAC5B,KAAK,CAAC,OAAO,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;QACjE,CAAC,CAAC,CAAC;QAEH,GAAG,EAAE,CAAC;IACR,CAAC;CACF"}
|
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,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}
|
|
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(`
|
|
@@ -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
|
-
},
|
|
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}
|
|
107
|
+
this.stop(`${Colors.green}[OK]${Colors.reset} ${msg}`);
|
|
90
108
|
}
|
|
91
109
|
fail(msg) {
|
|
92
|
-
this.stop(`${Colors.red}
|
|
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":"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,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.
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
return;
|
|
91
|
-
}
|
|
108
|
+
rl.prompt();
|
|
109
|
+
};
|
|
110
|
+
|
|
111
|
+
let isProcessing = false;
|
|
92
112
|
|
|
93
|
-
|
|
94
|
-
|
|
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
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
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
|
-
|
|
120
|
-
|
|
121
|
-
|
|
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}
|
|
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 {
|
|
@@ -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
|
-
},
|
|
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}
|
|
124
|
+
this.stop(`${Colors.green}[OK]${Colors.reset} ${msg}`);
|
|
104
125
|
}
|
|
105
126
|
|
|
106
127
|
fail(msg: string): void {
|
|
107
|
-
this.stop(`${Colors.red}
|
|
128
|
+
this.stop(`${Colors.red}[FAIL]${Colors.reset} ${msg}`);
|
|
108
129
|
}
|
|
109
130
|
}
|