@horneross/cli 0.5.2 → 0.6.1
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/index.js +265 -271
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
package/dist/index.js
CHANGED
|
@@ -1,110 +1,185 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
+
var __defProp = Object.defineProperty;
|
|
3
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
4
|
+
var __esm = (fn, res) => function __init() {
|
|
5
|
+
return fn && (res = (0, fn[__getOwnPropNames(fn)[0]])(fn = 0)), res;
|
|
6
|
+
};
|
|
7
|
+
var __export = (target, all) => {
|
|
8
|
+
for (var name in all)
|
|
9
|
+
__defProp(target, name, { get: all[name], enumerable: true });
|
|
10
|
+
};
|
|
2
11
|
|
|
3
|
-
//
|
|
4
|
-
import
|
|
5
|
-
import
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
12
|
+
// ../../node_modules/.pnpm/tsup@8.5.1_tsx@3.14.0_typescript@5.9.3_yaml@2.8.1/node_modules/tsup/assets/esm_shims.js
|
|
13
|
+
import path from "path";
|
|
14
|
+
import { fileURLToPath } from "url";
|
|
15
|
+
var init_esm_shims = __esm({
|
|
16
|
+
"../../node_modules/.pnpm/tsup@8.5.1_tsx@3.14.0_typescript@5.9.3_yaml@2.8.1/node_modules/tsup/assets/esm_shims.js"() {
|
|
17
|
+
"use strict";
|
|
18
|
+
}
|
|
19
|
+
});
|
|
10
20
|
|
|
11
21
|
// src/config/config-manager.ts
|
|
12
22
|
import { readFile, writeFile, mkdir } from "fs/promises";
|
|
13
23
|
import { homedir } from "os";
|
|
14
24
|
import { join } from "path";
|
|
15
25
|
import { parse, stringify } from "yaml";
|
|
16
|
-
var CONFIG_DIR
|
|
17
|
-
var
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
26
|
+
var CONFIG_DIR, CONFIG_PATH, DEFAULT_CONFIG, ConfigManager;
|
|
27
|
+
var init_config_manager = __esm({
|
|
28
|
+
"src/config/config-manager.ts"() {
|
|
29
|
+
"use strict";
|
|
30
|
+
init_esm_shims();
|
|
31
|
+
CONFIG_DIR = join(homedir(), ".horneross");
|
|
32
|
+
CONFIG_PATH = join(CONFIG_DIR, "config.yaml");
|
|
33
|
+
DEFAULT_CONFIG = {
|
|
34
|
+
default_agent: "",
|
|
35
|
+
base_url: "http://localhost:3000",
|
|
36
|
+
agents: {}
|
|
37
|
+
};
|
|
38
|
+
ConfigManager = class {
|
|
39
|
+
static async load() {
|
|
40
|
+
try {
|
|
41
|
+
const content = await readFile(CONFIG_PATH, "utf-8");
|
|
42
|
+
const config = parse(content);
|
|
43
|
+
return { ...DEFAULT_CONFIG, ...config };
|
|
44
|
+
} catch (error) {
|
|
45
|
+
if (error.code === "ENOENT") {
|
|
46
|
+
return DEFAULT_CONFIG;
|
|
47
|
+
}
|
|
48
|
+
throw error;
|
|
49
|
+
}
|
|
32
50
|
}
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
51
|
+
static async save(config) {
|
|
52
|
+
await mkdir(CONFIG_DIR, { recursive: true });
|
|
53
|
+
const content = stringify(config);
|
|
54
|
+
await writeFile(CONFIG_PATH, content, { mode: 384 });
|
|
55
|
+
}
|
|
56
|
+
static async addAgent(name, agentConfig) {
|
|
57
|
+
const config = await this.load();
|
|
58
|
+
config.agents[name] = agentConfig;
|
|
59
|
+
if (!config.default_agent) {
|
|
60
|
+
config.default_agent = name;
|
|
61
|
+
}
|
|
62
|
+
await this.save(config);
|
|
63
|
+
}
|
|
64
|
+
static async getAgent(name) {
|
|
65
|
+
const config = await this.load();
|
|
66
|
+
const agentName = name || config.default_agent;
|
|
67
|
+
if (!agentName) {
|
|
68
|
+
throw new Error("No default agent configured. Run: horneross config init");
|
|
69
|
+
}
|
|
70
|
+
const agent = config.agents[agentName];
|
|
71
|
+
if (!agent) {
|
|
72
|
+
throw new Error(`Agent "${agentName}" not found in configuration`);
|
|
73
|
+
}
|
|
74
|
+
return agent;
|
|
75
|
+
}
|
|
76
|
+
static async validateAuth(agentConfig, baseUrl) {
|
|
77
|
+
try {
|
|
78
|
+
const response = await fetch(`${baseUrl}/api/v2/agent/${agentConfig.id}/config`, {
|
|
79
|
+
headers: {
|
|
80
|
+
Authorization: `Bearer ${agentConfig.api_key}`
|
|
81
|
+
}
|
|
82
|
+
});
|
|
83
|
+
return response.ok;
|
|
84
|
+
} catch {
|
|
85
|
+
return false;
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
static getConfigPath() {
|
|
89
|
+
return CONFIG_PATH;
|
|
90
|
+
}
|
|
91
|
+
};
|
|
40
92
|
}
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
93
|
+
});
|
|
94
|
+
|
|
95
|
+
// src/utils/banner.ts
|
|
96
|
+
import chalk5 from "chalk";
|
|
97
|
+
function showBanner() {
|
|
98
|
+
console.log();
|
|
99
|
+
console.log(chalk5.hex("#FF8800").bold(`
|
|
100
|
+
\u2566 \u2566\u2554\u2550\u2557\u2566\u2550\u2557\u2554\u2557\u2554\u2554\u2550\u2557\u2566\u2550\u2557\u2554\u2550\u2557\u2554\u2550\u2557\u2554\u2550\u2557
|
|
101
|
+
\u2560\u2550\u2563\u2551 \u2551\u2560\u2566\u255D\u2551\u2551\u2551\u2551\u2563 \u2560\u2566\u255D\u2551 \u2551\u255A\u2550\u2557\u255A\u2550\u2557
|
|
102
|
+
\u2569 \u2569\u255A\u2550\u255D\u2569\u255A\u2550\u255D\u255A\u255D\u255A\u2550\u255D\u2569\u255A\u2550\u255A\u2550\u255D\u255A\u2550\u255D\u255A\u2550\u255D
|
|
103
|
+
`));
|
|
104
|
+
console.log(chalk5.gray.bold(" Terminal AI Agent Interface"));
|
|
105
|
+
console.log(chalk5.gray(" https://horneross.com"));
|
|
106
|
+
console.log(chalk5.gray(" \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500"));
|
|
107
|
+
console.log();
|
|
108
|
+
}
|
|
109
|
+
var init_banner = __esm({
|
|
110
|
+
"src/utils/banner.ts"() {
|
|
111
|
+
"use strict";
|
|
112
|
+
init_esm_shims();
|
|
48
113
|
}
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
114
|
+
});
|
|
115
|
+
|
|
116
|
+
// src/utils/auto-start.ts
|
|
117
|
+
var auto_start_exports = {};
|
|
118
|
+
__export(auto_start_exports, {
|
|
119
|
+
autoStart: () => autoStart
|
|
120
|
+
});
|
|
121
|
+
import chalk7 from "chalk";
|
|
122
|
+
import { execSync } from "child_process";
|
|
123
|
+
async function autoStart() {
|
|
124
|
+
try {
|
|
125
|
+
const config = await ConfigManager.load();
|
|
126
|
+
if (!config.default_agent || !config.agents[config.default_agent]) {
|
|
127
|
+
showBanner();
|
|
128
|
+
console.log(chalk7.cyan("\u{1F44B} Welcome to Horneross CLI!\n"));
|
|
129
|
+
console.log(chalk7.yellow("No configuration found. Let's set up your first agent.\n"));
|
|
130
|
+
execSync("horneross config init", { stdio: "inherit" });
|
|
131
|
+
return;
|
|
58
132
|
}
|
|
59
|
-
|
|
60
|
-
}
|
|
61
|
-
|
|
133
|
+
execSync("horneross interactive", { stdio: "inherit" });
|
|
134
|
+
} catch (error) {
|
|
135
|
+
showBanner();
|
|
136
|
+
console.log(chalk7.cyan("\u{1F44B} Welcome to Horneross CLI!\n"));
|
|
137
|
+
console.log(chalk7.yellow("No configuration found. Let's set up your first agent.\n"));
|
|
62
138
|
try {
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
});
|
|
68
|
-
return response.ok;
|
|
69
|
-
} catch {
|
|
70
|
-
return false;
|
|
139
|
+
execSync("horneross config init", { stdio: "inherit" });
|
|
140
|
+
} catch (initError) {
|
|
141
|
+
console.error(chalk7.red("\n\u2716 Configuration failed"));
|
|
142
|
+
process.exit(1);
|
|
71
143
|
}
|
|
72
144
|
}
|
|
73
|
-
|
|
74
|
-
|
|
145
|
+
}
|
|
146
|
+
var init_auto_start = __esm({
|
|
147
|
+
"src/utils/auto-start.ts"() {
|
|
148
|
+
"use strict";
|
|
149
|
+
init_esm_shims();
|
|
150
|
+
init_config_manager();
|
|
151
|
+
init_banner();
|
|
75
152
|
}
|
|
76
|
-
};
|
|
153
|
+
});
|
|
154
|
+
|
|
155
|
+
// src/index.ts
|
|
156
|
+
init_esm_shims();
|
|
157
|
+
import { Command as Command4 } from "commander";
|
|
158
|
+
import chalk8 from "chalk";
|
|
159
|
+
|
|
160
|
+
// src/commands/chat.ts
|
|
161
|
+
init_esm_shims();
|
|
162
|
+
init_config_manager();
|
|
163
|
+
import { Command } from "commander";
|
|
164
|
+
import chalk2 from "chalk";
|
|
77
165
|
|
|
78
166
|
// src/adapters/stream-adapter.ts
|
|
167
|
+
init_esm_shims();
|
|
79
168
|
import { createParser } from "eventsource-parser";
|
|
80
169
|
import ora from "ora";
|
|
81
|
-
import chalk2 from "chalk";
|
|
82
|
-
|
|
83
|
-
// src/utils/markdown.ts
|
|
84
170
|
import chalk from "chalk";
|
|
85
|
-
function renderMarkdown(text) {
|
|
86
|
-
let result = text;
|
|
87
|
-
result = result.replace(/\*\*([^*]+)\*\*/g, (_, content) => chalk.bold(content));
|
|
88
|
-
result = result.replace(/\*([^*]+)\*/g, (_, content) => chalk.italic(content));
|
|
89
|
-
result = result.replace(/`([^`]+)`/g, (_, content) => chalk.cyan(content));
|
|
90
|
-
return result;
|
|
91
|
-
}
|
|
92
|
-
|
|
93
|
-
// src/adapters/stream-adapter.ts
|
|
94
171
|
var StreamAdapter = class {
|
|
95
172
|
activeSpinner = null;
|
|
96
173
|
toolCallStack = /* @__PURE__ */ new Map();
|
|
97
174
|
metadata = null;
|
|
98
175
|
isThinking = false;
|
|
99
176
|
hasOutputText = false;
|
|
100
|
-
toolsExecuted = [];
|
|
101
|
-
sessionStartTime = Date.now();
|
|
102
177
|
async processStream(response) {
|
|
103
178
|
if (!response.body) {
|
|
104
179
|
throw new Error("Response body is null");
|
|
105
180
|
}
|
|
106
181
|
this.isThinking = true;
|
|
107
|
-
process.stdout.write(
|
|
182
|
+
process.stdout.write(chalk.gray("\u{1F914} Thinking...\n"));
|
|
108
183
|
const reader = response.body.getReader();
|
|
109
184
|
const decoder = new TextDecoder();
|
|
110
185
|
return new Promise((resolve, reject) => {
|
|
@@ -118,7 +193,7 @@ var StreamAdapter = class {
|
|
|
118
193
|
this.handleEvent(data);
|
|
119
194
|
} catch (error) {
|
|
120
195
|
if (event.data !== "[DONE]") {
|
|
121
|
-
console.error(
|
|
196
|
+
console.error(chalk.red("Failed to parse SSE event:"), error);
|
|
122
197
|
}
|
|
123
198
|
}
|
|
124
199
|
}
|
|
@@ -179,11 +254,9 @@ var StreamAdapter = class {
|
|
|
179
254
|
process.stdout.write("\x1B[1A\x1B[2K");
|
|
180
255
|
this.isThinking = false;
|
|
181
256
|
}
|
|
182
|
-
|
|
183
|
-
if (text) {
|
|
257
|
+
if (event.content) {
|
|
184
258
|
this.hasOutputText = true;
|
|
185
|
-
|
|
186
|
-
process.stdout.write(formatted);
|
|
259
|
+
process.stdout.write(event.content);
|
|
187
260
|
}
|
|
188
261
|
}
|
|
189
262
|
handleToolCall(event) {
|
|
@@ -206,33 +279,29 @@ var StreamAdapter = class {
|
|
|
206
279
|
const argsPreview = this.formatArgs(args);
|
|
207
280
|
const toolIcon = this.getToolIcon(toolName);
|
|
208
281
|
this.activeSpinner = ora({
|
|
209
|
-
text:
|
|
282
|
+
text: chalk.cyan(`${toolIcon} ${toolName}${argsPreview}`)
|
|
210
283
|
}).start();
|
|
211
284
|
}
|
|
212
285
|
handleToolResult(event) {
|
|
213
286
|
if (this.activeSpinner) {
|
|
214
287
|
const { toolName } = event;
|
|
215
|
-
const
|
|
216
|
-
const elapsed = this.formatDuration(elapsedMs);
|
|
288
|
+
const elapsed = this.getElapsedTime();
|
|
217
289
|
const toolIcon = this.getToolIcon(toolName);
|
|
218
|
-
if (toolName) {
|
|
219
|
-
this.toolsExecuted.push({ name: toolName, duration: elapsedMs });
|
|
220
|
-
}
|
|
221
290
|
this.activeSpinner.succeed(
|
|
222
|
-
|
|
291
|
+
chalk.green(`${toolIcon} ${toolName} ${chalk.gray(`(${elapsed})`)}`)
|
|
223
292
|
);
|
|
224
293
|
this.activeSpinner = null;
|
|
225
294
|
}
|
|
226
295
|
if (!this.isThinking) {
|
|
227
296
|
this.isThinking = true;
|
|
228
|
-
process.stdout.write(
|
|
297
|
+
process.stdout.write(chalk.gray("\u{1F914} Thinking...\n"));
|
|
229
298
|
}
|
|
230
299
|
}
|
|
231
300
|
handleToolOutput(event) {
|
|
232
301
|
if (event.data && typeof event.data === "object") {
|
|
233
302
|
const data = event.data;
|
|
234
303
|
if (this.activeSpinner && data.message) {
|
|
235
|
-
this.activeSpinner.text =
|
|
304
|
+
this.activeSpinner.text = chalk.cyan(data.message);
|
|
236
305
|
}
|
|
237
306
|
}
|
|
238
307
|
}
|
|
@@ -240,9 +309,9 @@ var StreamAdapter = class {
|
|
|
240
309
|
if (event.data && Array.isArray(event.data)) {
|
|
241
310
|
const sources = event.data;
|
|
242
311
|
if (sources.length > 0) {
|
|
243
|
-
console.log(
|
|
312
|
+
console.log(chalk.blue("\n\u{1F4DA} Consulting knowledge base:"));
|
|
244
313
|
sources.forEach((source) => {
|
|
245
|
-
console.log(
|
|
314
|
+
console.log(chalk.gray(` \u2022 ${source.datastoreName} (${source.results.length} results)`));
|
|
246
315
|
});
|
|
247
316
|
console.log("");
|
|
248
317
|
}
|
|
@@ -252,9 +321,9 @@ var StreamAdapter = class {
|
|
|
252
321
|
if (event.data && typeof event.data === "object") {
|
|
253
322
|
const data = event.data;
|
|
254
323
|
if (data.suggestions && data.suggestions.length > 0) {
|
|
255
|
-
console.log(
|
|
324
|
+
console.log(chalk.blue("\n\u{1F4A1} Suggestions:"));
|
|
256
325
|
data.suggestions.forEach((suggestion, i) => {
|
|
257
|
-
console.log(
|
|
326
|
+
console.log(chalk.gray(` ${i + 1}. ${suggestion}`));
|
|
258
327
|
});
|
|
259
328
|
}
|
|
260
329
|
}
|
|
@@ -281,7 +350,7 @@ var StreamAdapter = class {
|
|
|
281
350
|
}
|
|
282
351
|
handleError(event) {
|
|
283
352
|
this.cleanup();
|
|
284
|
-
console.error(
|
|
353
|
+
console.error(chalk.red("\n\u2716 Error:"), event.content || "Unknown error");
|
|
285
354
|
}
|
|
286
355
|
formatArgs(args) {
|
|
287
356
|
if (!args || typeof args !== "object") {
|
|
@@ -296,27 +365,15 @@ var StreamAdapter = class {
|
|
|
296
365
|
const truncated = valueStr.length > 30 ? valueStr.slice(0, 30) + "..." : valueStr;
|
|
297
366
|
return `${key}: ${truncated}`;
|
|
298
367
|
}).join(", ");
|
|
299
|
-
return ` ${
|
|
368
|
+
return ` ${chalk.gray(`(${preview})`)}`;
|
|
300
369
|
}
|
|
301
|
-
|
|
370
|
+
getElapsedTime() {
|
|
302
371
|
const lastTool = Array.from(this.toolCallStack.values()).pop();
|
|
303
372
|
if (!lastTool) {
|
|
304
|
-
return
|
|
305
|
-
}
|
|
306
|
-
return Date.now() - lastTool.startTime;
|
|
307
|
-
}
|
|
308
|
-
formatDuration(ms) {
|
|
309
|
-
if (ms < 1e3) {
|
|
310
|
-
return `${ms}ms`;
|
|
373
|
+
return "0s";
|
|
311
374
|
}
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
getSessionSummary() {
|
|
315
|
-
return {
|
|
316
|
-
duration: Date.now() - this.sessionStartTime,
|
|
317
|
-
toolsUsed: this.toolsExecuted.length,
|
|
318
|
-
toolsList: this.toolsExecuted
|
|
319
|
-
};
|
|
375
|
+
const elapsed = Date.now() - lastTool.startTime;
|
|
376
|
+
return elapsed < 1e3 ? `${elapsed}ms` : `${(elapsed / 1e3).toFixed(1)}s`;
|
|
320
377
|
}
|
|
321
378
|
cleanup() {
|
|
322
379
|
if (this.activeSpinner) {
|
|
@@ -335,17 +392,17 @@ function createChatCommand() {
|
|
|
335
392
|
const config = await ConfigManager.load();
|
|
336
393
|
const agentName = options.agent || config.default_agent;
|
|
337
394
|
if (!agentName) {
|
|
338
|
-
console.error(
|
|
339
|
-
console.error(
|
|
395
|
+
console.error(chalk2.red("\n\u2716 No default agent configured"));
|
|
396
|
+
console.error(chalk2.yellow("Run: horneross config init\n"));
|
|
340
397
|
process.exit(1);
|
|
341
398
|
}
|
|
342
399
|
const agent = config.agents[agentName];
|
|
343
400
|
if (!agent) {
|
|
344
|
-
console.error(
|
|
401
|
+
console.error(chalk2.red(`
|
|
345
402
|
\u2716 Agent "${agentName}" not found`));
|
|
346
|
-
console.error(
|
|
403
|
+
console.error(chalk2.yellow("Available agents:"));
|
|
347
404
|
for (const name of Object.keys(config.agents)) {
|
|
348
|
-
console.error(
|
|
405
|
+
console.error(chalk2.gray(` - ${name}`));
|
|
349
406
|
}
|
|
350
407
|
console.error();
|
|
351
408
|
process.exit(1);
|
|
@@ -369,7 +426,7 @@ function createChatCommand() {
|
|
|
369
426
|
);
|
|
370
427
|
if (!response.ok) {
|
|
371
428
|
const errorText = await response.text();
|
|
372
|
-
console.error(
|
|
429
|
+
console.error(chalk2.red(`
|
|
373
430
|
\u2716 Request failed (${response.status}):`), errorText);
|
|
374
431
|
process.exit(1);
|
|
375
432
|
}
|
|
@@ -377,7 +434,7 @@ function createChatCommand() {
|
|
|
377
434
|
const metadata = await adapter.processStream(response);
|
|
378
435
|
if (metadata) {
|
|
379
436
|
console.log(
|
|
380
|
-
|
|
437
|
+
chalk2.gray(
|
|
381
438
|
`
|
|
382
439
|
|
|
383
440
|
Conversation ID: ${metadata.conversationId}`
|
|
@@ -387,7 +444,7 @@ Conversation ID: ${metadata.conversationId}`
|
|
|
387
444
|
console.log();
|
|
388
445
|
} catch (error) {
|
|
389
446
|
const message2 = error instanceof Error ? error.message : "Unknown error";
|
|
390
|
-
console.error(
|
|
447
|
+
console.error(chalk2.red("\n\u2716 Chat failed:"), message2);
|
|
391
448
|
process.exit(1);
|
|
392
449
|
}
|
|
393
450
|
});
|
|
@@ -395,12 +452,15 @@ Conversation ID: ${metadata.conversationId}`
|
|
|
395
452
|
}
|
|
396
453
|
|
|
397
454
|
// src/commands/config.ts
|
|
455
|
+
init_esm_shims();
|
|
456
|
+
init_config_manager();
|
|
398
457
|
import { Command as Command2 } from "commander";
|
|
399
|
-
import
|
|
458
|
+
import chalk4 from "chalk";
|
|
400
459
|
import * as readline from "readline/promises";
|
|
401
460
|
|
|
402
461
|
// src/auth/auth-manager.ts
|
|
403
|
-
|
|
462
|
+
init_esm_shims();
|
|
463
|
+
import chalk3 from "chalk";
|
|
404
464
|
var AuthManager = class {
|
|
405
465
|
static async validateConnection(agentConfig, baseUrl) {
|
|
406
466
|
try {
|
|
@@ -425,12 +485,12 @@ var AuthManager = class {
|
|
|
425
485
|
}
|
|
426
486
|
}
|
|
427
487
|
static displayAuthError(error) {
|
|
428
|
-
console.error(
|
|
429
|
-
console.error(
|
|
430
|
-
console.error(
|
|
431
|
-
console.error(
|
|
432
|
-
console.error(
|
|
433
|
-
console.error(
|
|
488
|
+
console.error(chalk3.red("\n\u2716 Authentication failed:"), error);
|
|
489
|
+
console.error(chalk3.yellow("\nTroubleshooting:"));
|
|
490
|
+
console.error(chalk3.gray(" 1. Check your API key is correct"));
|
|
491
|
+
console.error(chalk3.gray(" 2. Verify the agent ID exists"));
|
|
492
|
+
console.error(chalk3.gray(" 3. Ensure the base URL is accessible"));
|
|
493
|
+
console.error(chalk3.gray("\nRun: horneross config init"));
|
|
434
494
|
}
|
|
435
495
|
};
|
|
436
496
|
|
|
@@ -438,35 +498,35 @@ var AuthManager = class {
|
|
|
438
498
|
function createConfigCommand() {
|
|
439
499
|
const config = new Command2("config");
|
|
440
500
|
config.command("init").description("Initialize Horneross CLI configuration").action(async () => {
|
|
441
|
-
console.log(
|
|
501
|
+
console.log(chalk4.bold.cyan("\n\u{1F916} Horneross CLI Setup\n"));
|
|
442
502
|
const rl = readline.createInterface({
|
|
443
503
|
input: process.stdin,
|
|
444
504
|
output: process.stdout
|
|
445
505
|
});
|
|
446
506
|
try {
|
|
447
507
|
const agentName = await rl.question(
|
|
448
|
-
|
|
508
|
+
chalk4.yellow('Agent name (e.g., "adam"): ')
|
|
449
509
|
);
|
|
450
510
|
if (!agentName.trim()) {
|
|
451
|
-
console.error(
|
|
511
|
+
console.error(chalk4.red("\n\u2716 Agent name is required"));
|
|
452
512
|
process.exit(1);
|
|
453
513
|
}
|
|
454
514
|
const agentId = await rl.question(
|
|
455
|
-
|
|
515
|
+
chalk4.yellow("Agent ID: ")
|
|
456
516
|
);
|
|
457
517
|
if (!agentId.trim()) {
|
|
458
|
-
console.error(
|
|
518
|
+
console.error(chalk4.red("\n\u2716 Agent ID is required"));
|
|
459
519
|
process.exit(1);
|
|
460
520
|
}
|
|
461
521
|
const apiKey = await rl.question(
|
|
462
|
-
|
|
522
|
+
chalk4.yellow("API Key: ")
|
|
463
523
|
);
|
|
464
524
|
if (!apiKey.trim()) {
|
|
465
|
-
console.error(
|
|
525
|
+
console.error(chalk4.red("\n\u2716 API Key is required"));
|
|
466
526
|
process.exit(1);
|
|
467
527
|
}
|
|
468
528
|
const baseUrl = await rl.question(
|
|
469
|
-
|
|
529
|
+
chalk4.yellow("Base URL [http://localhost:3000]: ")
|
|
470
530
|
);
|
|
471
531
|
const finalBaseUrl = baseUrl.trim() || "http://localhost:3000";
|
|
472
532
|
rl.close();
|
|
@@ -475,7 +535,7 @@ function createConfigCommand() {
|
|
|
475
535
|
api_key: apiKey.trim(),
|
|
476
536
|
name: agentName.trim()
|
|
477
537
|
};
|
|
478
|
-
console.log(
|
|
538
|
+
console.log(chalk4.gray("\n\u23F3 Validating connection..."));
|
|
479
539
|
const { valid, error } = await AuthManager.validateConnection(
|
|
480
540
|
agentConfig,
|
|
481
541
|
finalBaseUrl
|
|
@@ -488,38 +548,38 @@ function createConfigCommand() {
|
|
|
488
548
|
const currentConfig = await ConfigManager.load();
|
|
489
549
|
currentConfig.base_url = finalBaseUrl;
|
|
490
550
|
await ConfigManager.save(currentConfig);
|
|
491
|
-
console.log(
|
|
492
|
-
console.log(
|
|
551
|
+
console.log(chalk4.green("\n\u2713 Configuration saved successfully!"));
|
|
552
|
+
console.log(chalk4.gray(`
|
|
493
553
|
Config file: ${ConfigManager.getConfigPath()}`));
|
|
494
|
-
console.log(
|
|
495
|
-
console.log(
|
|
554
|
+
console.log(chalk4.gray(`Default agent: ${agentName.trim()}`));
|
|
555
|
+
console.log(chalk4.cyan('\nYou can now run: horneross chat "Hello"\n'));
|
|
496
556
|
} catch (error) {
|
|
497
557
|
rl.close();
|
|
498
|
-
console.error(
|
|
558
|
+
console.error(chalk4.red("\n\u2716 Setup failed:"), error);
|
|
499
559
|
process.exit(1);
|
|
500
560
|
}
|
|
501
561
|
});
|
|
502
562
|
config.command("show").description("Show current configuration").action(async () => {
|
|
503
563
|
try {
|
|
504
564
|
const config2 = await ConfigManager.load();
|
|
505
|
-
console.log(
|
|
506
|
-
console.log(
|
|
507
|
-
console.log(
|
|
508
|
-
console.log(
|
|
565
|
+
console.log(chalk4.bold.cyan("\n\u{1F527} Current Configuration\n"));
|
|
566
|
+
console.log(chalk4.yellow("Base URL:"), config2.base_url);
|
|
567
|
+
console.log(chalk4.yellow("Default Agent:"), config2.default_agent || chalk4.gray("(not set)"));
|
|
568
|
+
console.log(chalk4.yellow("\nConfigured Agents:"));
|
|
509
569
|
if (Object.keys(config2.agents).length === 0) {
|
|
510
|
-
console.log(
|
|
570
|
+
console.log(chalk4.gray(" No agents configured"));
|
|
511
571
|
} else {
|
|
512
572
|
for (const [name, agent] of Object.entries(config2.agents)) {
|
|
513
573
|
const isDefault = name === config2.default_agent;
|
|
514
|
-
const marker = isDefault ?
|
|
515
|
-
console.log(` ${marker} ${
|
|
574
|
+
const marker = isDefault ? chalk4.green("\u2713") : " ";
|
|
575
|
+
console.log(` ${marker} ${chalk4.cyan(name)} (${agent.id})`);
|
|
516
576
|
}
|
|
517
577
|
}
|
|
518
|
-
console.log(
|
|
578
|
+
console.log(chalk4.gray(`
|
|
519
579
|
Config file: ${ConfigManager.getConfigPath()}
|
|
520
580
|
`));
|
|
521
581
|
} catch (error) {
|
|
522
|
-
console.error(
|
|
582
|
+
console.error(chalk4.red("Failed to load configuration:"), error);
|
|
523
583
|
process.exit(1);
|
|
524
584
|
}
|
|
525
585
|
});
|
|
@@ -527,28 +587,14 @@ Config file: ${ConfigManager.getConfigPath()}
|
|
|
527
587
|
}
|
|
528
588
|
|
|
529
589
|
// src/commands/interactive.ts
|
|
590
|
+
init_esm_shims();
|
|
591
|
+
init_config_manager();
|
|
530
592
|
import { Command as Command3 } from "commander";
|
|
531
|
-
import
|
|
593
|
+
import chalk6 from "chalk";
|
|
532
594
|
import ora2 from "ora";
|
|
533
595
|
import * as readline2 from "readline";
|
|
534
596
|
import { createId } from "@paralleldrive/cuid2";
|
|
535
|
-
|
|
536
|
-
// src/utils/banner.ts
|
|
537
|
-
import chalk6 from "chalk";
|
|
538
|
-
function showBanner() {
|
|
539
|
-
console.log();
|
|
540
|
-
console.log(chalk6.hex("#FF8800").bold(`
|
|
541
|
-
\u2566 \u2566\u2554\u2550\u2557\u2566\u2550\u2557\u2554\u2557\u2554\u2554\u2550\u2557\u2566\u2550\u2557\u2554\u2550\u2557\u2554\u2550\u2557\u2554\u2550\u2557
|
|
542
|
-
\u2560\u2550\u2563\u2551 \u2551\u2560\u2566\u255D\u2551\u2551\u2551\u2551\u2563 \u2560\u2566\u255D\u2551 \u2551\u255A\u2550\u2557\u255A\u2550\u2557
|
|
543
|
-
\u2569 \u2569\u255A\u2550\u255D\u2569\u255A\u2550\u255D\u255A\u255D\u255A\u2550\u255D\u2569\u255A\u2550\u255A\u2550\u255D\u255A\u2550\u255D\u255A\u2550\u255D
|
|
544
|
-
`));
|
|
545
|
-
console.log(chalk6.gray.bold(" Terminal AI Agent Interface"));
|
|
546
|
-
console.log(chalk6.gray(" https://horneross.com"));
|
|
547
|
-
console.log(chalk6.gray(" \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500"));
|
|
548
|
-
console.log();
|
|
549
|
-
}
|
|
550
|
-
|
|
551
|
-
// src/commands/interactive.ts
|
|
597
|
+
init_banner();
|
|
552
598
|
function createInteractiveCommand() {
|
|
553
599
|
const interactive = new Command3("interactive");
|
|
554
600
|
interactive.description("Start an interactive chat session").option("-a, --agent <name>", "Agent to use (defaults to configured default)").action(async (options) => {
|
|
@@ -556,28 +602,26 @@ function createInteractiveCommand() {
|
|
|
556
602
|
const config = await ConfigManager.load();
|
|
557
603
|
const agentName = options.agent || config.default_agent;
|
|
558
604
|
if (!agentName) {
|
|
559
|
-
console.error(
|
|
560
|
-
console.error(
|
|
605
|
+
console.error(chalk6.red("\n\u2716 No default agent configured"));
|
|
606
|
+
console.error(chalk6.yellow("Run: horneross config init\n"));
|
|
561
607
|
process.exit(1);
|
|
562
608
|
}
|
|
563
609
|
const agent = config.agents[agentName];
|
|
564
610
|
if (!agent) {
|
|
565
|
-
console.error(
|
|
611
|
+
console.error(chalk6.red(`
|
|
566
612
|
\u2716 Agent "${agentName}" not found`));
|
|
567
613
|
process.exit(1);
|
|
568
614
|
}
|
|
569
615
|
showBanner();
|
|
570
|
-
console.log(
|
|
571
|
-
console.log(
|
|
616
|
+
console.log(chalk6.bold.cyan(`\u{1F916} Chatting with ${agent.name}`));
|
|
617
|
+
console.log(chalk6.gray("Commands: /help /exit /clear /agent /config\n"));
|
|
572
618
|
const conversationId = createId();
|
|
573
619
|
let messageCount = 0;
|
|
574
|
-
let totalToolsUsed = 0;
|
|
575
|
-
const sessionStartTime = Date.now();
|
|
576
620
|
await new Promise((resolve) => {
|
|
577
621
|
const rl = readline2.createInterface({
|
|
578
622
|
input: process.stdin,
|
|
579
623
|
output: process.stdout,
|
|
580
|
-
prompt:
|
|
624
|
+
prompt: chalk6.green("> ")
|
|
581
625
|
});
|
|
582
626
|
rl.prompt();
|
|
583
627
|
rl.on("line", async (input) => {
|
|
@@ -590,47 +634,47 @@ function createInteractiveCommand() {
|
|
|
590
634
|
rl.close();
|
|
591
635
|
return;
|
|
592
636
|
case "help":
|
|
593
|
-
console.log(
|
|
594
|
-
console.log(
|
|
595
|
-
console.log(
|
|
596
|
-
console.log(
|
|
597
|
-
console.log(
|
|
598
|
-
console.log(
|
|
637
|
+
console.log(chalk6.cyan("\n\u{1F4DA} Available Commands:\n"));
|
|
638
|
+
console.log(chalk6.gray(" /exit Exit the chat"));
|
|
639
|
+
console.log(chalk6.gray(" /clear Clear the screen"));
|
|
640
|
+
console.log(chalk6.gray(" /config Show current configuration"));
|
|
641
|
+
console.log(chalk6.gray(" /agent <name> Switch to a different agent"));
|
|
642
|
+
console.log(chalk6.gray(" /help Show this help message\n"));
|
|
599
643
|
rl.prompt();
|
|
600
644
|
return;
|
|
601
645
|
case "clear":
|
|
602
646
|
console.clear();
|
|
603
647
|
showBanner();
|
|
604
|
-
console.log(
|
|
605
|
-
console.log(
|
|
648
|
+
console.log(chalk6.bold.cyan(`\u{1F916} Chatting with ${agent.name}`));
|
|
649
|
+
console.log(chalk6.gray("Commands: /help /exit /clear /agent /config\n"));
|
|
606
650
|
rl.prompt();
|
|
607
651
|
return;
|
|
608
652
|
case "config":
|
|
609
|
-
console.log(
|
|
610
|
-
console.log(
|
|
611
|
-
console.log(
|
|
612
|
-
console.log(
|
|
653
|
+
console.log(chalk6.cyan("\n\u2699\uFE0F Current Configuration:\n"));
|
|
654
|
+
console.log(chalk6.gray(` Agent: ${agent.name} (${agent.id})`));
|
|
655
|
+
console.log(chalk6.gray(` Base URL: ${config.base_url}`));
|
|
656
|
+
console.log(chalk6.gray(` Conversation ID: ${conversationId}
|
|
613
657
|
`));
|
|
614
658
|
rl.prompt();
|
|
615
659
|
return;
|
|
616
660
|
case "agent":
|
|
617
661
|
if (!args[0]) {
|
|
618
|
-
console.log(
|
|
619
|
-
console.log(
|
|
662
|
+
console.log(chalk6.red("\n\u2716 Please specify an agent name"));
|
|
663
|
+
console.log(chalk6.yellow("Available agents:"));
|
|
620
664
|
Object.keys(config.agents).forEach((name) => {
|
|
621
|
-
console.log(
|
|
665
|
+
console.log(chalk6.gray(` - ${name}`));
|
|
622
666
|
});
|
|
623
667
|
console.log("");
|
|
624
668
|
rl.prompt();
|
|
625
669
|
return;
|
|
626
670
|
}
|
|
627
|
-
console.log(
|
|
671
|
+
console.log(chalk6.yellow("\n\u26A0\uFE0F Agent switching not yet implemented\n"));
|
|
628
672
|
rl.prompt();
|
|
629
673
|
return;
|
|
630
674
|
default:
|
|
631
|
-
console.log(
|
|
675
|
+
console.log(chalk6.red(`
|
|
632
676
|
\u2716 Unknown command: /${command}`));
|
|
633
|
-
console.log(
|
|
677
|
+
console.log(chalk6.yellow("Type /help for available commands\n"));
|
|
634
678
|
rl.prompt();
|
|
635
679
|
return;
|
|
636
680
|
}
|
|
@@ -647,7 +691,7 @@ function createInteractiveCommand() {
|
|
|
647
691
|
messageCount++;
|
|
648
692
|
console.log("");
|
|
649
693
|
const startSpinner = ora2({
|
|
650
|
-
text:
|
|
694
|
+
text: chalk6.gray("Starting..."),
|
|
651
695
|
color: "gray"
|
|
652
696
|
}).start();
|
|
653
697
|
const response = await fetch(
|
|
@@ -668,30 +712,14 @@ function createInteractiveCommand() {
|
|
|
668
712
|
);
|
|
669
713
|
startSpinner.stop();
|
|
670
714
|
if (!response.ok) {
|
|
671
|
-
|
|
672
|
-
|
|
673
|
-
|
|
674
|
-
errorMessage = errorData.error || errorData.message || errorMessage;
|
|
675
|
-
} catch {
|
|
676
|
-
const errorText = await response.text();
|
|
677
|
-
errorMessage = errorText || errorMessage;
|
|
678
|
-
}
|
|
679
|
-
console.error(chalk7.red("\n\u2716 Error:"), errorMessage);
|
|
680
|
-
if (response.status === 401) {
|
|
681
|
-
console.log(chalk7.yellow(" Hint: Check your API key configuration"));
|
|
682
|
-
} else if (response.status === 429) {
|
|
683
|
-
console.log(chalk7.yellow(" Hint: Rate limit exceeded, please wait a moment"));
|
|
684
|
-
} else if (response.status === 500) {
|
|
685
|
-
console.log(chalk7.yellow(" Hint: Server error, please try again later"));
|
|
686
|
-
}
|
|
687
|
-
console.log("");
|
|
715
|
+
const errorText = await response.text();
|
|
716
|
+
console.error(chalk6.red(`
|
|
717
|
+
\u2716 Request failed (${response.status}):`), errorText);
|
|
688
718
|
rl.prompt();
|
|
689
719
|
return;
|
|
690
720
|
}
|
|
691
721
|
const adapter = new StreamAdapter();
|
|
692
722
|
await adapter.processStream(response);
|
|
693
|
-
const summary = adapter.getSessionSummary();
|
|
694
|
-
totalToolsUsed += summary.toolsUsed;
|
|
695
723
|
console.log("\n");
|
|
696
724
|
rl.prompt();
|
|
697
725
|
} catch (error) {
|
|
@@ -710,65 +738,35 @@ function createInteractiveCommand() {
|
|
|
710
738
|
} else if (message.includes("fetch failed")) {
|
|
711
739
|
hint = "Network request failed. Check your internet connection and base_url.";
|
|
712
740
|
}
|
|
741
|
+
} else {
|
|
742
|
+
console.error(chalk6.gray("Full error:"), error);
|
|
713
743
|
}
|
|
714
|
-
console.error(
|
|
744
|
+
console.error(chalk6.red("\n\u2716 Error:"), message);
|
|
715
745
|
if (hint) {
|
|
716
|
-
console.log(
|
|
746
|
+
console.log(chalk6.yellow(` Hint: ${hint}`));
|
|
717
747
|
}
|
|
718
748
|
console.log("");
|
|
719
749
|
rl.prompt();
|
|
720
750
|
}
|
|
721
751
|
});
|
|
722
752
|
rl.on("close", () => {
|
|
723
|
-
|
|
724
|
-
|
|
725
|
-
|
|
726
|
-
|
|
727
|
-
|
|
728
|
-
console.log(chalk7.bold.cyan("\n\u{1F4CA} Session Summary"));
|
|
729
|
-
console.log(chalk7.gray(` Messages: ${messageCount}`));
|
|
730
|
-
console.log(chalk7.gray(` Tools used: ${totalToolsUsed}`));
|
|
731
|
-
console.log(chalk7.gray(` Duration: ${durationMinutes}m ${durationSeconds}s`));
|
|
732
|
-
console.log(chalk7.gray(` Conversation ID: ${conversationId}`));
|
|
733
|
-
if (messageCount > 0) {
|
|
734
|
-
console.log(chalk7.blue("\n\u{1F4A1} Resume this conversation:"));
|
|
735
|
-
console.log(chalk7.yellow(` horneross --resume ${conversationId.slice(0, 8)}`));
|
|
736
|
-
}
|
|
737
|
-
console.log(chalk7.blue("\n\u2501".repeat(50)));
|
|
738
|
-
console.log(chalk7.gray("\nGoodbye! \u{1F44B}\n"));
|
|
753
|
+
console.log(
|
|
754
|
+
chalk6.gray(`
|
|
755
|
+
Session ended. ${messageCount} messages exchanged.
|
|
756
|
+
`)
|
|
757
|
+
);
|
|
739
758
|
resolve();
|
|
740
759
|
});
|
|
741
760
|
});
|
|
742
761
|
} catch (error) {
|
|
743
762
|
const message = error instanceof Error ? error.message : "Unknown error";
|
|
744
|
-
console.error(
|
|
763
|
+
console.error(chalk6.red("\n\u2716 Interactive mode failed:"), message);
|
|
745
764
|
process.exit(1);
|
|
746
765
|
}
|
|
747
766
|
});
|
|
748
767
|
return interactive;
|
|
749
768
|
}
|
|
750
769
|
|
|
751
|
-
// src/utils/auto-start.ts
|
|
752
|
-
import chalk8 from "chalk";
|
|
753
|
-
async function autoStart() {
|
|
754
|
-
try {
|
|
755
|
-
const config = await ConfigManager.load();
|
|
756
|
-
if (!config.default_agent || !config.agents[config.default_agent]) {
|
|
757
|
-
showBanner();
|
|
758
|
-
console.log(chalk8.cyan("\u{1F44B} Welcome to Horneross CLI!\n"));
|
|
759
|
-
console.log(chalk8.yellow("No configuration found. Please run:\n"));
|
|
760
|
-
console.log(chalk8.white(" horneross config init\n"));
|
|
761
|
-
process.exit(0);
|
|
762
|
-
}
|
|
763
|
-
} catch (error) {
|
|
764
|
-
showBanner();
|
|
765
|
-
console.log(chalk8.cyan("\u{1F44B} Welcome to Horneross CLI!\n"));
|
|
766
|
-
console.log(chalk8.yellow("No configuration found. Please run:\n"));
|
|
767
|
-
console.log(chalk8.white(" horneross config init\n"));
|
|
768
|
-
process.exit(0);
|
|
769
|
-
}
|
|
770
|
-
}
|
|
771
|
-
|
|
772
770
|
// src/index.ts
|
|
773
771
|
var program = new Command4();
|
|
774
772
|
program.name("horneross").description("Terminal interface for Horneross AI agents").version("0.1.0");
|
|
@@ -776,24 +774,20 @@ program.addCommand(createChatCommand());
|
|
|
776
774
|
program.addCommand(createConfigCommand());
|
|
777
775
|
program.addCommand(createInteractiveCommand());
|
|
778
776
|
program.on("command:*", () => {
|
|
779
|
-
console.error(
|
|
780
|
-
console.log(
|
|
781
|
-
console.log(
|
|
782
|
-
console.log(
|
|
783
|
-
console.log(
|
|
784
|
-
console.log(
|
|
785
|
-
console.log(
|
|
777
|
+
console.error(chalk8.red("\n\u2716 Invalid command"));
|
|
778
|
+
console.log(chalk8.yellow("\nAvailable commands:"));
|
|
779
|
+
console.log(chalk8.gray(" horneross chat <message> Send a one-shot message"));
|
|
780
|
+
console.log(chalk8.gray(" horneross interactive Start interactive session"));
|
|
781
|
+
console.log(chalk8.gray(" horneross config init Initialize configuration"));
|
|
782
|
+
console.log(chalk8.gray(" horneross config show Show current configuration"));
|
|
783
|
+
console.log(chalk8.gray('\nRun "horneross --help" for more details\n'));
|
|
786
784
|
process.exit(1);
|
|
787
785
|
});
|
|
788
|
-
|
|
789
|
-
|
|
790
|
-
|
|
791
|
-
|
|
792
|
-
|
|
793
|
-
|
|
786
|
+
if (!process.argv.slice(2).length) {
|
|
787
|
+
Promise.resolve().then(() => (init_auto_start(), auto_start_exports)).then(({ autoStart: autoStart2 }) => {
|
|
788
|
+
autoStart2();
|
|
789
|
+
});
|
|
790
|
+
} else {
|
|
791
|
+
program.parse(process.argv);
|
|
794
792
|
}
|
|
795
|
-
main().catch((error) => {
|
|
796
|
-
console.error(chalk9.red("\n\u2716 Fatal error:"), error.message);
|
|
797
|
-
process.exit(1);
|
|
798
|
-
});
|
|
799
793
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts","../src/commands/chat.ts","../src/config/config-manager.ts","../src/adapters/stream-adapter.ts","../src/utils/markdown.ts","../src/commands/config.ts","../src/auth/auth-manager.ts","../src/commands/interactive.ts","../src/utils/banner.ts","../src/utils/auto-start.ts"],"sourcesContent":["import { Command } from 'commander';\nimport chalk from 'chalk';\nimport { createChatCommand } from './commands/chat.js';\nimport { createConfigCommand } from './commands/config.js';\nimport { createInteractiveCommand } from './commands/interactive.js';\nimport { autoStart } from './utils/auto-start.js';\n\nconst program = new Command();\n\nprogram\n .name('horneross')\n .description('Terminal interface for Horneross AI agents')\n .version('0.1.0');\n\nprogram.addCommand(createChatCommand());\nprogram.addCommand(createConfigCommand());\nprogram.addCommand(createInteractiveCommand());\n\nprogram.on('command:*', () => {\n console.error(chalk.red('\\n✖ Invalid command'));\n console.log(chalk.yellow('\\nAvailable commands:'));\n console.log(chalk.gray(' horneross chat <message> Send a one-shot message'));\n console.log(chalk.gray(' horneross interactive Start interactive session'));\n console.log(chalk.gray(' horneross config init Initialize configuration'));\n console.log(chalk.gray(' horneross config show Show current configuration'));\n console.log(chalk.gray('\\nRun \"horneross --help\" for more details\\n'));\n process.exit(1);\n});\n\n// Main entry point - use top-level await\nasync function main() {\n // Auto-start interactive mode when no command is provided\n if (!process.argv.slice(2).length) {\n await autoStart();\n // If autoStart didn't exit (config is valid), start interactive mode\n process.argv.push('interactive');\n }\n\n await program.parseAsync(process.argv);\n}\n\n// Run main\nmain().catch((error) => {\n console.error(chalk.red('\\n✖ Fatal error:'), error.message);\n process.exit(1);\n});\n","import { Command } from 'commander';\nimport chalk from 'chalk';\nimport { ConfigManager } from '../config/config-manager.js';\nimport { StreamAdapter } from '../adapters/stream-adapter.js';\nimport type { ChatOptions } from '../types.js';\n\nexport function createChatCommand(): Command {\n const chat = new Command('chat');\n\n chat\n .description('Send a one-shot message to your agent')\n .argument('<message>', 'Message to send to the agent')\n .option('-a, --agent <name>', 'Agent to use (defaults to configured default)')\n .option('--conversation-id <id>', 'Continue an existing conversation')\n .action(async (message: string, options: ChatOptions) => {\n try {\n const config = await ConfigManager.load();\n const agentName = options.agent || config.default_agent;\n\n if (!agentName) {\n console.error(chalk.red('\\n✖ No default agent configured'));\n console.error(chalk.yellow('Run: horneross config init\\n'));\n process.exit(1);\n }\n\n const agent = config.agents[agentName];\n if (!agent) {\n console.error(chalk.red(`\\n✖ Agent \"${agentName}\" not found`));\n console.error(chalk.yellow('Available agents:'));\n for (const name of Object.keys(config.agents)) {\n console.error(chalk.gray(` - ${name}`));\n }\n console.error();\n process.exit(1);\n }\n\n const requestBody = {\n query: message,\n streaming: true,\n executionMode: 'chat' as const,\n ...(options.conversationId && { conversationId: options.conversationId }),\n };\n\n const response = await fetch(\n `${config.base_url}/api/v2/agent/${agent.id}/chat`,\n {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n Authorization: `Bearer ${agent.api_key}`,\n },\n body: JSON.stringify(requestBody),\n }\n );\n\n if (!response.ok) {\n const errorText = await response.text();\n console.error(chalk.red(`\\n✖ Request failed (${response.status}):`), errorText);\n process.exit(1);\n }\n\n const adapter = new StreamAdapter();\n const metadata = await adapter.processStream(response);\n\n if (metadata) {\n console.log(\n chalk.gray(\n `\\n\\nConversation ID: ${metadata.conversationId}`\n )\n );\n }\n\n console.log();\n } catch (error) {\n const message = error instanceof Error ? error.message : 'Unknown error';\n console.error(chalk.red('\\n✖ Chat failed:'), message);\n process.exit(1);\n }\n });\n\n return chat;\n}\n","import { readFile, writeFile, mkdir } from 'fs/promises';\nimport { homedir } from 'os';\nimport { join } from 'path';\nimport { parse, stringify } from 'yaml';\nimport type { CLIConfig, AgentConfig } from '../types.js';\n\nconst CONFIG_DIR = join(homedir(), '.horneross');\nconst CONFIG_PATH = join(CONFIG_DIR, 'config.yaml');\n\nconst DEFAULT_CONFIG: CLIConfig = {\n default_agent: '',\n base_url: 'http://localhost:3000',\n agents: {},\n};\n\nexport class ConfigManager {\n static async load(): Promise<CLIConfig> {\n try {\n const content = await readFile(CONFIG_PATH, 'utf-8');\n const config = parse(content) as CLIConfig;\n return { ...DEFAULT_CONFIG, ...config };\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code === 'ENOENT') {\n return DEFAULT_CONFIG;\n }\n throw error;\n }\n }\n\n static async save(config: CLIConfig): Promise<void> {\n await mkdir(CONFIG_DIR, { recursive: true });\n const content = stringify(config);\n await writeFile(CONFIG_PATH, content, { mode: 0o600 });\n }\n\n static async addAgent(\n name: string,\n agentConfig: AgentConfig\n ): Promise<void> {\n const config = await this.load();\n config.agents[name] = agentConfig;\n\n if (!config.default_agent) {\n config.default_agent = name;\n }\n\n await this.save(config);\n }\n\n static async getAgent(name?: string): Promise<AgentConfig> {\n const config = await this.load();\n const agentName = name || config.default_agent;\n\n if (!agentName) {\n throw new Error('No default agent configured. Run: horneross config init');\n }\n\n const agent = config.agents[agentName];\n if (!agent) {\n throw new Error(`Agent \"${agentName}\" not found in configuration`);\n }\n\n return agent;\n }\n\n static async validateAuth(\n agentConfig: AgentConfig,\n baseUrl: string\n ): Promise<boolean> {\n try {\n const response = await fetch(`${baseUrl}/api/v2/agent/${agentConfig.id}/config`, {\n headers: {\n Authorization: `Bearer ${agentConfig.api_key}`,\n },\n });\n\n return response.ok;\n } catch {\n return false;\n }\n }\n\n static getConfigPath(): string {\n return CONFIG_PATH;\n }\n}\n","import { createParser } from 'eventsource-parser';\nimport ora, { type Ora } from 'ora';\nimport chalk from 'chalk';\nimport { renderMarkdown } from '../utils/markdown.js';\nimport type { SSEEvent, StreamMetadata } from '../types.js';\n\nexport class StreamAdapter {\n private activeSpinner: Ora | null = null;\n private toolCallStack: Map<string, { name: string; startTime: number }> =\n new Map();\n private metadata: StreamMetadata | null = null;\n private isThinking = false;\n private hasOutputText = false;\n private toolsExecuted: Array<{ name: string; duration: number }> = [];\n private sessionStartTime = Date.now();\n\n async processStream(response: Response): Promise<StreamMetadata | null> {\n if (!response.body) {\n throw new Error('Response body is null');\n }\n\n // Show initial thinking indicator\n this.isThinking = true;\n process.stdout.write(chalk.gray('🤔 Thinking...\\n'));\n\n const reader = response.body.getReader();\n const decoder = new TextDecoder();\n\n return new Promise((resolve, reject) => {\n const parser = createParser((event) => {\n if (event.type === 'event') {\n // Ignore [DONE] marker\n if (event.data === '[DONE]') {\n return;\n }\n\n try {\n const data = JSON.parse(event.data);\n this.handleEvent(data);\n } catch (error) {\n // Silently ignore parse errors (they happen with [DONE] and other markers)\n if (event.data !== '[DONE]') {\n console.error(chalk.red('Failed to parse SSE event:'), error);\n }\n }\n }\n });\n\n const processChunk = async (): Promise<void> => {\n try {\n const { done, value } = await reader.read();\n\n if (done) {\n this.cleanup();\n resolve(this.metadata);\n return;\n }\n\n const chunk = decoder.decode(value, { stream: true });\n parser.feed(chunk);\n\n await processChunk();\n } catch (error) {\n this.cleanup();\n reject(error);\n }\n };\n\n processChunk();\n });\n }\n\n private handleEvent(event: SSEEvent): void {\n switch (event.type) {\n case 'text-delta':\n this.handleTextDelta(event);\n break;\n case 'tool-call':\n this.handleToolCall(event);\n break;\n case 'tool-result':\n this.handleToolResult(event);\n break;\n case 'data-message-ids':\n this.handleMetadata(event);\n break;\n case 'data-prefetched_sources':\n this.handleSources(event);\n break;\n case 'data-suggestions':\n this.handleSuggestions(event);\n break;\n case 'data-tool-output':\n this.handleToolOutput(event);\n break;\n case 'error':\n this.handleError(event);\n break;\n }\n }\n\n private handleTextDelta(event: SSEEvent): void {\n // Stop any active spinner when text starts coming\n if (this.activeSpinner) {\n this.activeSpinner.stop();\n this.activeSpinner = null;\n }\n\n // Clear thinking indicator on first text output\n if (this.isThinking && !this.hasOutputText) {\n // Move cursor up and clear the \"Thinking...\" line\n process.stdout.write('\\x1b[1A\\x1b[2K');\n this.isThinking = false;\n }\n\n const text = event.delta || event.content;\n if (text) {\n this.hasOutputText = true;\n // Render markdown formatting (bold, italic, code)\n const formatted = renderMarkdown(text);\n process.stdout.write(formatted);\n }\n }\n\n private handleToolCall(event: SSEEvent): void {\n const { toolName, args } = event;\n const toolCallId = `${toolName}-${Date.now()}`;\n\n this.toolCallStack.set(toolCallId, {\n name: toolName || 'unknown',\n startTime: Date.now(),\n });\n\n // Stop previous spinner if any\n if (this.activeSpinner) {\n this.activeSpinner.stop();\n }\n\n // Clear thinking indicator if still showing\n if (this.isThinking) {\n process.stdout.write('\\x1b[1A\\x1b[2K');\n this.isThinking = false;\n }\n\n // Add newline if this is the first tool after text output\n if (this.hasOutputText) {\n process.stdout.write('\\n');\n }\n\n const argsPreview = this.formatArgs(args);\n const toolIcon = this.getToolIcon(toolName);\n this.activeSpinner = ora({\n text: chalk.cyan(`${toolIcon} ${toolName}${argsPreview}`),\n }).start();\n }\n\n private handleToolResult(event: SSEEvent): void {\n if (this.activeSpinner) {\n const { toolName } = event;\n const elapsedMs = this.getElapsedTimeMs();\n const elapsed = this.formatDuration(elapsedMs);\n const toolIcon = this.getToolIcon(toolName);\n\n // Track tool execution\n if (toolName) {\n this.toolsExecuted.push({ name: toolName, duration: elapsedMs });\n }\n\n this.activeSpinner.succeed(\n chalk.green(`${toolIcon} ${toolName} ${chalk.gray(`(${elapsed})`)}`)\n );\n this.activeSpinner = null;\n }\n\n // Show thinking indicator after tool completes\n if (!this.isThinking) {\n this.isThinking = true;\n process.stdout.write(chalk.gray('🤔 Thinking...\\n'));\n }\n }\n\n private handleToolOutput(event: SSEEvent): void {\n // Handle progress updates from tools\n if (event.data && typeof event.data === 'object') {\n const data = event.data as { status?: string; message?: string };\n if (this.activeSpinner && data.message) {\n this.activeSpinner.text = chalk.cyan(data.message);\n }\n }\n }\n\n private handleSources(event: SSEEvent): void {\n if (event.data && Array.isArray(event.data)) {\n const sources = event.data as Array<{ datastoreName: string; results: unknown[] }>;\n if (sources.length > 0) {\n console.log(chalk.blue('\\n📚 Consulting knowledge base:'));\n sources.forEach((source) => {\n console.log(chalk.gray(` • ${source.datastoreName} (${source.results.length} results)`));\n });\n console.log('');\n }\n }\n }\n\n private handleSuggestions(event: SSEEvent): void {\n if (event.data && typeof event.data === 'object') {\n const data = event.data as { suggestions?: string[] };\n if (data.suggestions && data.suggestions.length > 0) {\n console.log(chalk.blue('\\n💡 Suggestions:'));\n data.suggestions.forEach((suggestion, i) => {\n console.log(chalk.gray(` ${i + 1}. ${suggestion}`));\n });\n }\n }\n }\n\n private getToolIcon(toolName?: string): string {\n const icons: Record<string, string> = {\n web_search: '🔍',\n browser: '🌐',\n pdf_generator: '📄',\n pdf_report: '📊',\n sandbox_shell: '💻',\n sandbox_file_write: '📝',\n sandbox_file_read: '📖',\n http: '🌐',\n think: '🤔',\n analyze: '🔬',\n };\n return icons[toolName || ''] || '🔧';\n }\n\n private handleMetadata(event: SSEEvent): void {\n if (event.data && typeof event.data === 'object' && 'conversationId' in event.data) {\n this.metadata = event.data as StreamMetadata;\n }\n }\n\n private handleError(event: SSEEvent): void {\n this.cleanup();\n console.error(chalk.red('\\n✖ Error:'), event.content || 'Unknown error');\n }\n\n private formatArgs(args: unknown): string {\n if (!args || typeof args !== 'object') {\n return '';\n }\n\n const entries = Object.entries(args as Record<string, unknown>);\n if (entries.length === 0) {\n return '';\n }\n\n const preview = entries\n .slice(0, 2)\n .map(([key, value]) => {\n const valueStr = typeof value === 'string' ? value : JSON.stringify(value);\n const truncated = valueStr.length > 30 ? valueStr.slice(0, 30) + '...' : valueStr;\n return `${key}: ${truncated}`;\n })\n .join(', ');\n\n return ` ${chalk.gray(`(${preview})`)}`;\n }\n\n private getElapsedTimeMs(): number {\n const lastTool = Array.from(this.toolCallStack.values()).pop();\n if (!lastTool) {\n return 0;\n }\n return Date.now() - lastTool.startTime;\n }\n\n private formatDuration(ms: number): string {\n if (ms < 1000) {\n return `${ms}ms`;\n }\n return `${(ms / 1000).toFixed(1)}s`;\n }\n\n getSessionSummary(): {\n duration: number;\n toolsUsed: number;\n toolsList: Array<{ name: string; duration: number }>;\n } {\n return {\n duration: Date.now() - this.sessionStartTime,\n toolsUsed: this.toolsExecuted.length,\n toolsList: this.toolsExecuted,\n };\n }\n\n private cleanup(): void {\n if (this.activeSpinner) {\n this.activeSpinner.stop();\n this.activeSpinner = null;\n }\n this.toolCallStack.clear();\n }\n}\n","import chalk from 'chalk';\n\n/**\n * Convert basic markdown to ANSI codes for terminal display\n * Supports: **bold**, *italic*, `code`\n */\nexport function renderMarkdown(text: string): string {\n let result = text;\n\n // Bold: **text** -> chalk.bold()\n result = result.replace(/\\*\\*([^*]+)\\*\\*/g, (_, content) => chalk.bold(content));\n\n // Italic: *text* -> chalk.italic()\n result = result.replace(/\\*([^*]+)\\*/g, (_, content) => chalk.italic(content));\n\n // Code: `text` -> chalk.cyan()\n result = result.replace(/`([^`]+)`/g, (_, content) => chalk.cyan(content));\n\n return result;\n}\n","import { Command } from 'commander';\nimport chalk from 'chalk';\nimport * as readline from 'readline/promises';\nimport { ConfigManager } from '../config/config-manager.js';\nimport { AuthManager } from '../auth/auth-manager.js';\n\nexport function createConfigCommand(): Command {\n const config = new Command('config');\n\n config\n .command('init')\n .description('Initialize Horneross CLI configuration')\n .action(async () => {\n console.log(chalk.bold.cyan('\\n🤖 Horneross CLI Setup\\n'));\n\n const rl = readline.createInterface({\n input: process.stdin,\n output: process.stdout,\n });\n\n try {\n const agentName = await rl.question(\n chalk.yellow('Agent name (e.g., \"adam\"): ')\n );\n\n if (!agentName.trim()) {\n console.error(chalk.red('\\n✖ Agent name is required'));\n process.exit(1);\n }\n\n const agentId = await rl.question(\n chalk.yellow('Agent ID: ')\n );\n\n if (!agentId.trim()) {\n console.error(chalk.red('\\n✖ Agent ID is required'));\n process.exit(1);\n }\n\n const apiKey = await rl.question(\n chalk.yellow('API Key: ')\n );\n\n if (!apiKey.trim()) {\n console.error(chalk.red('\\n✖ API Key is required'));\n process.exit(1);\n }\n\n const baseUrl = await rl.question(\n chalk.yellow('Base URL [http://localhost:3000]: ')\n );\n\n const finalBaseUrl = baseUrl.trim() || 'http://localhost:3000';\n\n rl.close();\n\n const agentConfig = {\n id: agentId.trim(),\n api_key: apiKey.trim(),\n name: agentName.trim(),\n };\n\n console.log(chalk.gray('\\n⏳ Validating connection...'));\n\n const { valid, error } = await AuthManager.validateConnection(\n agentConfig,\n finalBaseUrl\n );\n\n if (!valid) {\n AuthManager.displayAuthError(error || 'Unknown error');\n process.exit(1);\n }\n\n await ConfigManager.addAgent(agentName.trim(), agentConfig);\n\n const currentConfig = await ConfigManager.load();\n currentConfig.base_url = finalBaseUrl;\n await ConfigManager.save(currentConfig);\n\n console.log(chalk.green('\\n✓ Configuration saved successfully!'));\n console.log(chalk.gray(`\\nConfig file: ${ConfigManager.getConfigPath()}`));\n console.log(chalk.gray(`Default agent: ${agentName.trim()}`));\n console.log(chalk.cyan('\\nYou can now run: horneross chat \"Hello\"\\n'));\n } catch (error) {\n rl.close();\n console.error(chalk.red('\\n✖ Setup failed:'), error);\n process.exit(1);\n }\n });\n\n config\n .command('show')\n .description('Show current configuration')\n .action(async () => {\n try {\n const config = await ConfigManager.load();\n\n console.log(chalk.bold.cyan('\\n🔧 Current Configuration\\n'));\n console.log(chalk.yellow('Base URL:'), config.base_url);\n console.log(chalk.yellow('Default Agent:'), config.default_agent || chalk.gray('(not set)'));\n console.log(chalk.yellow('\\nConfigured Agents:'));\n\n if (Object.keys(config.agents).length === 0) {\n console.log(chalk.gray(' No agents configured'));\n } else {\n for (const [name, agent] of Object.entries(config.agents)) {\n const isDefault = name === config.default_agent;\n const marker = isDefault ? chalk.green('✓') : ' ';\n console.log(` ${marker} ${chalk.cyan(name)} (${agent.id})`);\n }\n }\n\n console.log(chalk.gray(`\\nConfig file: ${ConfigManager.getConfigPath()}\\n`));\n } catch (error) {\n console.error(chalk.red('Failed to load configuration:'), error);\n process.exit(1);\n }\n });\n\n return config;\n}\n","import chalk from 'chalk';\nimport type { AgentConfig } from '../types.js';\n\nexport class AuthManager {\n static async validateConnection(\n agentConfig: AgentConfig,\n baseUrl: string\n ): Promise<{ valid: boolean; error?: string }> {\n try {\n const response = await fetch(`${baseUrl}/api/v2/agent/${agentConfig.id}/config`, {\n headers: {\n Authorization: `Bearer ${agentConfig.api_key}`,\n },\n });\n\n if (response.ok) {\n return { valid: true };\n }\n\n if (response.status === 401) {\n return { valid: false, error: 'Invalid API key' };\n }\n\n if (response.status === 404) {\n return { valid: false, error: 'Agent not found' };\n }\n\n return { valid: false, error: `HTTP ${response.status}: ${response.statusText}` };\n } catch (error) {\n const message = error instanceof Error ? error.message : 'Unknown error';\n return { valid: false, error: `Connection failed: ${message}` };\n }\n }\n\n static displayAuthError(error: string): void {\n console.error(chalk.red('\\n✖ Authentication failed:'), error);\n console.error(chalk.yellow('\\nTroubleshooting:'));\n console.error(chalk.gray(' 1. Check your API key is correct'));\n console.error(chalk.gray(' 2. Verify the agent ID exists'));\n console.error(chalk.gray(' 3. Ensure the base URL is accessible'));\n console.error(chalk.gray('\\nRun: horneross config init'));\n }\n}\n","import { Command } from 'commander';\nimport chalk from 'chalk';\nimport ora from 'ora';\nimport * as readline from 'readline';\nimport { createId } from '@paralleldrive/cuid2';\nimport { ConfigManager } from '../config/config-manager.js';\nimport { StreamAdapter } from '../adapters/stream-adapter.js';\nimport { showBanner } from '../utils/banner.js';\n\nexport function createInteractiveCommand(): Command {\n const interactive = new Command('interactive');\n\n interactive\n .description('Start an interactive chat session')\n .option('-a, --agent <name>', 'Agent to use (defaults to configured default)')\n .action(async (options: { agent?: string }) => {\n try {\n const config = await ConfigManager.load();\n const agentName = options.agent || config.default_agent;\n\n if (!agentName) {\n console.error(chalk.red('\\n✖ No default agent configured'));\n console.error(chalk.yellow('Run: horneross config init\\n'));\n process.exit(1);\n }\n\n const agent = config.agents[agentName];\n if (!agent) {\n console.error(chalk.red(`\\n✖ Agent \"${agentName}\" not found`));\n process.exit(1);\n }\n\n // Show banner\n showBanner();\n\n console.log(chalk.bold.cyan(`🤖 Chatting with ${agent.name}`));\n console.log(chalk.gray('Commands: /help /exit /clear /agent /config\\n'));\n\n const conversationId = createId();\n let messageCount = 0;\n let totalToolsUsed = 0;\n const sessionStartTime = Date.now();\n\n // Wrap readline in a Promise to keep the async action handler alive\n await new Promise<void>((resolve) => {\n const rl = readline.createInterface({\n input: process.stdin,\n output: process.stdout,\n prompt: chalk.green('> '),\n });\n\n rl.prompt();\n\n rl.on('line', async (input) => {\n const trimmed = input.trim();\n\n // Handle slash commands\n if (trimmed.startsWith('/')) {\n const [command, ...args] = trimmed.slice(1).split(' ');\n\n switch (command.toLowerCase()) {\n case 'exit':\n case 'quit':\n rl.close();\n return;\n\n case 'help':\n console.log(chalk.cyan('\\n📚 Available Commands:\\n'));\n console.log(chalk.gray(' /exit Exit the chat'));\n console.log(chalk.gray(' /clear Clear the screen'));\n console.log(chalk.gray(' /config Show current configuration'));\n console.log(chalk.gray(' /agent <name> Switch to a different agent'));\n console.log(chalk.gray(' /help Show this help message\\n'));\n rl.prompt();\n return;\n\n case 'clear':\n console.clear();\n showBanner();\n console.log(chalk.bold.cyan(`🤖 Chatting with ${agent.name}`));\n console.log(chalk.gray('Commands: /help /exit /clear /agent /config\\n'));\n rl.prompt();\n return;\n\n case 'config':\n console.log(chalk.cyan('\\n⚙️ Current Configuration:\\n'));\n console.log(chalk.gray(` Agent: ${agent.name} (${agent.id})`));\n console.log(chalk.gray(` Base URL: ${config.base_url}`));\n console.log(chalk.gray(` Conversation ID: ${conversationId}\\n`));\n rl.prompt();\n return;\n\n case 'agent':\n if (!args[0]) {\n console.log(chalk.red('\\n✖ Please specify an agent name'));\n console.log(chalk.yellow('Available agents:'));\n Object.keys(config.agents).forEach(name => {\n console.log(chalk.gray(` - ${name}`));\n });\n console.log('');\n rl.prompt();\n return;\n }\n // TODO: Implement agent switching\n console.log(chalk.yellow('\\n⚠️ Agent switching not yet implemented\\n'));\n rl.prompt();\n return;\n\n default:\n console.log(chalk.red(`\\n✖ Unknown command: /${command}`));\n console.log(chalk.yellow('Type /help for available commands\\n'));\n rl.prompt();\n return;\n }\n }\n\n // Regular exit commands without slash\n if (trimmed === 'exit' || trimmed === 'quit') {\n rl.close();\n return;\n }\n\n if (!trimmed) {\n rl.prompt();\n return;\n }\n\n try {\n messageCount++;\n\n // Show immediate feedback\n console.log('');\n const startSpinner = ora({\n text: chalk.gray('Starting...'),\n color: 'gray',\n }).start();\n\n const response = await fetch(\n `${config.base_url}/api/v2/agent/${agent.id}/chat`,\n {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n Authorization: `Bearer ${agent.api_key}`,\n },\n body: JSON.stringify({\n query: trimmed,\n streaming: true,\n executionMode: 'chat',\n conversationId,\n }),\n }\n );\n\n // Stop start spinner once connected\n startSpinner.stop();\n\n if (!response.ok) {\n let errorMessage = `Request failed (${response.status})`;\n try {\n const errorData = await response.json();\n errorMessage = errorData.error || errorData.message || errorMessage;\n } catch {\n const errorText = await response.text();\n errorMessage = errorText || errorMessage;\n }\n\n console.error(chalk.red('\\n✖ Error:'), errorMessage);\n\n // Provide helpful hints based on status code\n if (response.status === 401) {\n console.log(chalk.yellow(' Hint: Check your API key configuration'));\n } else if (response.status === 429) {\n console.log(chalk.yellow(' Hint: Rate limit exceeded, please wait a moment'));\n } else if (response.status === 500) {\n console.log(chalk.yellow(' Hint: Server error, please try again later'));\n }\n\n console.log('');\n rl.prompt();\n return;\n }\n\n const adapter = new StreamAdapter();\n await adapter.processStream(response);\n\n // Track session metrics\n const summary = adapter.getSessionSummary();\n totalToolsUsed += summary.toolsUsed;\n\n console.log('\\n');\n rl.prompt();\n } catch (error) {\n let message = 'Unknown error';\n let hint = '';\n\n if (error instanceof Error) {\n message = error.message;\n\n // Provide specific hints based on error type\n if (message.includes('ECONNREFUSED')) {\n hint = 'Cannot connect to server. Is the Horneross backend running?';\n } else if (message.includes('ENOTFOUND')) {\n hint = 'Cannot resolve hostname. Check your base_url configuration.';\n } else if (message.includes('ETIMEDOUT')) {\n hint = 'Connection timed out. Check your network connection.';\n } else if (message.includes('certificate') || message.includes('SSL')) {\n hint = 'SSL/TLS error. Check your certificates or try http:// instead of https://.';\n } else if (message.includes('fetch failed')) {\n hint = 'Network request failed. Check your internet connection and base_url.';\n }\n }\n\n console.error(chalk.red('\\n✖ Error:'), message);\n if (hint) {\n console.log(chalk.yellow(` Hint: ${hint}`));\n }\n console.log('');\n rl.prompt();\n }\n });\n\n rl.on('close', () => {\n const sessionDuration = Date.now() - sessionStartTime;\n const durationMinutes = Math.floor(sessionDuration / 60000);\n const durationSeconds = Math.floor((sessionDuration % 60000) / 1000);\n\n console.log('');\n console.log(chalk.blue('━'.repeat(50)));\n console.log(chalk.bold.cyan('\\n📊 Session Summary'));\n console.log(chalk.gray(` Messages: ${messageCount}`));\n console.log(chalk.gray(` Tools used: ${totalToolsUsed}`));\n console.log(chalk.gray(` Duration: ${durationMinutes}m ${durationSeconds}s`));\n console.log(chalk.gray(` Conversation ID: ${conversationId}`));\n\n if (messageCount > 0) {\n console.log(chalk.blue('\\n💡 Resume this conversation:'));\n console.log(chalk.yellow(` horneross --resume ${conversationId.slice(0, 8)}`));\n }\n\n console.log(chalk.blue('\\n━'.repeat(50)));\n console.log(chalk.gray('\\nGoodbye! 👋\\n'));\n\n // Resolve the promise to allow the async action to complete\n resolve();\n });\n });\n } catch (error) {\n const message = error instanceof Error ? error.message : 'Unknown error';\n console.error(chalk.red('\\n✖ Interactive mode failed:'), message);\n process.exit(1);\n }\n });\n\n return interactive;\n}\n","import chalk from 'chalk';\n\nexport function showBanner(): void {\n console.log();\n console.log(chalk.hex('#FF8800').bold(`\n ╦ ╦╔═╗╦═╗╔╗╔╔═╗╦═╗╔═╗╔═╗╔═╗\n ╠═╣║ ║╠╦╝║║║║╣ ╠╦╝║ ║╚═╗╚═╗\n ╩ ╩╚═╝╩╚═╝╚╝╚═╝╩╚═╚═╝╚═╝╚═╝\n`));\n console.log(chalk.gray.bold(' Terminal AI Agent Interface'));\n console.log(chalk.gray(' https://horneross.com'));\n console.log(chalk.gray(' ─────────────────────────────'));\n console.log();\n}\n","import chalk from 'chalk';\nimport { ConfigManager } from '../config/config-manager.js';\nimport { showBanner } from './banner.js';\n\nexport async function autoStart(): Promise<void> {\n try {\n // Try to load existing configuration\n const config = await ConfigManager.load();\n\n // Check if there's a default agent configured\n if (!config.default_agent || !config.agents[config.default_agent]) {\n // No configuration found - show welcome and exit\n showBanner();\n console.log(chalk.cyan('👋 Welcome to Horneross CLI!\\n'));\n console.log(chalk.yellow('No configuration found. Please run:\\n'));\n console.log(chalk.white(' horneross config init\\n'));\n process.exit(0);\n }\n\n // Configuration exists - return to let interactive mode run\n // (This function is called from index.ts which will then parse 'interactive' command)\n\n } catch (error) {\n // If config loading fails, assume no config exists\n showBanner();\n console.log(chalk.cyan('👋 Welcome to Horneross CLI!\\n'));\n console.log(chalk.yellow('No configuration found. Please run:\\n'));\n console.log(chalk.white(' horneross config init\\n'));\n process.exit(0);\n }\n}\n"],"mappings":"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","names":["Command","chalk","chalk","chalk","chalk","chalk","message","Command","chalk","chalk","Command","chalk","config","Command","chalk","ora","readline","chalk","Command","chalk","ora","chalk","chalk","Command","chalk"]}
|
|
1
|
+
{"version":3,"sources":["../../../node_modules/.pnpm/tsup@8.5.1_tsx@3.14.0_typescript@5.9.3_yaml@2.8.1/node_modules/tsup/assets/esm_shims.js","../src/config/config-manager.ts","../src/utils/banner.ts","../src/utils/auto-start.ts","../src/index.ts","../src/commands/chat.ts","../src/adapters/stream-adapter.ts","../src/commands/config.ts","../src/auth/auth-manager.ts","../src/commands/interactive.ts"],"sourcesContent":["// Shim globals in esm bundle\nimport path from 'node:path'\nimport { fileURLToPath } from 'node:url'\n\nconst getFilename = () => fileURLToPath(import.meta.url)\nconst getDirname = () => path.dirname(getFilename())\n\nexport const __dirname = /* @__PURE__ */ getDirname()\nexport const __filename = /* @__PURE__ */ getFilename()\n","import { readFile, writeFile, mkdir } from 'fs/promises';\nimport { homedir } from 'os';\nimport { join } from 'path';\nimport { parse, stringify } from 'yaml';\nimport type { CLIConfig, AgentConfig } from '../types.js';\n\nconst CONFIG_DIR = join(homedir(), '.horneross');\nconst CONFIG_PATH = join(CONFIG_DIR, 'config.yaml');\n\nconst DEFAULT_CONFIG: CLIConfig = {\n default_agent: '',\n base_url: 'http://localhost:3000',\n agents: {},\n};\n\nexport class ConfigManager {\n static async load(): Promise<CLIConfig> {\n try {\n const content = await readFile(CONFIG_PATH, 'utf-8');\n const config = parse(content) as CLIConfig;\n return { ...DEFAULT_CONFIG, ...config };\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code === 'ENOENT') {\n return DEFAULT_CONFIG;\n }\n throw error;\n }\n }\n\n static async save(config: CLIConfig): Promise<void> {\n await mkdir(CONFIG_DIR, { recursive: true });\n const content = stringify(config);\n await writeFile(CONFIG_PATH, content, { mode: 0o600 });\n }\n\n static async addAgent(\n name: string,\n agentConfig: AgentConfig\n ): Promise<void> {\n const config = await this.load();\n config.agents[name] = agentConfig;\n\n if (!config.default_agent) {\n config.default_agent = name;\n }\n\n await this.save(config);\n }\n\n static async getAgent(name?: string): Promise<AgentConfig> {\n const config = await this.load();\n const agentName = name || config.default_agent;\n\n if (!agentName) {\n throw new Error('No default agent configured. Run: horneross config init');\n }\n\n const agent = config.agents[agentName];\n if (!agent) {\n throw new Error(`Agent \"${agentName}\" not found in configuration`);\n }\n\n return agent;\n }\n\n static async validateAuth(\n agentConfig: AgentConfig,\n baseUrl: string\n ): Promise<boolean> {\n try {\n const response = await fetch(`${baseUrl}/api/v2/agent/${agentConfig.id}/config`, {\n headers: {\n Authorization: `Bearer ${agentConfig.api_key}`,\n },\n });\n\n return response.ok;\n } catch {\n return false;\n }\n }\n\n static getConfigPath(): string {\n return CONFIG_PATH;\n }\n}\n","import chalk from 'chalk';\n\nexport function showBanner(): void {\n console.log();\n console.log(chalk.hex('#FF8800').bold(`\n ╦ ╦╔═╗╦═╗╔╗╔╔═╗╦═╗╔═╗╔═╗╔═╗\n ╠═╣║ ║╠╦╝║║║║╣ ╠╦╝║ ║╚═╗╚═╗\n ╩ ╩╚═╝╩╚═╝╚╝╚═╝╩╚═╚═╝╚═╝╚═╝\n`));\n console.log(chalk.gray.bold(' Terminal AI Agent Interface'));\n console.log(chalk.gray(' https://horneross.com'));\n console.log(chalk.gray(' ─────────────────────────────'));\n console.log();\n}\n","import chalk from 'chalk';\nimport { ConfigManager } from '../config/config-manager.js';\nimport { execSync } from 'child_process';\nimport { showBanner } from './banner.js';\n\nexport async function autoStart(): Promise<void> {\n try {\n // Try to load existing configuration\n const config = await ConfigManager.load();\n\n // Check if there's a default agent configured\n if (!config.default_agent || !config.agents[config.default_agent]) {\n // No configuration found - run config init\n showBanner();\n console.log(chalk.cyan('👋 Welcome to Horneross CLI!\\n'));\n console.log(chalk.yellow('No configuration found. Let\\'s set up your first agent.\\n'));\n\n // Run config init\n execSync('horneross config init', { stdio: 'inherit' });\n return;\n }\n\n // Configuration exists - start interactive mode\n execSync('horneross interactive', { stdio: 'inherit' });\n\n } catch (error) {\n // If config loading fails, assume no config exists\n showBanner();\n console.log(chalk.cyan('👋 Welcome to Horneross CLI!\\n'));\n console.log(chalk.yellow('No configuration found. Let\\'s set up your first agent.\\n'));\n\n try {\n execSync('horneross config init', { stdio: 'inherit' });\n } catch (initError) {\n console.error(chalk.red('\\n✖ Configuration failed'));\n process.exit(1);\n }\n }\n}\n","import { Command } from 'commander';\nimport chalk from 'chalk';\nimport { createChatCommand } from './commands/chat.js';\nimport { createConfigCommand } from './commands/config.js';\nimport { createInteractiveCommand } from './commands/interactive.js';\n\nconst program = new Command();\n\nprogram\n .name('horneross')\n .description('Terminal interface for Horneross AI agents')\n .version('0.1.0');\n\nprogram.addCommand(createChatCommand());\nprogram.addCommand(createConfigCommand());\nprogram.addCommand(createInteractiveCommand());\n\nprogram.on('command:*', () => {\n console.error(chalk.red('\\n✖ Invalid command'));\n console.log(chalk.yellow('\\nAvailable commands:'));\n console.log(chalk.gray(' horneross chat <message> Send a one-shot message'));\n console.log(chalk.gray(' horneross interactive Start interactive session'));\n console.log(chalk.gray(' horneross config init Initialize configuration'));\n console.log(chalk.gray(' horneross config show Show current configuration'));\n console.log(chalk.gray('\\nRun \"horneross --help\" for more details\\n'));\n process.exit(1);\n});\n\n// Auto-start interactive mode when no command is provided\nif (!process.argv.slice(2).length) {\n // Import dynamically to avoid circular dependencies\n import('./utils/auto-start.js').then(({ autoStart }) => {\n autoStart();\n });\n} else {\n program.parse(process.argv);\n}\n","import { Command } from 'commander';\nimport chalk from 'chalk';\nimport { ConfigManager } from '../config/config-manager.js';\nimport { StreamAdapter } from '../adapters/stream-adapter.js';\nimport type { ChatOptions } from '../types.js';\n\nexport function createChatCommand(): Command {\n const chat = new Command('chat');\n\n chat\n .description('Send a one-shot message to your agent')\n .argument('<message>', 'Message to send to the agent')\n .option('-a, --agent <name>', 'Agent to use (defaults to configured default)')\n .option('--conversation-id <id>', 'Continue an existing conversation')\n .action(async (message: string, options: ChatOptions) => {\n try {\n const config = await ConfigManager.load();\n const agentName = options.agent || config.default_agent;\n\n if (!agentName) {\n console.error(chalk.red('\\n✖ No default agent configured'));\n console.error(chalk.yellow('Run: horneross config init\\n'));\n process.exit(1);\n }\n\n const agent = config.agents[agentName];\n if (!agent) {\n console.error(chalk.red(`\\n✖ Agent \"${agentName}\" not found`));\n console.error(chalk.yellow('Available agents:'));\n for (const name of Object.keys(config.agents)) {\n console.error(chalk.gray(` - ${name}`));\n }\n console.error();\n process.exit(1);\n }\n\n const requestBody = {\n query: message,\n streaming: true,\n executionMode: 'chat' as const,\n ...(options.conversationId && { conversationId: options.conversationId }),\n };\n\n const response = await fetch(\n `${config.base_url}/api/v2/agent/${agent.id}/chat`,\n {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n Authorization: `Bearer ${agent.api_key}`,\n },\n body: JSON.stringify(requestBody),\n }\n );\n\n if (!response.ok) {\n const errorText = await response.text();\n console.error(chalk.red(`\\n✖ Request failed (${response.status}):`), errorText);\n process.exit(1);\n }\n\n const adapter = new StreamAdapter();\n const metadata = await adapter.processStream(response);\n\n if (metadata) {\n console.log(\n chalk.gray(\n `\\n\\nConversation ID: ${metadata.conversationId}`\n )\n );\n }\n\n console.log();\n } catch (error) {\n const message = error instanceof Error ? error.message : 'Unknown error';\n console.error(chalk.red('\\n✖ Chat failed:'), message);\n process.exit(1);\n }\n });\n\n return chat;\n}\n","import { createParser } from 'eventsource-parser';\nimport ora, { type Ora } from 'ora';\nimport chalk from 'chalk';\nimport type { SSEEvent, StreamMetadata } from '../types.js';\n\nexport class StreamAdapter {\n private activeSpinner: Ora | null = null;\n private toolCallStack: Map<string, { name: string; startTime: number }> =\n new Map();\n private metadata: StreamMetadata | null = null;\n private isThinking = false;\n private hasOutputText = false;\n\n async processStream(response: Response): Promise<StreamMetadata | null> {\n if (!response.body) {\n throw new Error('Response body is null');\n }\n\n // Show initial thinking indicator\n this.isThinking = true;\n process.stdout.write(chalk.gray('🤔 Thinking...\\n'));\n\n const reader = response.body.getReader();\n const decoder = new TextDecoder();\n\n return new Promise((resolve, reject) => {\n const parser = createParser((event) => {\n if (event.type === 'event') {\n // Ignore [DONE] marker\n if (event.data === '[DONE]') {\n return;\n }\n\n try {\n const data = JSON.parse(event.data);\n this.handleEvent(data);\n } catch (error) {\n // Silently ignore parse errors (they happen with [DONE] and other markers)\n if (event.data !== '[DONE]') {\n console.error(chalk.red('Failed to parse SSE event:'), error);\n }\n }\n }\n });\n\n const processChunk = async (): Promise<void> => {\n try {\n const { done, value } = await reader.read();\n\n if (done) {\n this.cleanup();\n resolve(this.metadata);\n return;\n }\n\n const chunk = decoder.decode(value, { stream: true });\n parser.feed(chunk);\n\n await processChunk();\n } catch (error) {\n this.cleanup();\n reject(error);\n }\n };\n\n processChunk();\n });\n }\n\n private handleEvent(event: SSEEvent): void {\n switch (event.type) {\n case 'text-delta':\n this.handleTextDelta(event);\n break;\n case 'tool-call':\n this.handleToolCall(event);\n break;\n case 'tool-result':\n this.handleToolResult(event);\n break;\n case 'data-message-ids':\n this.handleMetadata(event);\n break;\n case 'data-prefetched_sources':\n this.handleSources(event);\n break;\n case 'data-suggestions':\n this.handleSuggestions(event);\n break;\n case 'data-tool-output':\n this.handleToolOutput(event);\n break;\n case 'error':\n this.handleError(event);\n break;\n }\n }\n\n private handleTextDelta(event: SSEEvent): void {\n // Stop any active spinner when text starts coming\n if (this.activeSpinner) {\n this.activeSpinner.stop();\n this.activeSpinner = null;\n }\n\n // Clear thinking indicator on first text output\n if (this.isThinking && !this.hasOutputText) {\n // Move cursor up and clear the \"Thinking...\" line\n process.stdout.write('\\x1b[1A\\x1b[2K');\n this.isThinking = false;\n }\n\n if (event.content) {\n this.hasOutputText = true;\n process.stdout.write(event.content);\n }\n }\n\n private handleToolCall(event: SSEEvent): void {\n const { toolName, args } = event;\n const toolCallId = `${toolName}-${Date.now()}`;\n\n this.toolCallStack.set(toolCallId, {\n name: toolName || 'unknown',\n startTime: Date.now(),\n });\n\n // Stop previous spinner if any\n if (this.activeSpinner) {\n this.activeSpinner.stop();\n }\n\n // Clear thinking indicator if still showing\n if (this.isThinking) {\n process.stdout.write('\\x1b[1A\\x1b[2K');\n this.isThinking = false;\n }\n\n // Add newline if this is the first tool after text output\n if (this.hasOutputText) {\n process.stdout.write('\\n');\n }\n\n const argsPreview = this.formatArgs(args);\n const toolIcon = this.getToolIcon(toolName);\n this.activeSpinner = ora({\n text: chalk.cyan(`${toolIcon} ${toolName}${argsPreview}`),\n }).start();\n }\n\n private handleToolResult(event: SSEEvent): void {\n if (this.activeSpinner) {\n const { toolName } = event;\n const elapsed = this.getElapsedTime();\n const toolIcon = this.getToolIcon(toolName);\n\n this.activeSpinner.succeed(\n chalk.green(`${toolIcon} ${toolName} ${chalk.gray(`(${elapsed})`)}`)\n );\n this.activeSpinner = null;\n }\n\n // Show thinking indicator after tool completes\n if (!this.isThinking) {\n this.isThinking = true;\n process.stdout.write(chalk.gray('🤔 Thinking...\\n'));\n }\n }\n\n private handleToolOutput(event: SSEEvent): void {\n // Handle progress updates from tools\n if (event.data && typeof event.data === 'object') {\n const data = event.data as { status?: string; message?: string };\n if (this.activeSpinner && data.message) {\n this.activeSpinner.text = chalk.cyan(data.message);\n }\n }\n }\n\n private handleSources(event: SSEEvent): void {\n if (event.data && Array.isArray(event.data)) {\n const sources = event.data as Array<{ datastoreName: string; results: unknown[] }>;\n if (sources.length > 0) {\n console.log(chalk.blue('\\n📚 Consulting knowledge base:'));\n sources.forEach((source) => {\n console.log(chalk.gray(` • ${source.datastoreName} (${source.results.length} results)`));\n });\n console.log('');\n }\n }\n }\n\n private handleSuggestions(event: SSEEvent): void {\n if (event.data && typeof event.data === 'object') {\n const data = event.data as { suggestions?: string[] };\n if (data.suggestions && data.suggestions.length > 0) {\n console.log(chalk.blue('\\n💡 Suggestions:'));\n data.suggestions.forEach((suggestion, i) => {\n console.log(chalk.gray(` ${i + 1}. ${suggestion}`));\n });\n }\n }\n }\n\n private getToolIcon(toolName?: string): string {\n const icons: Record<string, string> = {\n web_search: '🔍',\n browser: '🌐',\n pdf_generator: '📄',\n pdf_report: '📊',\n sandbox_shell: '💻',\n sandbox_file_write: '📝',\n sandbox_file_read: '📖',\n http: '🌐',\n think: '🤔',\n analyze: '🔬',\n };\n return icons[toolName || ''] || '🔧';\n }\n\n private handleMetadata(event: SSEEvent): void {\n if (event.data && typeof event.data === 'object' && 'conversationId' in event.data) {\n this.metadata = event.data as StreamMetadata;\n }\n }\n\n private handleError(event: SSEEvent): void {\n this.cleanup();\n console.error(chalk.red('\\n✖ Error:'), event.content || 'Unknown error');\n }\n\n private formatArgs(args: unknown): string {\n if (!args || typeof args !== 'object') {\n return '';\n }\n\n const entries = Object.entries(args as Record<string, unknown>);\n if (entries.length === 0) {\n return '';\n }\n\n const preview = entries\n .slice(0, 2)\n .map(([key, value]) => {\n const valueStr = typeof value === 'string' ? value : JSON.stringify(value);\n const truncated = valueStr.length > 30 ? valueStr.slice(0, 30) + '...' : valueStr;\n return `${key}: ${truncated}`;\n })\n .join(', ');\n\n return ` ${chalk.gray(`(${preview})`)}`;\n }\n\n private getElapsedTime(): string {\n const lastTool = Array.from(this.toolCallStack.values()).pop();\n if (!lastTool) {\n return '0s';\n }\n\n const elapsed = Date.now() - lastTool.startTime;\n return elapsed < 1000 ? `${elapsed}ms` : `${(elapsed / 1000).toFixed(1)}s`;\n }\n\n private cleanup(): void {\n if (this.activeSpinner) {\n this.activeSpinner.stop();\n this.activeSpinner = null;\n }\n this.toolCallStack.clear();\n }\n}\n","import { Command } from 'commander';\nimport chalk from 'chalk';\nimport * as readline from 'readline/promises';\nimport { ConfigManager } from '../config/config-manager.js';\nimport { AuthManager } from '../auth/auth-manager.js';\n\nexport function createConfigCommand(): Command {\n const config = new Command('config');\n\n config\n .command('init')\n .description('Initialize Horneross CLI configuration')\n .action(async () => {\n console.log(chalk.bold.cyan('\\n🤖 Horneross CLI Setup\\n'));\n\n const rl = readline.createInterface({\n input: process.stdin,\n output: process.stdout,\n });\n\n try {\n const agentName = await rl.question(\n chalk.yellow('Agent name (e.g., \"adam\"): ')\n );\n\n if (!agentName.trim()) {\n console.error(chalk.red('\\n✖ Agent name is required'));\n process.exit(1);\n }\n\n const agentId = await rl.question(\n chalk.yellow('Agent ID: ')\n );\n\n if (!agentId.trim()) {\n console.error(chalk.red('\\n✖ Agent ID is required'));\n process.exit(1);\n }\n\n const apiKey = await rl.question(\n chalk.yellow('API Key: ')\n );\n\n if (!apiKey.trim()) {\n console.error(chalk.red('\\n✖ API Key is required'));\n process.exit(1);\n }\n\n const baseUrl = await rl.question(\n chalk.yellow('Base URL [http://localhost:3000]: ')\n );\n\n const finalBaseUrl = baseUrl.trim() || 'http://localhost:3000';\n\n rl.close();\n\n const agentConfig = {\n id: agentId.trim(),\n api_key: apiKey.trim(),\n name: agentName.trim(),\n };\n\n console.log(chalk.gray('\\n⏳ Validating connection...'));\n\n const { valid, error } = await AuthManager.validateConnection(\n agentConfig,\n finalBaseUrl\n );\n\n if (!valid) {\n AuthManager.displayAuthError(error || 'Unknown error');\n process.exit(1);\n }\n\n await ConfigManager.addAgent(agentName.trim(), agentConfig);\n\n const currentConfig = await ConfigManager.load();\n currentConfig.base_url = finalBaseUrl;\n await ConfigManager.save(currentConfig);\n\n console.log(chalk.green('\\n✓ Configuration saved successfully!'));\n console.log(chalk.gray(`\\nConfig file: ${ConfigManager.getConfigPath()}`));\n console.log(chalk.gray(`Default agent: ${agentName.trim()}`));\n console.log(chalk.cyan('\\nYou can now run: horneross chat \"Hello\"\\n'));\n } catch (error) {\n rl.close();\n console.error(chalk.red('\\n✖ Setup failed:'), error);\n process.exit(1);\n }\n });\n\n config\n .command('show')\n .description('Show current configuration')\n .action(async () => {\n try {\n const config = await ConfigManager.load();\n\n console.log(chalk.bold.cyan('\\n🔧 Current Configuration\\n'));\n console.log(chalk.yellow('Base URL:'), config.base_url);\n console.log(chalk.yellow('Default Agent:'), config.default_agent || chalk.gray('(not set)'));\n console.log(chalk.yellow('\\nConfigured Agents:'));\n\n if (Object.keys(config.agents).length === 0) {\n console.log(chalk.gray(' No agents configured'));\n } else {\n for (const [name, agent] of Object.entries(config.agents)) {\n const isDefault = name === config.default_agent;\n const marker = isDefault ? chalk.green('✓') : ' ';\n console.log(` ${marker} ${chalk.cyan(name)} (${agent.id})`);\n }\n }\n\n console.log(chalk.gray(`\\nConfig file: ${ConfigManager.getConfigPath()}\\n`));\n } catch (error) {\n console.error(chalk.red('Failed to load configuration:'), error);\n process.exit(1);\n }\n });\n\n return config;\n}\n","import chalk from 'chalk';\nimport type { AgentConfig } from '../types.js';\n\nexport class AuthManager {\n static async validateConnection(\n agentConfig: AgentConfig,\n baseUrl: string\n ): Promise<{ valid: boolean; error?: string }> {\n try {\n const response = await fetch(`${baseUrl}/api/v2/agent/${agentConfig.id}/config`, {\n headers: {\n Authorization: `Bearer ${agentConfig.api_key}`,\n },\n });\n\n if (response.ok) {\n return { valid: true };\n }\n\n if (response.status === 401) {\n return { valid: false, error: 'Invalid API key' };\n }\n\n if (response.status === 404) {\n return { valid: false, error: 'Agent not found' };\n }\n\n return { valid: false, error: `HTTP ${response.status}: ${response.statusText}` };\n } catch (error) {\n const message = error instanceof Error ? error.message : 'Unknown error';\n return { valid: false, error: `Connection failed: ${message}` };\n }\n }\n\n static displayAuthError(error: string): void {\n console.error(chalk.red('\\n✖ Authentication failed:'), error);\n console.error(chalk.yellow('\\nTroubleshooting:'));\n console.error(chalk.gray(' 1. Check your API key is correct'));\n console.error(chalk.gray(' 2. Verify the agent ID exists'));\n console.error(chalk.gray(' 3. Ensure the base URL is accessible'));\n console.error(chalk.gray('\\nRun: horneross config init'));\n }\n}\n","import { Command } from 'commander';\nimport chalk from 'chalk';\nimport ora from 'ora';\nimport * as readline from 'readline';\nimport { createId } from '@paralleldrive/cuid2';\nimport { ConfigManager } from '../config/config-manager.js';\nimport { StreamAdapter } from '../adapters/stream-adapter.js';\nimport { showBanner } from '../utils/banner.js';\n\nexport function createInteractiveCommand(): Command {\n const interactive = new Command('interactive');\n\n interactive\n .description('Start an interactive chat session')\n .option('-a, --agent <name>', 'Agent to use (defaults to configured default)')\n .action(async (options: { agent?: string }) => {\n try {\n const config = await ConfigManager.load();\n const agentName = options.agent || config.default_agent;\n\n if (!agentName) {\n console.error(chalk.red('\\n✖ No default agent configured'));\n console.error(chalk.yellow('Run: horneross config init\\n'));\n process.exit(1);\n }\n\n const agent = config.agents[agentName];\n if (!agent) {\n console.error(chalk.red(`\\n✖ Agent \"${agentName}\" not found`));\n process.exit(1);\n }\n\n // Show banner\n showBanner();\n\n console.log(chalk.bold.cyan(`🤖 Chatting with ${agent.name}`));\n console.log(chalk.gray('Commands: /help /exit /clear /agent /config\\n'));\n\n const conversationId = createId();\n let messageCount = 0;\n\n // Wrap readline in Promise to keep async action alive\n await new Promise<void>((resolve) => {\n const rl = readline.createInterface({\n input: process.stdin,\n output: process.stdout,\n prompt: chalk.green('> '),\n });\n\n rl.prompt();\n\n rl.on('line', async (input) => {\n const trimmed = input.trim();\n\n // Handle slash commands\n if (trimmed.startsWith('/')) {\n const [command, ...args] = trimmed.slice(1).split(' ');\n\n switch (command.toLowerCase()) {\n case 'exit':\n case 'quit':\n rl.close();\n return;\n\n case 'help':\n console.log(chalk.cyan('\\n📚 Available Commands:\\n'));\n console.log(chalk.gray(' /exit Exit the chat'));\n console.log(chalk.gray(' /clear Clear the screen'));\n console.log(chalk.gray(' /config Show current configuration'));\n console.log(chalk.gray(' /agent <name> Switch to a different agent'));\n console.log(chalk.gray(' /help Show this help message\\n'));\n rl.prompt();\n return;\n\n case 'clear':\n console.clear();\n showBanner();\n console.log(chalk.bold.cyan(`🤖 Chatting with ${agent.name}`));\n console.log(chalk.gray('Commands: /help /exit /clear /agent /config\\n'));\n rl.prompt();\n return;\n\n case 'config':\n console.log(chalk.cyan('\\n⚙️ Current Configuration:\\n'));\n console.log(chalk.gray(` Agent: ${agent.name} (${agent.id})`));\n console.log(chalk.gray(` Base URL: ${config.base_url}`));\n console.log(chalk.gray(` Conversation ID: ${conversationId}\\n`));\n rl.prompt();\n return;\n\n case 'agent':\n if (!args[0]) {\n console.log(chalk.red('\\n✖ Please specify an agent name'));\n console.log(chalk.yellow('Available agents:'));\n Object.keys(config.agents).forEach(name => {\n console.log(chalk.gray(` - ${name}`));\n });\n console.log('');\n rl.prompt();\n return;\n }\n // TODO: Implement agent switching\n console.log(chalk.yellow('\\n⚠️ Agent switching not yet implemented\\n'));\n rl.prompt();\n return;\n\n default:\n console.log(chalk.red(`\\n✖ Unknown command: /${command}`));\n console.log(chalk.yellow('Type /help for available commands\\n'));\n rl.prompt();\n return;\n }\n }\n\n // Regular exit commands without slash\n if (trimmed === 'exit' || trimmed === 'quit') {\n rl.close();\n return;\n }\n\n if (!trimmed) {\n rl.prompt();\n return;\n }\n\n try {\n messageCount++;\n\n // Show immediate feedback\n console.log('');\n const startSpinner = ora({\n text: chalk.gray('Starting...'),\n color: 'gray',\n }).start();\n\n const response = await fetch(\n `${config.base_url}/api/v2/agent/${agent.id}/chat`,\n {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n Authorization: `Bearer ${agent.api_key}`,\n },\n body: JSON.stringify({\n query: trimmed,\n streaming: true,\n executionMode: 'chat',\n conversationId,\n }),\n }\n );\n\n // Stop start spinner once connected\n startSpinner.stop();\n\n if (!response.ok) {\n const errorText = await response.text();\n console.error(chalk.red(`\\n✖ Request failed (${response.status}):`), errorText);\n rl.prompt();\n return;\n }\n\n const adapter = new StreamAdapter();\n await adapter.processStream(response);\n\n console.log('\\n');\n rl.prompt();\n } catch (error) {\n let message = 'Unknown error';\n let hint = '';\n\n if (error instanceof Error) {\n message = error.message;\n\n // Provide specific hints based on error type\n if (message.includes('ECONNREFUSED')) {\n hint = 'Cannot connect to server. Is the Horneross backend running?';\n } else if (message.includes('ENOTFOUND')) {\n hint = 'Cannot resolve hostname. Check your base_url configuration.';\n } else if (message.includes('ETIMEDOUT')) {\n hint = 'Connection timed out. Check your network connection.';\n } else if (message.includes('certificate') || message.includes('SSL')) {\n hint = 'SSL/TLS error. Check your certificates or try http:// instead of https://.';\n } else if (message.includes('fetch failed')) {\n hint = 'Network request failed. Check your internet connection and base_url.';\n }\n } else {\n // Log the full error for debugging\n console.error(chalk.gray('Full error:'), error);\n }\n\n console.error(chalk.red('\\n✖ Error:'), message);\n if (hint) {\n console.log(chalk.yellow(` Hint: ${hint}`));\n }\n console.log('');\n rl.prompt();\n }\n });\n\n rl.on('close', () => {\n console.log(\n chalk.gray(`\\nSession ended. ${messageCount} messages exchanged.\\n`)\n );\n resolve();\n });\n });\n } catch (error) {\n const message = error instanceof Error ? error.message : 'Unknown error';\n console.error(chalk.red('\\n✖ Interactive mode failed:'), message);\n process.exit(1);\n }\n });\n\n return interactive;\n}\n"],"mappings":"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","names":["chalk","chalk","Command","chalk","chalk","chalk","message","Command","chalk","chalk","Command","chalk","config","Command","chalk","ora","readline","Command","chalk","ora","Command","chalk","autoStart"]}
|