expxagents 0.29.2 → 0.29.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
|
@@ -2,32 +2,57 @@ import readline from 'node:readline';
|
|
|
2
2
|
import path from 'node:path';
|
|
3
3
|
import dotenv from 'dotenv';
|
|
4
4
|
import { AgentRunner, SessionManager, SUPPORTED_MODELS, DEFAULT_MODEL } from '@expxagents/agent';
|
|
5
|
-
|
|
5
|
+
import { getVersion } from '../utils/version.js';
|
|
6
|
+
const C = {
|
|
6
7
|
reset: '\x1b[0m',
|
|
7
8
|
dim: '\x1b[2m',
|
|
8
9
|
green: '\x1b[32m',
|
|
9
10
|
cyan: '\x1b[36m',
|
|
10
11
|
yellow: '\x1b[33m',
|
|
11
12
|
magenta: '\x1b[35m',
|
|
13
|
+
blue: '\x1b[34m',
|
|
14
|
+
white: '\x1b[37m',
|
|
12
15
|
bold: '\x1b[1m',
|
|
16
|
+
bgCyan: '\x1b[46m',
|
|
17
|
+
bgBlue: '\x1b[44m',
|
|
13
18
|
};
|
|
14
|
-
function printBanner(model) {
|
|
19
|
+
function printBanner(model, version) {
|
|
15
20
|
const modelInfo = SUPPORTED_MODELS.find(m => m.id === model);
|
|
16
21
|
const label = modelInfo?.name ?? model;
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
console.log(
|
|
20
|
-
console.log(`${
|
|
22
|
+
const cwd = process.cwd();
|
|
23
|
+
const dir = cwd.split('/').slice(-2).join('/');
|
|
24
|
+
console.log('');
|
|
25
|
+
console.log(`${C.cyan} ╔══════════════════════════════════════════════════╗${C.reset}`);
|
|
26
|
+
console.log(`${C.cyan} ║${C.reset} ${C.cyan}║${C.reset}`);
|
|
27
|
+
console.log(`${C.cyan} ║${C.reset} ${C.bold}${C.cyan}▓▓▓ ExpxAgents CLI ▓▓▓${C.reset} ${C.cyan}║${C.reset}`);
|
|
28
|
+
console.log(`${C.cyan} ║${C.reset} ${C.dim}AI Coding Agent — powered by OpenRouter${C.reset} ${C.cyan}║${C.reset}`);
|
|
29
|
+
console.log(`${C.cyan} ║${C.reset} ${C.cyan}║${C.reset}`);
|
|
30
|
+
console.log(`${C.cyan} ╚══════════════════════════════════════════════════╝${C.reset}`);
|
|
31
|
+
console.log('');
|
|
32
|
+
console.log(` ${C.dim}Model${C.reset} ${C.yellow}${label}${C.reset}`);
|
|
33
|
+
console.log(` ${C.dim}Dir${C.reset} ${C.white}${dir}${C.reset}`);
|
|
34
|
+
console.log(` ${C.dim}Version${C.reset} ${C.dim}v${version}${C.reset}`);
|
|
35
|
+
console.log(` ${C.dim}Tools${C.reset} ${C.green}14 tools${C.reset} ${C.dim}(files, bash, web, search)${C.reset}`);
|
|
36
|
+
console.log('');
|
|
37
|
+
console.log(` ${C.dim}Tips: ${C.bold}/help${C.reset}${C.dim} commands • ${C.bold}/models${C.reset}${C.dim} list models • ${C.bold}/quit${C.reset}${C.dim} exit${C.reset}`);
|
|
38
|
+
console.log(` ${C.dim}──────────────────────────────────────────────────${C.reset}`);
|
|
39
|
+
console.log('');
|
|
21
40
|
}
|
|
22
41
|
function printHelp() {
|
|
23
|
-
console.log(
|
|
24
|
-
${
|
|
25
|
-
${
|
|
26
|
-
${
|
|
27
|
-
${
|
|
28
|
-
${
|
|
29
|
-
${
|
|
30
|
-
`);
|
|
42
|
+
console.log('');
|
|
43
|
+
console.log(` ${C.bold}${C.cyan}Commands${C.reset}`);
|
|
44
|
+
console.log(` ${C.dim}──────────────────────────────────────${C.reset}`);
|
|
45
|
+
console.log(` ${C.cyan}/help${C.reset} Show this help`);
|
|
46
|
+
console.log(` ${C.cyan}/model ${C.dim}<id>${C.reset} Switch model`);
|
|
47
|
+
console.log(` ${C.cyan}/models${C.reset} List available models`);
|
|
48
|
+
console.log(` ${C.cyan}/clear${C.reset} Clear conversation`);
|
|
49
|
+
console.log(` ${C.cyan}/quit${C.reset} Exit`);
|
|
50
|
+
console.log('');
|
|
51
|
+
console.log(` ${C.bold}${C.cyan}Shortcuts${C.reset}`);
|
|
52
|
+
console.log(` ${C.dim}──────────────────────────────────────${C.reset}`);
|
|
53
|
+
console.log(` ${C.cyan}Ctrl+C${C.reset} Exit`);
|
|
54
|
+
console.log(` ${C.cyan}Ctrl+D${C.reset} Exit`);
|
|
55
|
+
console.log('');
|
|
31
56
|
}
|
|
32
57
|
export async function cliChatCommand(options) {
|
|
33
58
|
// Load .env from the user's current working directory (explicit path for npx compatibility)
|
|
@@ -55,7 +80,7 @@ export async function cliChatCommand(options) {
|
|
|
55
80
|
const summary = typeof args === 'object' && args !== null
|
|
56
81
|
? Object.entries(args).map(([k, v]) => `${k}=${String(v).slice(0, 60)}`).join(', ')
|
|
57
82
|
: String(args).slice(0, 80);
|
|
58
|
-
process.stderr.write(
|
|
83
|
+
process.stderr.write(` ${C.dim}${C.cyan}⚡${C.reset} ${C.dim}${tool}${C.reset} ${C.dim}${summary}${C.reset}\n`);
|
|
59
84
|
},
|
|
60
85
|
});
|
|
61
86
|
try {
|
|
@@ -69,11 +94,11 @@ export async function cliChatCommand(options) {
|
|
|
69
94
|
return;
|
|
70
95
|
}
|
|
71
96
|
// Interactive REPL mode
|
|
72
|
-
printBanner(model);
|
|
97
|
+
printBanner(model, getVersion());
|
|
73
98
|
const rl = readline.createInterface({
|
|
74
99
|
input: process.stdin,
|
|
75
100
|
output: process.stdout,
|
|
76
|
-
prompt: `${
|
|
101
|
+
prompt: `${C.bold}${C.cyan}❯${C.reset} `,
|
|
77
102
|
});
|
|
78
103
|
rl.prompt();
|
|
79
104
|
rl.on('line', async (line) => {
|
|
@@ -89,7 +114,7 @@ export async function cliChatCommand(options) {
|
|
|
89
114
|
case '/quit':
|
|
90
115
|
case '/exit':
|
|
91
116
|
case '/q':
|
|
92
|
-
console.log(
|
|
117
|
+
console.log(`\n ${C.dim}Goodbye! ${C.cyan}✦${C.reset}\n`);
|
|
93
118
|
process.exit(0);
|
|
94
119
|
break;
|
|
95
120
|
case '/help':
|
|
@@ -97,37 +122,37 @@ export async function cliChatCommand(options) {
|
|
|
97
122
|
rl.prompt();
|
|
98
123
|
return;
|
|
99
124
|
case '/models':
|
|
100
|
-
console.log(`\n${
|
|
125
|
+
console.log(`\n${C.bold}Available models:${C.reset}`);
|
|
101
126
|
for (const m of SUPPORTED_MODELS) {
|
|
102
|
-
const active = m.id === model ? ` ${
|
|
103
|
-
console.log(` ${
|
|
127
|
+
const active = m.id === model ? ` ${C.green}(active)${C.reset}` : '';
|
|
128
|
+
console.log(` ${C.cyan}${m.id}${C.reset} — ${m.name} (${(m.contextWindow / 1000).toFixed(0)}K ctx)${active}`);
|
|
104
129
|
}
|
|
105
130
|
console.log('');
|
|
106
131
|
rl.prompt();
|
|
107
132
|
return;
|
|
108
133
|
case '/model':
|
|
109
134
|
if (!args[0]) {
|
|
110
|
-
console.log(`Current model: ${
|
|
135
|
+
console.log(`Current model: ${C.yellow}${model}${C.reset}`);
|
|
111
136
|
}
|
|
112
137
|
else {
|
|
113
138
|
model = args[0];
|
|
114
139
|
const info = SUPPORTED_MODELS.find(m => m.id === model);
|
|
115
140
|
if (info) {
|
|
116
|
-
console.log(`${
|
|
141
|
+
console.log(`${C.green}Switched to ${info.name}${C.reset}`);
|
|
117
142
|
}
|
|
118
143
|
else {
|
|
119
|
-
console.log(`${
|
|
144
|
+
console.log(`${C.yellow}Warning: "${model}" is not in curated list. Tool use may not work.${C.reset}`);
|
|
120
145
|
}
|
|
121
146
|
}
|
|
122
147
|
rl.prompt();
|
|
123
148
|
return;
|
|
124
149
|
case '/clear':
|
|
125
150
|
sessionManager.create(sessionId, process.cwd());
|
|
126
|
-
console.log(`${
|
|
151
|
+
console.log(`${C.dim}Conversation cleared.${C.reset}`);
|
|
127
152
|
rl.prompt();
|
|
128
153
|
return;
|
|
129
154
|
default:
|
|
130
|
-
console.log(`${
|
|
155
|
+
console.log(`${C.dim}Unknown command: ${cmd}. Type /help for commands.${C.reset}`);
|
|
131
156
|
rl.prompt();
|
|
132
157
|
return;
|
|
133
158
|
}
|
|
@@ -146,11 +171,11 @@ export async function cliChatCommand(options) {
|
|
|
146
171
|
const summary = typeof args === 'object' && args !== null
|
|
147
172
|
? Object.entries(args).map(([k, v]) => `${k}=${String(v).slice(0, 60)}`).join(', ')
|
|
148
173
|
: String(args).slice(0, 80);
|
|
149
|
-
process.stderr.write(
|
|
174
|
+
process.stderr.write(` ${C.dim}${C.cyan}⚡${C.reset} ${C.dim}${tool}${C.reset} ${C.dim}${summary}${C.reset}\n`);
|
|
150
175
|
},
|
|
151
176
|
onAskUser: async (question) => {
|
|
152
177
|
return new Promise((resolve) => {
|
|
153
|
-
rl.question(
|
|
178
|
+
rl.question(`\n ${C.magenta}? ${question}${C.reset}\n ${C.bold}${C.cyan}❯${C.reset} `, resolve);
|
|
154
179
|
});
|
|
155
180
|
},
|
|
156
181
|
});
|
|
@@ -159,12 +184,12 @@ export async function cliChatCommand(options) {
|
|
|
159
184
|
console.log('\n');
|
|
160
185
|
}
|
|
161
186
|
catch (err) {
|
|
162
|
-
console.error(`\n${
|
|
187
|
+
console.error(`\n${C.yellow}Error: ${err instanceof Error ? err.message : String(err)}${C.reset}\n`);
|
|
163
188
|
}
|
|
164
189
|
rl.prompt();
|
|
165
190
|
});
|
|
166
191
|
rl.on('close', () => {
|
|
167
|
-
console.log(`\n${
|
|
192
|
+
console.log(`\n${C.dim}Goodbye!${C.reset}`);
|
|
168
193
|
process.exit(0);
|
|
169
194
|
});
|
|
170
195
|
}
|