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
- const COLORS = {
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
- console.log(`\n${COLORS.bold}${COLORS.cyan}ExpxAgents CLI${COLORS.reset} ${COLORS.dim}— powered by OpenRouter${COLORS.reset}`);
18
- console.log(`${COLORS.dim}Model: ${COLORS.yellow}${label}${COLORS.reset}`);
19
- console.log(`${COLORS.dim}Working directory: ${process.cwd()}${COLORS.reset}`);
20
- console.log(`${COLORS.dim}Type ${COLORS.bold}/help${COLORS.reset}${COLORS.dim} for commands, ${COLORS.bold}/quit${COLORS.reset}${COLORS.dim} to exit${COLORS.reset}\n`);
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
- ${COLORS.bold}Commands:${COLORS.reset}
25
- ${COLORS.cyan}/help${COLORS.reset} Show this help
26
- ${COLORS.cyan}/model <id>${COLORS.reset} Switch model (e.g. /model openai/gpt-4o)
27
- ${COLORS.cyan}/models${COLORS.reset} List available models
28
- ${COLORS.cyan}/clear${COLORS.reset} Clear conversation history
29
- ${COLORS.cyan}/quit${COLORS.reset} Exit
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(`${COLORS.dim}[${tool}] ${summary}${COLORS.reset}\n`);
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: `${COLORS.green}>${COLORS.reset} `,
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(`${COLORS.dim}Goodbye!${COLORS.reset}`);
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${COLORS.bold}Available models:${COLORS.reset}`);
125
+ console.log(`\n${C.bold}Available models:${C.reset}`);
101
126
  for (const m of SUPPORTED_MODELS) {
102
- const active = m.id === model ? ` ${COLORS.green}(active)${COLORS.reset}` : '';
103
- console.log(` ${COLORS.cyan}${m.id}${COLORS.reset} — ${m.name} (${(m.contextWindow / 1000).toFixed(0)}K ctx)${active}`);
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: ${COLORS.yellow}${model}${COLORS.reset}`);
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(`${COLORS.green}Switched to ${info.name}${COLORS.reset}`);
141
+ console.log(`${C.green}Switched to ${info.name}${C.reset}`);
117
142
  }
118
143
  else {
119
- console.log(`${COLORS.yellow}Warning: "${model}" is not in curated list. Tool use may not work.${COLORS.reset}`);
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(`${COLORS.dim}Conversation cleared.${COLORS.reset}`);
151
+ console.log(`${C.dim}Conversation cleared.${C.reset}`);
127
152
  rl.prompt();
128
153
  return;
129
154
  default:
130
- console.log(`${COLORS.dim}Unknown command: ${cmd}. Type /help for commands.${COLORS.reset}`);
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(`${COLORS.dim}[${tool}] ${summary}${COLORS.reset}\n`);
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(`${COLORS.magenta}Agent asks:${COLORS.reset} ${question}\n${COLORS.green}>${COLORS.reset} `, resolve);
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${COLORS.yellow}Error: ${err instanceof Error ? err.message : String(err)}${COLORS.reset}\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${COLORS.dim}Goodbye!${COLORS.reset}`);
192
+ console.log(`\n${C.dim}Goodbye!${C.reset}`);
168
193
  process.exit(0);
169
194
  });
170
195
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "expxagents",
3
- "version": "0.29.2",
3
+ "version": "0.29.3",
4
4
  "description": "Multi-agent orchestration platform for AI squads",
5
5
  "author": "ExpxAgents",
6
6
  "license": "MIT",