@horneross/cli 0.6.0 → 0.6.2
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 +288 -286
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
package/dist/index.js
CHANGED
|
@@ -1,113 +1,199 @@
|
|
|
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 chalk9 from "chalk";
|
|
6
|
-
import { readFileSync } from "fs";
|
|
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";
|
|
7
14
|
import { fileURLToPath } from "url";
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
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
|
+
});
|
|
13
20
|
|
|
14
21
|
// src/config/config-manager.ts
|
|
15
22
|
import { readFile, writeFile, mkdir } from "fs/promises";
|
|
16
23
|
import { homedir } from "os";
|
|
17
24
|
import { join } from "path";
|
|
18
25
|
import { parse, stringify } from "yaml";
|
|
19
|
-
var CONFIG_DIR
|
|
20
|
-
var
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
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
|
+
}
|
|
35
50
|
}
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
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
|
+
};
|
|
43
92
|
}
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
93
|
+
});
|
|
94
|
+
|
|
95
|
+
// src/utils/banner.ts
|
|
96
|
+
import chalk5 from "chalk";
|
|
97
|
+
import { readFileSync } from "fs";
|
|
98
|
+
import { fileURLToPath as fileURLToPath2 } from "url";
|
|
99
|
+
import { dirname, join as join2 } from "path";
|
|
100
|
+
function showBanner() {
|
|
101
|
+
console.log();
|
|
102
|
+
console.log(chalk5.hex("#FF8800").bold(`
|
|
103
|
+
\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
|
|
104
|
+
\u2560\u2550\u2563\u2551 \u2551\u2560\u2566\u255D\u2551\u2551\u2551\u2551\u2563 \u2560\u2566\u255D\u2551 \u2551\u255A\u2550\u2557\u255A\u2550\u2557
|
|
105
|
+
\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
|
|
106
|
+
`));
|
|
107
|
+
console.log(chalk5.gray.bold(" Terminal AI Agent Interface"));
|
|
108
|
+
console.log(chalk5.gray(` v${VERSION}`));
|
|
109
|
+
console.log(chalk5.gray(" https://horneross.com"));
|
|
110
|
+
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"));
|
|
111
|
+
console.log();
|
|
112
|
+
}
|
|
113
|
+
var __filename2, __dirname2, packageJson, VERSION;
|
|
114
|
+
var init_banner = __esm({
|
|
115
|
+
"src/utils/banner.ts"() {
|
|
116
|
+
"use strict";
|
|
117
|
+
init_esm_shims();
|
|
118
|
+
__filename2 = fileURLToPath2(import.meta.url);
|
|
119
|
+
__dirname2 = dirname(__filename2);
|
|
120
|
+
packageJson = JSON.parse(
|
|
121
|
+
readFileSync(join2(__dirname2, "../../package.json"), "utf-8")
|
|
122
|
+
);
|
|
123
|
+
VERSION = packageJson.version;
|
|
51
124
|
}
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
125
|
+
});
|
|
126
|
+
|
|
127
|
+
// src/utils/auto-start.ts
|
|
128
|
+
var auto_start_exports = {};
|
|
129
|
+
__export(auto_start_exports, {
|
|
130
|
+
autoStart: () => autoStart
|
|
131
|
+
});
|
|
132
|
+
import chalk7 from "chalk";
|
|
133
|
+
import { execSync } from "child_process";
|
|
134
|
+
async function autoStart() {
|
|
135
|
+
try {
|
|
136
|
+
const config = await ConfigManager.load();
|
|
137
|
+
if (!config.default_agent || !config.agents[config.default_agent]) {
|
|
138
|
+
showBanner();
|
|
139
|
+
console.log(chalk7.cyan("\u{1F44B} Welcome to Horneross CLI!\n"));
|
|
140
|
+
console.log(chalk7.yellow("No configuration found. Let's set up your first agent.\n"));
|
|
141
|
+
execSync("horneross config init", { stdio: "inherit" });
|
|
142
|
+
return;
|
|
61
143
|
}
|
|
62
|
-
|
|
63
|
-
}
|
|
64
|
-
|
|
144
|
+
execSync("horneross interactive", { stdio: "inherit" });
|
|
145
|
+
} catch (error) {
|
|
146
|
+
showBanner();
|
|
147
|
+
console.log(chalk7.cyan("\u{1F44B} Welcome to Horneross CLI!\n"));
|
|
148
|
+
console.log(chalk7.yellow("No configuration found. Let's set up your first agent.\n"));
|
|
65
149
|
try {
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
});
|
|
71
|
-
return response.ok;
|
|
72
|
-
} catch {
|
|
73
|
-
return false;
|
|
150
|
+
execSync("horneross config init", { stdio: "inherit" });
|
|
151
|
+
} catch (initError) {
|
|
152
|
+
console.error(chalk7.red("\n\u2716 Configuration failed"));
|
|
153
|
+
process.exit(1);
|
|
74
154
|
}
|
|
75
155
|
}
|
|
76
|
-
|
|
77
|
-
|
|
156
|
+
}
|
|
157
|
+
var init_auto_start = __esm({
|
|
158
|
+
"src/utils/auto-start.ts"() {
|
|
159
|
+
"use strict";
|
|
160
|
+
init_esm_shims();
|
|
161
|
+
init_config_manager();
|
|
162
|
+
init_banner();
|
|
78
163
|
}
|
|
79
|
-
};
|
|
164
|
+
});
|
|
165
|
+
|
|
166
|
+
// src/index.ts
|
|
167
|
+
init_esm_shims();
|
|
168
|
+
import { Command as Command4 } from "commander";
|
|
169
|
+
import chalk8 from "chalk";
|
|
170
|
+
import { readFileSync as readFileSync2 } from "fs";
|
|
171
|
+
import { fileURLToPath as fileURLToPath3 } from "url";
|
|
172
|
+
import { dirname as dirname2, join as join3 } from "path";
|
|
173
|
+
|
|
174
|
+
// src/commands/chat.ts
|
|
175
|
+
init_esm_shims();
|
|
176
|
+
init_config_manager();
|
|
177
|
+
import { Command } from "commander";
|
|
178
|
+
import chalk2 from "chalk";
|
|
80
179
|
|
|
81
180
|
// src/adapters/stream-adapter.ts
|
|
181
|
+
init_esm_shims();
|
|
82
182
|
import { createParser } from "eventsource-parser";
|
|
83
183
|
import ora from "ora";
|
|
84
|
-
import chalk2 from "chalk";
|
|
85
|
-
|
|
86
|
-
// src/utils/markdown.ts
|
|
87
184
|
import chalk from "chalk";
|
|
88
|
-
function renderMarkdown(text) {
|
|
89
|
-
let result = text;
|
|
90
|
-
result = result.replace(/\*\*([^*]+)\*\*/g, (_, content) => chalk.bold(content));
|
|
91
|
-
result = result.replace(/\*([^*]+)\*/g, (_, content) => chalk.italic(content));
|
|
92
|
-
result = result.replace(/`([^`]+)`/g, (_, content) => chalk.cyan(content));
|
|
93
|
-
return result;
|
|
94
|
-
}
|
|
95
|
-
|
|
96
|
-
// src/adapters/stream-adapter.ts
|
|
97
185
|
var StreamAdapter = class {
|
|
98
186
|
activeSpinner = null;
|
|
99
187
|
toolCallStack = /* @__PURE__ */ new Map();
|
|
100
188
|
metadata = null;
|
|
101
189
|
isThinking = false;
|
|
102
190
|
hasOutputText = false;
|
|
103
|
-
toolsExecuted = [];
|
|
104
|
-
sessionStartTime = Date.now();
|
|
105
191
|
async processStream(response) {
|
|
106
192
|
if (!response.body) {
|
|
107
193
|
throw new Error("Response body is null");
|
|
108
194
|
}
|
|
109
195
|
this.isThinking = true;
|
|
110
|
-
process.stdout.write(
|
|
196
|
+
process.stdout.write(chalk.gray("\u{1F914} Thinking...\n"));
|
|
111
197
|
const reader = response.body.getReader();
|
|
112
198
|
const decoder = new TextDecoder();
|
|
113
199
|
return new Promise((resolve, reject) => {
|
|
@@ -121,7 +207,7 @@ var StreamAdapter = class {
|
|
|
121
207
|
this.handleEvent(data);
|
|
122
208
|
} catch (error) {
|
|
123
209
|
if (event.data !== "[DONE]") {
|
|
124
|
-
console.error(
|
|
210
|
+
console.error(chalk.red("Failed to parse SSE event:"), error);
|
|
125
211
|
}
|
|
126
212
|
}
|
|
127
213
|
}
|
|
@@ -182,11 +268,9 @@ var StreamAdapter = class {
|
|
|
182
268
|
process.stdout.write("\x1B[1A\x1B[2K");
|
|
183
269
|
this.isThinking = false;
|
|
184
270
|
}
|
|
185
|
-
|
|
186
|
-
if (text) {
|
|
271
|
+
if (event.content) {
|
|
187
272
|
this.hasOutputText = true;
|
|
188
|
-
|
|
189
|
-
process.stdout.write(formatted);
|
|
273
|
+
process.stdout.write(event.content);
|
|
190
274
|
}
|
|
191
275
|
}
|
|
192
276
|
handleToolCall(event) {
|
|
@@ -209,33 +293,29 @@ var StreamAdapter = class {
|
|
|
209
293
|
const argsPreview = this.formatArgs(args);
|
|
210
294
|
const toolIcon = this.getToolIcon(toolName);
|
|
211
295
|
this.activeSpinner = ora({
|
|
212
|
-
text:
|
|
296
|
+
text: chalk.cyan(`${toolIcon} ${toolName}${argsPreview}`)
|
|
213
297
|
}).start();
|
|
214
298
|
}
|
|
215
299
|
handleToolResult(event) {
|
|
216
300
|
if (this.activeSpinner) {
|
|
217
301
|
const { toolName } = event;
|
|
218
|
-
const
|
|
219
|
-
const elapsed = this.formatDuration(elapsedMs);
|
|
302
|
+
const elapsed = this.getElapsedTime();
|
|
220
303
|
const toolIcon = this.getToolIcon(toolName);
|
|
221
|
-
if (toolName) {
|
|
222
|
-
this.toolsExecuted.push({ name: toolName, duration: elapsedMs });
|
|
223
|
-
}
|
|
224
304
|
this.activeSpinner.succeed(
|
|
225
|
-
|
|
305
|
+
chalk.green(`${toolIcon} ${toolName} ${chalk.gray(`(${elapsed})`)}`)
|
|
226
306
|
);
|
|
227
307
|
this.activeSpinner = null;
|
|
228
308
|
}
|
|
229
309
|
if (!this.isThinking) {
|
|
230
310
|
this.isThinking = true;
|
|
231
|
-
process.stdout.write(
|
|
311
|
+
process.stdout.write(chalk.gray("\u{1F914} Thinking...\n"));
|
|
232
312
|
}
|
|
233
313
|
}
|
|
234
314
|
handleToolOutput(event) {
|
|
235
315
|
if (event.data && typeof event.data === "object") {
|
|
236
316
|
const data = event.data;
|
|
237
317
|
if (this.activeSpinner && data.message) {
|
|
238
|
-
this.activeSpinner.text =
|
|
318
|
+
this.activeSpinner.text = chalk.cyan(data.message);
|
|
239
319
|
}
|
|
240
320
|
}
|
|
241
321
|
}
|
|
@@ -243,9 +323,9 @@ var StreamAdapter = class {
|
|
|
243
323
|
if (event.data && Array.isArray(event.data)) {
|
|
244
324
|
const sources = event.data;
|
|
245
325
|
if (sources.length > 0) {
|
|
246
|
-
console.log(
|
|
326
|
+
console.log(chalk.blue("\n\u{1F4DA} Consulting knowledge base:"));
|
|
247
327
|
sources.forEach((source) => {
|
|
248
|
-
console.log(
|
|
328
|
+
console.log(chalk.gray(` \u2022 ${source.datastoreName} (${source.results.length} results)`));
|
|
249
329
|
});
|
|
250
330
|
console.log("");
|
|
251
331
|
}
|
|
@@ -255,9 +335,9 @@ var StreamAdapter = class {
|
|
|
255
335
|
if (event.data && typeof event.data === "object") {
|
|
256
336
|
const data = event.data;
|
|
257
337
|
if (data.suggestions && data.suggestions.length > 0) {
|
|
258
|
-
console.log(
|
|
338
|
+
console.log(chalk.blue("\n\u{1F4A1} Suggestions:"));
|
|
259
339
|
data.suggestions.forEach((suggestion, i) => {
|
|
260
|
-
console.log(
|
|
340
|
+
console.log(chalk.gray(` ${i + 1}. ${suggestion}`));
|
|
261
341
|
});
|
|
262
342
|
}
|
|
263
343
|
}
|
|
@@ -284,7 +364,7 @@ var StreamAdapter = class {
|
|
|
284
364
|
}
|
|
285
365
|
handleError(event) {
|
|
286
366
|
this.cleanup();
|
|
287
|
-
console.error(
|
|
367
|
+
console.error(chalk.red("\n\u2716 Error:"), event.content || "Unknown error");
|
|
288
368
|
}
|
|
289
369
|
formatArgs(args) {
|
|
290
370
|
if (!args || typeof args !== "object") {
|
|
@@ -299,27 +379,15 @@ var StreamAdapter = class {
|
|
|
299
379
|
const truncated = valueStr.length > 30 ? valueStr.slice(0, 30) + "..." : valueStr;
|
|
300
380
|
return `${key}: ${truncated}`;
|
|
301
381
|
}).join(", ");
|
|
302
|
-
return ` ${
|
|
382
|
+
return ` ${chalk.gray(`(${preview})`)}`;
|
|
303
383
|
}
|
|
304
|
-
|
|
384
|
+
getElapsedTime() {
|
|
305
385
|
const lastTool = Array.from(this.toolCallStack.values()).pop();
|
|
306
386
|
if (!lastTool) {
|
|
307
|
-
return
|
|
387
|
+
return "0s";
|
|
308
388
|
}
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
formatDuration(ms) {
|
|
312
|
-
if (ms < 1e3) {
|
|
313
|
-
return `${ms}ms`;
|
|
314
|
-
}
|
|
315
|
-
return `${(ms / 1e3).toFixed(1)}s`;
|
|
316
|
-
}
|
|
317
|
-
getSessionSummary() {
|
|
318
|
-
return {
|
|
319
|
-
duration: Date.now() - this.sessionStartTime,
|
|
320
|
-
toolsUsed: this.toolsExecuted.length,
|
|
321
|
-
toolsList: this.toolsExecuted
|
|
322
|
-
};
|
|
389
|
+
const elapsed = Date.now() - lastTool.startTime;
|
|
390
|
+
return elapsed < 1e3 ? `${elapsed}ms` : `${(elapsed / 1e3).toFixed(1)}s`;
|
|
323
391
|
}
|
|
324
392
|
cleanup() {
|
|
325
393
|
if (this.activeSpinner) {
|
|
@@ -338,17 +406,17 @@ function createChatCommand() {
|
|
|
338
406
|
const config = await ConfigManager.load();
|
|
339
407
|
const agentName = options.agent || config.default_agent;
|
|
340
408
|
if (!agentName) {
|
|
341
|
-
console.error(
|
|
342
|
-
console.error(
|
|
409
|
+
console.error(chalk2.red("\n\u2716 No default agent configured"));
|
|
410
|
+
console.error(chalk2.yellow("Run: horneross config init\n"));
|
|
343
411
|
process.exit(1);
|
|
344
412
|
}
|
|
345
413
|
const agent = config.agents[agentName];
|
|
346
414
|
if (!agent) {
|
|
347
|
-
console.error(
|
|
415
|
+
console.error(chalk2.red(`
|
|
348
416
|
\u2716 Agent "${agentName}" not found`));
|
|
349
|
-
console.error(
|
|
417
|
+
console.error(chalk2.yellow("Available agents:"));
|
|
350
418
|
for (const name of Object.keys(config.agents)) {
|
|
351
|
-
console.error(
|
|
419
|
+
console.error(chalk2.gray(` - ${name}`));
|
|
352
420
|
}
|
|
353
421
|
console.error();
|
|
354
422
|
process.exit(1);
|
|
@@ -372,7 +440,7 @@ function createChatCommand() {
|
|
|
372
440
|
);
|
|
373
441
|
if (!response.ok) {
|
|
374
442
|
const errorText = await response.text();
|
|
375
|
-
console.error(
|
|
443
|
+
console.error(chalk2.red(`
|
|
376
444
|
\u2716 Request failed (${response.status}):`), errorText);
|
|
377
445
|
process.exit(1);
|
|
378
446
|
}
|
|
@@ -380,7 +448,7 @@ function createChatCommand() {
|
|
|
380
448
|
const metadata = await adapter.processStream(response);
|
|
381
449
|
if (metadata) {
|
|
382
450
|
console.log(
|
|
383
|
-
|
|
451
|
+
chalk2.gray(
|
|
384
452
|
`
|
|
385
453
|
|
|
386
454
|
Conversation ID: ${metadata.conversationId}`
|
|
@@ -390,7 +458,7 @@ Conversation ID: ${metadata.conversationId}`
|
|
|
390
458
|
console.log();
|
|
391
459
|
} catch (error) {
|
|
392
460
|
const message2 = error instanceof Error ? error.message : "Unknown error";
|
|
393
|
-
console.error(
|
|
461
|
+
console.error(chalk2.red("\n\u2716 Chat failed:"), message2);
|
|
394
462
|
process.exit(1);
|
|
395
463
|
}
|
|
396
464
|
});
|
|
@@ -398,12 +466,15 @@ Conversation ID: ${metadata.conversationId}`
|
|
|
398
466
|
}
|
|
399
467
|
|
|
400
468
|
// src/commands/config.ts
|
|
469
|
+
init_esm_shims();
|
|
470
|
+
init_config_manager();
|
|
401
471
|
import { Command as Command2 } from "commander";
|
|
402
|
-
import
|
|
472
|
+
import chalk4 from "chalk";
|
|
403
473
|
import * as readline from "readline/promises";
|
|
404
474
|
|
|
405
475
|
// src/auth/auth-manager.ts
|
|
406
|
-
|
|
476
|
+
init_esm_shims();
|
|
477
|
+
import chalk3 from "chalk";
|
|
407
478
|
var AuthManager = class {
|
|
408
479
|
static async validateConnection(agentConfig, baseUrl) {
|
|
409
480
|
try {
|
|
@@ -428,12 +499,12 @@ var AuthManager = class {
|
|
|
428
499
|
}
|
|
429
500
|
}
|
|
430
501
|
static displayAuthError(error) {
|
|
431
|
-
console.error(
|
|
432
|
-
console.error(
|
|
433
|
-
console.error(
|
|
434
|
-
console.error(
|
|
435
|
-
console.error(
|
|
436
|
-
console.error(
|
|
502
|
+
console.error(chalk3.red("\n\u2716 Authentication failed:"), error);
|
|
503
|
+
console.error(chalk3.yellow("\nTroubleshooting:"));
|
|
504
|
+
console.error(chalk3.gray(" 1. Check your API key is correct"));
|
|
505
|
+
console.error(chalk3.gray(" 2. Verify the agent ID exists"));
|
|
506
|
+
console.error(chalk3.gray(" 3. Ensure the base URL is accessible"));
|
|
507
|
+
console.error(chalk3.gray("\nRun: horneross config init"));
|
|
437
508
|
}
|
|
438
509
|
};
|
|
439
510
|
|
|
@@ -441,35 +512,35 @@ var AuthManager = class {
|
|
|
441
512
|
function createConfigCommand() {
|
|
442
513
|
const config = new Command2("config");
|
|
443
514
|
config.command("init").description("Initialize Horneross CLI configuration").action(async () => {
|
|
444
|
-
console.log(
|
|
515
|
+
console.log(chalk4.bold.cyan("\n\u{1F916} Horneross CLI Setup\n"));
|
|
445
516
|
const rl = readline.createInterface({
|
|
446
517
|
input: process.stdin,
|
|
447
518
|
output: process.stdout
|
|
448
519
|
});
|
|
449
520
|
try {
|
|
450
521
|
const agentName = await rl.question(
|
|
451
|
-
|
|
522
|
+
chalk4.yellow('Agent name (e.g., "adam"): ')
|
|
452
523
|
);
|
|
453
524
|
if (!agentName.trim()) {
|
|
454
|
-
console.error(
|
|
525
|
+
console.error(chalk4.red("\n\u2716 Agent name is required"));
|
|
455
526
|
process.exit(1);
|
|
456
527
|
}
|
|
457
528
|
const agentId = await rl.question(
|
|
458
|
-
|
|
529
|
+
chalk4.yellow("Agent ID: ")
|
|
459
530
|
);
|
|
460
531
|
if (!agentId.trim()) {
|
|
461
|
-
console.error(
|
|
532
|
+
console.error(chalk4.red("\n\u2716 Agent ID is required"));
|
|
462
533
|
process.exit(1);
|
|
463
534
|
}
|
|
464
535
|
const apiKey = await rl.question(
|
|
465
|
-
|
|
536
|
+
chalk4.yellow("API Key: ")
|
|
466
537
|
);
|
|
467
538
|
if (!apiKey.trim()) {
|
|
468
|
-
console.error(
|
|
539
|
+
console.error(chalk4.red("\n\u2716 API Key is required"));
|
|
469
540
|
process.exit(1);
|
|
470
541
|
}
|
|
471
542
|
const baseUrl = await rl.question(
|
|
472
|
-
|
|
543
|
+
chalk4.yellow("Base URL [http://localhost:3000]: ")
|
|
473
544
|
);
|
|
474
545
|
const finalBaseUrl = baseUrl.trim() || "http://localhost:3000";
|
|
475
546
|
rl.close();
|
|
@@ -478,7 +549,7 @@ function createConfigCommand() {
|
|
|
478
549
|
api_key: apiKey.trim(),
|
|
479
550
|
name: agentName.trim()
|
|
480
551
|
};
|
|
481
|
-
console.log(
|
|
552
|
+
console.log(chalk4.gray("\n\u23F3 Validating connection..."));
|
|
482
553
|
const { valid, error } = await AuthManager.validateConnection(
|
|
483
554
|
agentConfig,
|
|
484
555
|
finalBaseUrl
|
|
@@ -491,38 +562,38 @@ function createConfigCommand() {
|
|
|
491
562
|
const currentConfig = await ConfigManager.load();
|
|
492
563
|
currentConfig.base_url = finalBaseUrl;
|
|
493
564
|
await ConfigManager.save(currentConfig);
|
|
494
|
-
console.log(
|
|
495
|
-
console.log(
|
|
565
|
+
console.log(chalk4.green("\n\u2713 Configuration saved successfully!"));
|
|
566
|
+
console.log(chalk4.gray(`
|
|
496
567
|
Config file: ${ConfigManager.getConfigPath()}`));
|
|
497
|
-
console.log(
|
|
498
|
-
console.log(
|
|
568
|
+
console.log(chalk4.gray(`Default agent: ${agentName.trim()}`));
|
|
569
|
+
console.log(chalk4.cyan('\nYou can now run: horneross chat "Hello"\n'));
|
|
499
570
|
} catch (error) {
|
|
500
571
|
rl.close();
|
|
501
|
-
console.error(
|
|
572
|
+
console.error(chalk4.red("\n\u2716 Setup failed:"), error);
|
|
502
573
|
process.exit(1);
|
|
503
574
|
}
|
|
504
575
|
});
|
|
505
576
|
config.command("show").description("Show current configuration").action(async () => {
|
|
506
577
|
try {
|
|
507
578
|
const config2 = await ConfigManager.load();
|
|
508
|
-
console.log(
|
|
509
|
-
console.log(
|
|
510
|
-
console.log(
|
|
511
|
-
console.log(
|
|
579
|
+
console.log(chalk4.bold.cyan("\n\u{1F527} Current Configuration\n"));
|
|
580
|
+
console.log(chalk4.yellow("Base URL:"), config2.base_url);
|
|
581
|
+
console.log(chalk4.yellow("Default Agent:"), config2.default_agent || chalk4.gray("(not set)"));
|
|
582
|
+
console.log(chalk4.yellow("\nConfigured Agents:"));
|
|
512
583
|
if (Object.keys(config2.agents).length === 0) {
|
|
513
|
-
console.log(
|
|
584
|
+
console.log(chalk4.gray(" No agents configured"));
|
|
514
585
|
} else {
|
|
515
586
|
for (const [name, agent] of Object.entries(config2.agents)) {
|
|
516
587
|
const isDefault = name === config2.default_agent;
|
|
517
|
-
const marker = isDefault ?
|
|
518
|
-
console.log(` ${marker} ${
|
|
588
|
+
const marker = isDefault ? chalk4.green("\u2713") : " ";
|
|
589
|
+
console.log(` ${marker} ${chalk4.cyan(name)} (${agent.id})`);
|
|
519
590
|
}
|
|
520
591
|
}
|
|
521
|
-
console.log(
|
|
592
|
+
console.log(chalk4.gray(`
|
|
522
593
|
Config file: ${ConfigManager.getConfigPath()}
|
|
523
594
|
`));
|
|
524
595
|
} catch (error) {
|
|
525
|
-
console.error(
|
|
596
|
+
console.error(chalk4.red("Failed to load configuration:"), error);
|
|
526
597
|
process.exit(1);
|
|
527
598
|
}
|
|
528
599
|
});
|
|
@@ -530,60 +601,41 @@ Config file: ${ConfigManager.getConfigPath()}
|
|
|
530
601
|
}
|
|
531
602
|
|
|
532
603
|
// src/commands/interactive.ts
|
|
604
|
+
init_esm_shims();
|
|
605
|
+
init_config_manager();
|
|
533
606
|
import { Command as Command3 } from "commander";
|
|
534
|
-
import
|
|
607
|
+
import chalk6 from "chalk";
|
|
535
608
|
import ora2 from "ora";
|
|
536
609
|
import * as readline2 from "readline";
|
|
537
610
|
import { createId } from "@paralleldrive/cuid2";
|
|
538
|
-
|
|
539
|
-
|
|
540
|
-
import chalk6 from "chalk";
|
|
541
|
-
function showBanner(version) {
|
|
542
|
-
console.log();
|
|
543
|
-
console.log(chalk6.hex("#FF8800").bold(`
|
|
544
|
-
\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
|
|
545
|
-
\u2560\u2550\u2563\u2551 \u2551\u2560\u2566\u255D\u2551\u2551\u2551\u2551\u2563 \u2560\u2566\u255D\u2551 \u2551\u255A\u2550\u2557\u255A\u2550\u2557
|
|
546
|
-
\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
|
|
547
|
-
`));
|
|
548
|
-
console.log(chalk6.gray.bold(" Terminal AI Agent Interface"));
|
|
549
|
-
if (version) {
|
|
550
|
-
console.log(chalk6.gray(` v${version}`));
|
|
551
|
-
}
|
|
552
|
-
console.log(chalk6.gray(" https://horneross.com"));
|
|
553
|
-
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"));
|
|
554
|
-
console.log();
|
|
555
|
-
}
|
|
556
|
-
|
|
557
|
-
// src/commands/interactive.ts
|
|
558
|
-
function createInteractiveCommand(version) {
|
|
611
|
+
init_banner();
|
|
612
|
+
function createInteractiveCommand() {
|
|
559
613
|
const interactive = new Command3("interactive");
|
|
560
614
|
interactive.description("Start an interactive chat session").option("-a, --agent <name>", "Agent to use (defaults to configured default)").action(async (options) => {
|
|
561
615
|
try {
|
|
562
616
|
const config = await ConfigManager.load();
|
|
563
617
|
const agentName = options.agent || config.default_agent;
|
|
564
618
|
if (!agentName) {
|
|
565
|
-
console.error(
|
|
566
|
-
console.error(
|
|
619
|
+
console.error(chalk6.red("\n\u2716 No default agent configured"));
|
|
620
|
+
console.error(chalk6.yellow("Run: horneross config init\n"));
|
|
567
621
|
process.exit(1);
|
|
568
622
|
}
|
|
569
623
|
const agent = config.agents[agentName];
|
|
570
624
|
if (!agent) {
|
|
571
|
-
console.error(
|
|
625
|
+
console.error(chalk6.red(`
|
|
572
626
|
\u2716 Agent "${agentName}" not found`));
|
|
573
627
|
process.exit(1);
|
|
574
628
|
}
|
|
575
|
-
showBanner(
|
|
576
|
-
console.log(
|
|
577
|
-
console.log(
|
|
629
|
+
showBanner();
|
|
630
|
+
console.log(chalk6.bold.cyan(`\u{1F916} Chatting with ${agent.name}`));
|
|
631
|
+
console.log(chalk6.gray("Commands: /help /exit /clear /agent /config\n"));
|
|
578
632
|
const conversationId = createId();
|
|
579
633
|
let messageCount = 0;
|
|
580
|
-
let totalToolsUsed = 0;
|
|
581
|
-
const sessionStartTime = Date.now();
|
|
582
634
|
await new Promise((resolve) => {
|
|
583
635
|
const rl = readline2.createInterface({
|
|
584
636
|
input: process.stdin,
|
|
585
637
|
output: process.stdout,
|
|
586
|
-
prompt:
|
|
638
|
+
prompt: chalk6.green("> ")
|
|
587
639
|
});
|
|
588
640
|
rl.prompt();
|
|
589
641
|
rl.on("line", async (input) => {
|
|
@@ -596,47 +648,47 @@ function createInteractiveCommand(version) {
|
|
|
596
648
|
rl.close();
|
|
597
649
|
return;
|
|
598
650
|
case "help":
|
|
599
|
-
console.log(
|
|
600
|
-
console.log(
|
|
601
|
-
console.log(
|
|
602
|
-
console.log(
|
|
603
|
-
console.log(
|
|
604
|
-
console.log(
|
|
651
|
+
console.log(chalk6.cyan("\n\u{1F4DA} Available Commands:\n"));
|
|
652
|
+
console.log(chalk6.gray(" /exit Exit the chat"));
|
|
653
|
+
console.log(chalk6.gray(" /clear Clear the screen"));
|
|
654
|
+
console.log(chalk6.gray(" /config Show current configuration"));
|
|
655
|
+
console.log(chalk6.gray(" /agent <name> Switch to a different agent"));
|
|
656
|
+
console.log(chalk6.gray(" /help Show this help message\n"));
|
|
605
657
|
rl.prompt();
|
|
606
658
|
return;
|
|
607
659
|
case "clear":
|
|
608
660
|
console.clear();
|
|
609
|
-
showBanner(
|
|
610
|
-
console.log(
|
|
611
|
-
console.log(
|
|
661
|
+
showBanner();
|
|
662
|
+
console.log(chalk6.bold.cyan(`\u{1F916} Chatting with ${agent.name}`));
|
|
663
|
+
console.log(chalk6.gray("Commands: /help /exit /clear /agent /config\n"));
|
|
612
664
|
rl.prompt();
|
|
613
665
|
return;
|
|
614
666
|
case "config":
|
|
615
|
-
console.log(
|
|
616
|
-
console.log(
|
|
617
|
-
console.log(
|
|
618
|
-
console.log(
|
|
667
|
+
console.log(chalk6.cyan("\n\u2699\uFE0F Current Configuration:\n"));
|
|
668
|
+
console.log(chalk6.gray(` Agent: ${agent.name} (${agent.id})`));
|
|
669
|
+
console.log(chalk6.gray(` Base URL: ${config.base_url}`));
|
|
670
|
+
console.log(chalk6.gray(` Conversation ID: ${conversationId}
|
|
619
671
|
`));
|
|
620
672
|
rl.prompt();
|
|
621
673
|
return;
|
|
622
674
|
case "agent":
|
|
623
675
|
if (!args[0]) {
|
|
624
|
-
console.log(
|
|
625
|
-
console.log(
|
|
676
|
+
console.log(chalk6.red("\n\u2716 Please specify an agent name"));
|
|
677
|
+
console.log(chalk6.yellow("Available agents:"));
|
|
626
678
|
Object.keys(config.agents).forEach((name) => {
|
|
627
|
-
console.log(
|
|
679
|
+
console.log(chalk6.gray(` - ${name}`));
|
|
628
680
|
});
|
|
629
681
|
console.log("");
|
|
630
682
|
rl.prompt();
|
|
631
683
|
return;
|
|
632
684
|
}
|
|
633
|
-
console.log(
|
|
685
|
+
console.log(chalk6.yellow("\n\u26A0\uFE0F Agent switching not yet implemented\n"));
|
|
634
686
|
rl.prompt();
|
|
635
687
|
return;
|
|
636
688
|
default:
|
|
637
|
-
console.log(
|
|
689
|
+
console.log(chalk6.red(`
|
|
638
690
|
\u2716 Unknown command: /${command}`));
|
|
639
|
-
console.log(
|
|
691
|
+
console.log(chalk6.yellow("Type /help for available commands\n"));
|
|
640
692
|
rl.prompt();
|
|
641
693
|
return;
|
|
642
694
|
}
|
|
@@ -653,7 +705,7 @@ function createInteractiveCommand(version) {
|
|
|
653
705
|
messageCount++;
|
|
654
706
|
console.log("");
|
|
655
707
|
const startSpinner = ora2({
|
|
656
|
-
text:
|
|
708
|
+
text: chalk6.gray("Starting..."),
|
|
657
709
|
color: "gray"
|
|
658
710
|
}).start();
|
|
659
711
|
const response = await fetch(
|
|
@@ -674,30 +726,14 @@ function createInteractiveCommand(version) {
|
|
|
674
726
|
);
|
|
675
727
|
startSpinner.stop();
|
|
676
728
|
if (!response.ok) {
|
|
677
|
-
|
|
678
|
-
|
|
679
|
-
|
|
680
|
-
errorMessage = errorData.error || errorData.message || errorMessage;
|
|
681
|
-
} catch {
|
|
682
|
-
const errorText = await response.text();
|
|
683
|
-
errorMessage = errorText || errorMessage;
|
|
684
|
-
}
|
|
685
|
-
console.error(chalk7.red("\n\u2716 Error:"), errorMessage);
|
|
686
|
-
if (response.status === 401) {
|
|
687
|
-
console.log(chalk7.yellow(" Hint: Check your API key configuration"));
|
|
688
|
-
} else if (response.status === 429) {
|
|
689
|
-
console.log(chalk7.yellow(" Hint: Rate limit exceeded, please wait a moment"));
|
|
690
|
-
} else if (response.status === 500) {
|
|
691
|
-
console.log(chalk7.yellow(" Hint: Server error, please try again later"));
|
|
692
|
-
}
|
|
693
|
-
console.log("");
|
|
729
|
+
const errorText = await response.text();
|
|
730
|
+
console.error(chalk6.red(`
|
|
731
|
+
\u2716 Request failed (${response.status}):`), errorText);
|
|
694
732
|
rl.prompt();
|
|
695
733
|
return;
|
|
696
734
|
}
|
|
697
735
|
const adapter = new StreamAdapter();
|
|
698
736
|
await adapter.processStream(response);
|
|
699
|
-
const summary = adapter.getSessionSummary();
|
|
700
|
-
totalToolsUsed += summary.toolsUsed;
|
|
701
737
|
console.log("\n");
|
|
702
738
|
rl.prompt();
|
|
703
739
|
} catch (error) {
|
|
@@ -716,96 +752,62 @@ function createInteractiveCommand(version) {
|
|
|
716
752
|
} else if (message.includes("fetch failed")) {
|
|
717
753
|
hint = "Network request failed. Check your internet connection and base_url.";
|
|
718
754
|
}
|
|
755
|
+
} else {
|
|
756
|
+
console.error(chalk6.gray("Full error:"), error);
|
|
719
757
|
}
|
|
720
|
-
console.error(
|
|
758
|
+
console.error(chalk6.red("\n\u2716 Error:"), message);
|
|
721
759
|
if (hint) {
|
|
722
|
-
console.log(
|
|
760
|
+
console.log(chalk6.yellow(` Hint: ${hint}`));
|
|
723
761
|
}
|
|
724
762
|
console.log("");
|
|
725
763
|
rl.prompt();
|
|
726
764
|
}
|
|
727
765
|
});
|
|
728
766
|
rl.on("close", () => {
|
|
729
|
-
|
|
730
|
-
|
|
731
|
-
|
|
732
|
-
|
|
733
|
-
|
|
734
|
-
console.log(chalk7.bold.cyan("\n\u{1F4CA} Session Summary"));
|
|
735
|
-
console.log(chalk7.gray(` Messages: ${messageCount}`));
|
|
736
|
-
console.log(chalk7.gray(` Tools used: ${totalToolsUsed}`));
|
|
737
|
-
console.log(chalk7.gray(` Duration: ${durationMinutes}m ${durationSeconds}s`));
|
|
738
|
-
console.log(chalk7.gray(` Conversation ID: ${conversationId}`));
|
|
739
|
-
if (messageCount > 0) {
|
|
740
|
-
console.log(chalk7.blue("\n\u{1F4A1} Resume this conversation:"));
|
|
741
|
-
console.log(chalk7.yellow(` horneross --resume ${conversationId.slice(0, 8)}`));
|
|
742
|
-
}
|
|
743
|
-
console.log(chalk7.blue("\n\u2501".repeat(50)));
|
|
744
|
-
console.log(chalk7.gray("\nGoodbye! \u{1F44B}\n"));
|
|
767
|
+
console.log(
|
|
768
|
+
chalk6.gray(`
|
|
769
|
+
Session ended. ${messageCount} messages exchanged.
|
|
770
|
+
`)
|
|
771
|
+
);
|
|
745
772
|
resolve();
|
|
746
773
|
});
|
|
747
774
|
});
|
|
748
775
|
} catch (error) {
|
|
749
776
|
const message = error instanceof Error ? error.message : "Unknown error";
|
|
750
|
-
console.error(
|
|
777
|
+
console.error(chalk6.red("\n\u2716 Interactive mode failed:"), message);
|
|
751
778
|
process.exit(1);
|
|
752
779
|
}
|
|
753
780
|
});
|
|
754
781
|
return interactive;
|
|
755
782
|
}
|
|
756
783
|
|
|
757
|
-
// src/utils/auto-start.ts
|
|
758
|
-
import chalk8 from "chalk";
|
|
759
|
-
async function autoStart(version) {
|
|
760
|
-
try {
|
|
761
|
-
const config = await ConfigManager.load();
|
|
762
|
-
if (!config.default_agent || !config.agents[config.default_agent]) {
|
|
763
|
-
showBanner(version);
|
|
764
|
-
console.log(chalk8.cyan("\u{1F44B} Welcome to Horneross CLI!\n"));
|
|
765
|
-
console.log(chalk8.yellow("No configuration found. Please run:\n"));
|
|
766
|
-
console.log(chalk8.white(" horneross config init\n"));
|
|
767
|
-
process.exit(0);
|
|
768
|
-
}
|
|
769
|
-
} catch (error) {
|
|
770
|
-
showBanner(version);
|
|
771
|
-
console.log(chalk8.cyan("\u{1F44B} Welcome to Horneross CLI!\n"));
|
|
772
|
-
console.log(chalk8.yellow("No configuration found. Please run:\n"));
|
|
773
|
-
console.log(chalk8.white(" horneross config init\n"));
|
|
774
|
-
process.exit(0);
|
|
775
|
-
}
|
|
776
|
-
}
|
|
777
|
-
|
|
778
784
|
// src/index.ts
|
|
779
|
-
var
|
|
780
|
-
var
|
|
781
|
-
var
|
|
782
|
-
|
|
785
|
+
var __filename3 = fileURLToPath3(import.meta.url);
|
|
786
|
+
var __dirname3 = dirname2(__filename3);
|
|
787
|
+
var packageJson2 = JSON.parse(
|
|
788
|
+
readFileSync2(join3(__dirname3, "../package.json"), "utf-8")
|
|
783
789
|
);
|
|
784
|
-
var
|
|
790
|
+
var VERSION2 = packageJson2.version;
|
|
785
791
|
var program = new Command4();
|
|
786
|
-
program.name("horneross").description("Terminal interface for Horneross AI agents").version(
|
|
792
|
+
program.name("horneross").description("Terminal interface for Horneross AI agents").version(VERSION2);
|
|
787
793
|
program.addCommand(createChatCommand());
|
|
788
794
|
program.addCommand(createConfigCommand());
|
|
789
|
-
program.addCommand(createInteractiveCommand(
|
|
795
|
+
program.addCommand(createInteractiveCommand());
|
|
790
796
|
program.on("command:*", () => {
|
|
791
|
-
console.error(
|
|
792
|
-
console.log(
|
|
793
|
-
console.log(
|
|
794
|
-
console.log(
|
|
795
|
-
console.log(
|
|
796
|
-
console.log(
|
|
797
|
-
console.log(
|
|
797
|
+
console.error(chalk8.red("\n\u2716 Invalid command"));
|
|
798
|
+
console.log(chalk8.yellow("\nAvailable commands:"));
|
|
799
|
+
console.log(chalk8.gray(" horneross chat <message> Send a one-shot message"));
|
|
800
|
+
console.log(chalk8.gray(" horneross interactive Start interactive session"));
|
|
801
|
+
console.log(chalk8.gray(" horneross config init Initialize configuration"));
|
|
802
|
+
console.log(chalk8.gray(" horneross config show Show current configuration"));
|
|
803
|
+
console.log(chalk8.gray('\nRun "horneross --help" for more details\n'));
|
|
798
804
|
process.exit(1);
|
|
799
805
|
});
|
|
800
|
-
|
|
801
|
-
|
|
802
|
-
|
|
803
|
-
|
|
804
|
-
|
|
805
|
-
|
|
806
|
+
if (!process.argv.slice(2).length) {
|
|
807
|
+
Promise.resolve().then(() => (init_auto_start(), auto_start_exports)).then(({ autoStart: autoStart2 }) => {
|
|
808
|
+
autoStart2();
|
|
809
|
+
});
|
|
810
|
+
} else {
|
|
811
|
+
program.parse(process.argv);
|
|
806
812
|
}
|
|
807
|
-
main().catch((error) => {
|
|
808
|
-
console.error(chalk9.red("\n\u2716 Fatal error:"), error.message);
|
|
809
|
-
process.exit(1);
|
|
810
|
-
});
|
|
811
813
|
//# 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 { readFileSync } from 'fs';\nimport { fileURLToPath } from 'url';\nimport { dirname, join } from 'path';\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\n// Read version from package.json\nconst __filename = fileURLToPath(import.meta.url);\nconst __dirname = dirname(__filename);\nconst packageJson = JSON.parse(\n readFileSync(join(__dirname, '../package.json'), 'utf-8')\n);\nconst VERSION = packageJson.version;\n\nconst program = new Command();\n\nprogram\n .name('horneross')\n .description('Terminal interface for Horneross AI agents')\n .version(VERSION);\n\nprogram.addCommand(createChatCommand());\nprogram.addCommand(createConfigCommand());\nprogram.addCommand(createInteractiveCommand(VERSION));\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(VERSION);\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(version?: string): 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(version);\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(version);\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(version?: string): 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 if (version) {\n console.log(chalk.gray(` v${version}`));\n }\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(version?: string): 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(version);\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(version);\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":";;;AAAA,SAAS,WAAAA,gBAAe;AACxB,OAAOC,YAAW;AAClB,SAAS,oBAAoB;AAC7B,SAAS,qBAAqB;AAC9B,SAAS,SAAS,QAAAC,aAAY;;;ACJ9B,SAAS,eAAe;AACxB,OAAOC,YAAW;;;ACDlB,SAAS,UAAU,WAAW,aAAa;AAC3C,SAAS,eAAe;AACxB,SAAS,YAAY;AACrB,SAAS,OAAO,iBAAiB;AAGjC,IAAM,aAAa,KAAK,QAAQ,GAAG,YAAY;AAC/C,IAAM,cAAc,KAAK,YAAY,aAAa;AAElD,IAAM,iBAA4B;AAAA,EAChC,eAAe;AAAA,EACf,UAAU;AAAA,EACV,QAAQ,CAAC;AACX;AAEO,IAAM,gBAAN,MAAoB;AAAA,EACzB,aAAa,OAA2B;AACtC,QAAI;AACF,YAAM,UAAU,MAAM,SAAS,aAAa,OAAO;AACnD,YAAM,SAAS,MAAM,OAAO;AAC5B,aAAO,EAAE,GAAG,gBAAgB,GAAG,OAAO;AAAA,IACxC,SAAS,OAAO;AACd,UAAK,MAAgC,SAAS,UAAU;AACtD,eAAO;AAAA,MACT;AACA,YAAM;AAAA,IACR;AAAA,EACF;AAAA,EAEA,aAAa,KAAK,QAAkC;AAClD,UAAM,MAAM,YAAY,EAAE,WAAW,KAAK,CAAC;AAC3C,UAAM,UAAU,UAAU,MAAM;AAChC,UAAM,UAAU,aAAa,SAAS,EAAE,MAAM,IAAM,CAAC;AAAA,EACvD;AAAA,EAEA,aAAa,SACX,MACA,aACe;AACf,UAAM,SAAS,MAAM,KAAK,KAAK;AAC/B,WAAO,OAAO,IAAI,IAAI;AAEtB,QAAI,CAAC,OAAO,eAAe;AACzB,aAAO,gBAAgB;AAAA,IACzB;AAEA,UAAM,KAAK,KAAK,MAAM;AAAA,EACxB;AAAA,EAEA,aAAa,SAAS,MAAqC;AACzD,UAAM,SAAS,MAAM,KAAK,KAAK;AAC/B,UAAM,YAAY,QAAQ,OAAO;AAEjC,QAAI,CAAC,WAAW;AACd,YAAM,IAAI,MAAM,yDAAyD;AAAA,IAC3E;AAEA,UAAM,QAAQ,OAAO,OAAO,SAAS;AACrC,QAAI,CAAC,OAAO;AACV,YAAM,IAAI,MAAM,UAAU,SAAS,8BAA8B;AAAA,IACnE;AAEA,WAAO;AAAA,EACT;AAAA,EAEA,aAAa,aACX,aACA,SACkB;AAClB,QAAI;AACF,YAAM,WAAW,MAAM,MAAM,GAAG,OAAO,iBAAiB,YAAY,EAAE,WAAW;AAAA,QAC/E,SAAS;AAAA,UACP,eAAe,UAAU,YAAY,OAAO;AAAA,QAC9C;AAAA,MACF,CAAC;AAED,aAAO,SAAS;AAAA,IAClB,QAAQ;AACN,aAAO;AAAA,IACT;AAAA,EACF;AAAA,EAEA,OAAO,gBAAwB;AAC7B,WAAO;AAAA,EACT;AACF;;;ACrFA,SAAS,oBAAoB;AAC7B,OAAO,SAAuB;AAC9B,OAAOC,YAAW;;;ACFlB,OAAO,WAAW;AAMX,SAAS,eAAe,MAAsB;AACnD,MAAI,SAAS;AAGb,WAAS,OAAO,QAAQ,oBAAoB,CAAC,GAAG,YAAY,MAAM,KAAK,OAAO,CAAC;AAG/E,WAAS,OAAO,QAAQ,gBAAgB,CAAC,GAAG,YAAY,MAAM,OAAO,OAAO,CAAC;AAG7E,WAAS,OAAO,QAAQ,cAAc,CAAC,GAAG,YAAY,MAAM,KAAK,OAAO,CAAC;AAEzE,SAAO;AACT;;;ADbO,IAAM,gBAAN,MAAoB;AAAA,EACjB,gBAA4B;AAAA,EAC5B,gBACN,oBAAI,IAAI;AAAA,EACF,WAAkC;AAAA,EAClC,aAAa;AAAA,EACb,gBAAgB;AAAA,EAChB,gBAA2D,CAAC;AAAA,EAC5D,mBAAmB,KAAK,IAAI;AAAA,EAEpC,MAAM,cAAc,UAAoD;AACtE,QAAI,CAAC,SAAS,MAAM;AAClB,YAAM,IAAI,MAAM,uBAAuB;AAAA,IACzC;AAGA,SAAK,aAAa;AAClB,YAAQ,OAAO,MAAMC,OAAM,KAAK,yBAAkB,CAAC;AAEnD,UAAM,SAAS,SAAS,KAAK,UAAU;AACvC,UAAM,UAAU,IAAI,YAAY;AAEhC,WAAO,IAAI,QAAQ,CAAC,SAAS,WAAW;AACtC,YAAM,SAAS,aAAa,CAAC,UAAU;AACrC,YAAI,MAAM,SAAS,SAAS;AAE1B,cAAI,MAAM,SAAS,UAAU;AAC3B;AAAA,UACF;AAEA,cAAI;AACF,kBAAM,OAAO,KAAK,MAAM,MAAM,IAAI;AAClC,iBAAK,YAAY,IAAI;AAAA,UACvB,SAAS,OAAO;AAEd,gBAAI,MAAM,SAAS,UAAU;AAC3B,sBAAQ,MAAMA,OAAM,IAAI,4BAA4B,GAAG,KAAK;AAAA,YAC9D;AAAA,UACF;AAAA,QACF;AAAA,MACF,CAAC;AAED,YAAM,eAAe,YAA2B;AAC9C,YAAI;AACF,gBAAM,EAAE,MAAM,MAAM,IAAI,MAAM,OAAO,KAAK;AAE1C,cAAI,MAAM;AACR,iBAAK,QAAQ;AACb,oBAAQ,KAAK,QAAQ;AACrB;AAAA,UACF;AAEA,gBAAM,QAAQ,QAAQ,OAAO,OAAO,EAAE,QAAQ,KAAK,CAAC;AACpD,iBAAO,KAAK,KAAK;AAEjB,gBAAM,aAAa;AAAA,QACrB,SAAS,OAAO;AACd,eAAK,QAAQ;AACb,iBAAO,KAAK;AAAA,QACd;AAAA,MACF;AAEA,mBAAa;AAAA,IACf,CAAC;AAAA,EACH;AAAA,EAEQ,YAAY,OAAuB;AACzC,YAAQ,MAAM,MAAM;AAAA,MAClB,KAAK;AACH,aAAK,gBAAgB,KAAK;AAC1B;AAAA,MACF,KAAK;AACH,aAAK,eAAe,KAAK;AACzB;AAAA,MACF,KAAK;AACH,aAAK,iBAAiB,KAAK;AAC3B;AAAA,MACF,KAAK;AACH,aAAK,eAAe,KAAK;AACzB;AAAA,MACF,KAAK;AACH,aAAK,cAAc,KAAK;AACxB;AAAA,MACF,KAAK;AACH,aAAK,kBAAkB,KAAK;AAC5B;AAAA,MACF,KAAK;AACH,aAAK,iBAAiB,KAAK;AAC3B;AAAA,MACF,KAAK;AACH,aAAK,YAAY,KAAK;AACtB;AAAA,IACJ;AAAA,EACF;AAAA,EAEQ,gBAAgB,OAAuB;AAE7C,QAAI,KAAK,eAAe;AACtB,WAAK,cAAc,KAAK;AACxB,WAAK,gBAAgB;AAAA,IACvB;AAGA,QAAI,KAAK,cAAc,CAAC,KAAK,eAAe;AAE1C,cAAQ,OAAO,MAAM,gBAAgB;AACrC,WAAK,aAAa;AAAA,IACpB;AAEA,UAAM,OAAO,MAAM,SAAS,MAAM;AAClC,QAAI,MAAM;AACR,WAAK,gBAAgB;AAErB,YAAM,YAAY,eAAe,IAAI;AACrC,cAAQ,OAAO,MAAM,SAAS;AAAA,IAChC;AAAA,EACF;AAAA,EAEQ,eAAe,OAAuB;AAC5C,UAAM,EAAE,UAAU,KAAK,IAAI;AAC3B,UAAM,aAAa,GAAG,QAAQ,IAAI,KAAK,IAAI,CAAC;AAE5C,SAAK,cAAc,IAAI,YAAY;AAAA,MACjC,MAAM,YAAY;AAAA,MAClB,WAAW,KAAK,IAAI;AAAA,IACtB,CAAC;AAGD,QAAI,KAAK,eAAe;AACtB,WAAK,cAAc,KAAK;AAAA,IAC1B;AAGA,QAAI,KAAK,YAAY;AACnB,cAAQ,OAAO,MAAM,gBAAgB;AACrC,WAAK,aAAa;AAAA,IACpB;AAGA,QAAI,KAAK,eAAe;AACtB,cAAQ,OAAO,MAAM,IAAI;AAAA,IAC3B;AAEA,UAAM,cAAc,KAAK,WAAW,IAAI;AACxC,UAAM,WAAW,KAAK,YAAY,QAAQ;AAC1C,SAAK,gBAAgB,IAAI;AAAA,MACvB,MAAMA,OAAM,KAAK,GAAG,QAAQ,IAAI,QAAQ,GAAG,WAAW,EAAE;AAAA,IAC1D,CAAC,EAAE,MAAM;AAAA,EACX;AAAA,EAEQ,iBAAiB,OAAuB;AAC9C,QAAI,KAAK,eAAe;AACtB,YAAM,EAAE,SAAS,IAAI;AACrB,YAAM,YAAY,KAAK,iBAAiB;AACxC,YAAM,UAAU,KAAK,eAAe,SAAS;AAC7C,YAAM,WAAW,KAAK,YAAY,QAAQ;AAG1C,UAAI,UAAU;AACZ,aAAK,cAAc,KAAK,EAAE,MAAM,UAAU,UAAU,UAAU,CAAC;AAAA,MACjE;AAEA,WAAK,cAAc;AAAA,QACjBA,OAAM,MAAM,GAAG,QAAQ,IAAI,QAAQ,IAAIA,OAAM,KAAK,IAAI,OAAO,GAAG,CAAC,EAAE;AAAA,MACrE;AACA,WAAK,gBAAgB;AAAA,IACvB;AAGA,QAAI,CAAC,KAAK,YAAY;AACpB,WAAK,aAAa;AAClB,cAAQ,OAAO,MAAMA,OAAM,KAAK,yBAAkB,CAAC;AAAA,IACrD;AAAA,EACF;AAAA,EAEQ,iBAAiB,OAAuB;AAE9C,QAAI,MAAM,QAAQ,OAAO,MAAM,SAAS,UAAU;AAChD,YAAM,OAAO,MAAM;AACnB,UAAI,KAAK,iBAAiB,KAAK,SAAS;AACtC,aAAK,cAAc,OAAOA,OAAM,KAAK,KAAK,OAAO;AAAA,MACnD;AAAA,IACF;AAAA,EACF;AAAA,EAEQ,cAAc,OAAuB;AAC3C,QAAI,MAAM,QAAQ,MAAM,QAAQ,MAAM,IAAI,GAAG;AAC3C,YAAM,UAAU,MAAM;AACtB,UAAI,QAAQ,SAAS,GAAG;AACtB,gBAAQ,IAAIA,OAAM,KAAK,wCAAiC,CAAC;AACzD,gBAAQ,QAAQ,CAAC,WAAW;AAC1B,kBAAQ,IAAIA,OAAM,KAAK,YAAO,OAAO,aAAa,KAAK,OAAO,QAAQ,MAAM,WAAW,CAAC;AAAA,QAC1F,CAAC;AACD,gBAAQ,IAAI,EAAE;AAAA,MAChB;AAAA,IACF;AAAA,EACF;AAAA,EAEQ,kBAAkB,OAAuB;AAC/C,QAAI,MAAM,QAAQ,OAAO,MAAM,SAAS,UAAU;AAChD,YAAM,OAAO,MAAM;AACnB,UAAI,KAAK,eAAe,KAAK,YAAY,SAAS,GAAG;AACnD,gBAAQ,IAAIA,OAAM,KAAK,0BAAmB,CAAC;AAC3C,aAAK,YAAY,QAAQ,CAAC,YAAY,MAAM;AAC1C,kBAAQ,IAAIA,OAAM,KAAK,KAAK,IAAI,CAAC,KAAK,UAAU,EAAE,CAAC;AAAA,QACrD,CAAC;AAAA,MACH;AAAA,IACF;AAAA,EACF;AAAA,EAEQ,YAAY,UAA2B;AAC7C,UAAM,QAAgC;AAAA,MACpC,YAAY;AAAA,MACZ,SAAS;AAAA,MACT,eAAe;AAAA,MACf,YAAY;AAAA,MACZ,eAAe;AAAA,MACf,oBAAoB;AAAA,MACpB,mBAAmB;AAAA,MACnB,MAAM;AAAA,MACN,OAAO;AAAA,MACP,SAAS;AAAA,IACX;AACA,WAAO,MAAM,YAAY,EAAE,KAAK;AAAA,EAClC;AAAA,EAEQ,eAAe,OAAuB;AAC5C,QAAI,MAAM,QAAQ,OAAO,MAAM,SAAS,YAAY,oBAAoB,MAAM,MAAM;AAClF,WAAK,WAAW,MAAM;AAAA,IACxB;AAAA,EACF;AAAA,EAEQ,YAAY,OAAuB;AACzC,SAAK,QAAQ;AACb,YAAQ,MAAMA,OAAM,IAAI,iBAAY,GAAG,MAAM,WAAW,eAAe;AAAA,EACzE;AAAA,EAEQ,WAAW,MAAuB;AACxC,QAAI,CAAC,QAAQ,OAAO,SAAS,UAAU;AACrC,aAAO;AAAA,IACT;AAEA,UAAM,UAAU,OAAO,QAAQ,IAA+B;AAC9D,QAAI,QAAQ,WAAW,GAAG;AACxB,aAAO;AAAA,IACT;AAEA,UAAM,UAAU,QACb,MAAM,GAAG,CAAC,EACV,IAAI,CAAC,CAAC,KAAK,KAAK,MAAM;AACrB,YAAM,WAAW,OAAO,UAAU,WAAW,QAAQ,KAAK,UAAU,KAAK;AACzE,YAAM,YAAY,SAAS,SAAS,KAAK,SAAS,MAAM,GAAG,EAAE,IAAI,QAAQ;AACzE,aAAO,GAAG,GAAG,KAAK,SAAS;AAAA,IAC7B,CAAC,EACA,KAAK,IAAI;AAEZ,WAAO,IAAIA,OAAM,KAAK,IAAI,OAAO,GAAG,CAAC;AAAA,EACvC;AAAA,EAEQ,mBAA2B;AACjC,UAAM,WAAW,MAAM,KAAK,KAAK,cAAc,OAAO,CAAC,EAAE,IAAI;AAC7D,QAAI,CAAC,UAAU;AACb,aAAO;AAAA,IACT;AACA,WAAO,KAAK,IAAI,IAAI,SAAS;AAAA,EAC/B;AAAA,EAEQ,eAAe,IAAoB;AACzC,QAAI,KAAK,KAAM;AACb,aAAO,GAAG,EAAE;AAAA,IACd;AACA,WAAO,IAAI,KAAK,KAAM,QAAQ,CAAC,CAAC;AAAA,EAClC;AAAA,EAEA,oBAIE;AACA,WAAO;AAAA,MACL,UAAU,KAAK,IAAI,IAAI,KAAK;AAAA,MAC5B,WAAW,KAAK,cAAc;AAAA,MAC9B,WAAW,KAAK;AAAA,IAClB;AAAA,EACF;AAAA,EAEQ,UAAgB;AACtB,QAAI,KAAK,eAAe;AACtB,WAAK,cAAc,KAAK;AACxB,WAAK,gBAAgB;AAAA,IACvB;AACA,SAAK,cAAc,MAAM;AAAA,EAC3B;AACF;;;AFrSO,SAAS,oBAA6B;AAC3C,QAAM,OAAO,IAAI,QAAQ,MAAM;AAE/B,OACG,YAAY,uCAAuC,EACnD,SAAS,aAAa,8BAA8B,EACpD,OAAO,sBAAsB,+CAA+C,EAC5E,OAAO,0BAA0B,mCAAmC,EACpE,OAAO,OAAO,SAAiB,YAAyB;AACvD,QAAI;AACF,YAAM,SAAS,MAAM,cAAc,KAAK;AACxC,YAAM,YAAY,QAAQ,SAAS,OAAO;AAE1C,UAAI,CAAC,WAAW;AACd,gBAAQ,MAAMC,OAAM,IAAI,sCAAiC,CAAC;AAC1D,gBAAQ,MAAMA,OAAM,OAAO,8BAA8B,CAAC;AAC1D,gBAAQ,KAAK,CAAC;AAAA,MAChB;AAEA,YAAM,QAAQ,OAAO,OAAO,SAAS;AACrC,UAAI,CAAC,OAAO;AACV,gBAAQ,MAAMA,OAAM,IAAI;AAAA,gBAAc,SAAS,aAAa,CAAC;AAC7D,gBAAQ,MAAMA,OAAM,OAAO,mBAAmB,CAAC;AAC/C,mBAAW,QAAQ,OAAO,KAAK,OAAO,MAAM,GAAG;AAC7C,kBAAQ,MAAMA,OAAM,KAAK,OAAO,IAAI,EAAE,CAAC;AAAA,QACzC;AACA,gBAAQ,MAAM;AACd,gBAAQ,KAAK,CAAC;AAAA,MAChB;AAEA,YAAM,cAAc;AAAA,QAClB,OAAO;AAAA,QACP,WAAW;AAAA,QACX,eAAe;AAAA,QACf,GAAI,QAAQ,kBAAkB,EAAE,gBAAgB,QAAQ,eAAe;AAAA,MACzE;AAEA,YAAM,WAAW,MAAM;AAAA,QACrB,GAAG,OAAO,QAAQ,iBAAiB,MAAM,EAAE;AAAA,QAC3C;AAAA,UACE,QAAQ;AAAA,UACR,SAAS;AAAA,YACP,gBAAgB;AAAA,YAChB,eAAe,UAAU,MAAM,OAAO;AAAA,UACxC;AAAA,UACA,MAAM,KAAK,UAAU,WAAW;AAAA,QAClC;AAAA,MACF;AAEA,UAAI,CAAC,SAAS,IAAI;AAChB,cAAM,YAAY,MAAM,SAAS,KAAK;AACtC,gBAAQ,MAAMA,OAAM,IAAI;AAAA,yBAAuB,SAAS,MAAM,IAAI,GAAG,SAAS;AAC9E,gBAAQ,KAAK,CAAC;AAAA,MAChB;AAEA,YAAM,UAAU,IAAI,cAAc;AAClC,YAAM,WAAW,MAAM,QAAQ,cAAc,QAAQ;AAErD,UAAI,UAAU;AACZ,gBAAQ;AAAA,UACNA,OAAM;AAAA,YACJ;AAAA;AAAA,mBAAwB,SAAS,cAAc;AAAA,UACjD;AAAA,QACF;AAAA,MACF;AAEA,cAAQ,IAAI;AAAA,IACd,SAAS,OAAO;AACd,YAAMC,WAAU,iBAAiB,QAAQ,MAAM,UAAU;AACzD,cAAQ,MAAMD,OAAM,IAAI,uBAAkB,GAAGC,QAAO;AACpD,cAAQ,KAAK,CAAC;AAAA,IAChB;AAAA,EACF,CAAC;AAEH,SAAO;AACT;;;AIjFA,SAAS,WAAAC,gBAAe;AACxB,OAAOC,YAAW;AAClB,YAAY,cAAc;;;ACF1B,OAAOC,YAAW;AAGX,IAAM,cAAN,MAAkB;AAAA,EACvB,aAAa,mBACX,aACA,SAC6C;AAC7C,QAAI;AACF,YAAM,WAAW,MAAM,MAAM,GAAG,OAAO,iBAAiB,YAAY,EAAE,WAAW;AAAA,QAC/E,SAAS;AAAA,UACP,eAAe,UAAU,YAAY,OAAO;AAAA,QAC9C;AAAA,MACF,CAAC;AAED,UAAI,SAAS,IAAI;AACf,eAAO,EAAE,OAAO,KAAK;AAAA,MACvB;AAEA,UAAI,SAAS,WAAW,KAAK;AAC3B,eAAO,EAAE,OAAO,OAAO,OAAO,kBAAkB;AAAA,MAClD;AAEA,UAAI,SAAS,WAAW,KAAK;AAC3B,eAAO,EAAE,OAAO,OAAO,OAAO,kBAAkB;AAAA,MAClD;AAEA,aAAO,EAAE,OAAO,OAAO,OAAO,QAAQ,SAAS,MAAM,KAAK,SAAS,UAAU,GAAG;AAAA,IAClF,SAAS,OAAO;AACd,YAAM,UAAU,iBAAiB,QAAQ,MAAM,UAAU;AACzD,aAAO,EAAE,OAAO,OAAO,OAAO,sBAAsB,OAAO,GAAG;AAAA,IAChE;AAAA,EACF;AAAA,EAEA,OAAO,iBAAiB,OAAqB;AAC3C,YAAQ,MAAMA,OAAM,IAAI,iCAA4B,GAAG,KAAK;AAC5D,YAAQ,MAAMA,OAAM,OAAO,oBAAoB,CAAC;AAChD,YAAQ,MAAMA,OAAM,KAAK,oCAAoC,CAAC;AAC9D,YAAQ,MAAMA,OAAM,KAAK,iCAAiC,CAAC;AAC3D,YAAQ,MAAMA,OAAM,KAAK,wCAAwC,CAAC;AAClE,YAAQ,MAAMA,OAAM,KAAK,8BAA8B,CAAC;AAAA,EAC1D;AACF;;;ADpCO,SAAS,sBAA+B;AAC7C,QAAM,SAAS,IAAIC,SAAQ,QAAQ;AAEnC,SACG,QAAQ,MAAM,EACd,YAAY,wCAAwC,EACpD,OAAO,YAAY;AAClB,YAAQ,IAAIC,OAAM,KAAK,KAAK,mCAA4B,CAAC;AAEzD,UAAM,KAAc,yBAAgB;AAAA,MAClC,OAAO,QAAQ;AAAA,MACf,QAAQ,QAAQ;AAAA,IAClB,CAAC;AAED,QAAI;AACF,YAAM,YAAY,MAAM,GAAG;AAAA,QACzBA,OAAM,OAAO,6BAA6B;AAAA,MAC5C;AAEA,UAAI,CAAC,UAAU,KAAK,GAAG;AACrB,gBAAQ,MAAMA,OAAM,IAAI,iCAA4B,CAAC;AACrD,gBAAQ,KAAK,CAAC;AAAA,MAChB;AAEA,YAAM,UAAU,MAAM,GAAG;AAAA,QACvBA,OAAM,OAAO,YAAY;AAAA,MAC3B;AAEA,UAAI,CAAC,QAAQ,KAAK,GAAG;AACnB,gBAAQ,MAAMA,OAAM,IAAI,+BAA0B,CAAC;AACnD,gBAAQ,KAAK,CAAC;AAAA,MAChB;AAEA,YAAM,SAAS,MAAM,GAAG;AAAA,QACtBA,OAAM,OAAO,WAAW;AAAA,MAC1B;AAEA,UAAI,CAAC,OAAO,KAAK,GAAG;AAClB,gBAAQ,MAAMA,OAAM,IAAI,8BAAyB,CAAC;AAClD,gBAAQ,KAAK,CAAC;AAAA,MAChB;AAEA,YAAM,UAAU,MAAM,GAAG;AAAA,QACvBA,OAAM,OAAO,oCAAoC;AAAA,MACnD;AAEA,YAAM,eAAe,QAAQ,KAAK,KAAK;AAEvC,SAAG,MAAM;AAET,YAAM,cAAc;AAAA,QAClB,IAAI,QAAQ,KAAK;AAAA,QACjB,SAAS,OAAO,KAAK;AAAA,QACrB,MAAM,UAAU,KAAK;AAAA,MACvB;AAEA,cAAQ,IAAIA,OAAM,KAAK,mCAA8B,CAAC;AAEtD,YAAM,EAAE,OAAO,MAAM,IAAI,MAAM,YAAY;AAAA,QACzC;AAAA,QACA;AAAA,MACF;AAEA,UAAI,CAAC,OAAO;AACV,oBAAY,iBAAiB,SAAS,eAAe;AACrD,gBAAQ,KAAK,CAAC;AAAA,MAChB;AAEA,YAAM,cAAc,SAAS,UAAU,KAAK,GAAG,WAAW;AAE1D,YAAM,gBAAgB,MAAM,cAAc,KAAK;AAC/C,oBAAc,WAAW;AACzB,YAAM,cAAc,KAAK,aAAa;AAEtC,cAAQ,IAAIA,OAAM,MAAM,4CAAuC,CAAC;AAChE,cAAQ,IAAIA,OAAM,KAAK;AAAA,eAAkB,cAAc,cAAc,CAAC,EAAE,CAAC;AACzE,cAAQ,IAAIA,OAAM,KAAK,kBAAkB,UAAU,KAAK,CAAC,EAAE,CAAC;AAC5D,cAAQ,IAAIA,OAAM,KAAK,6CAA6C,CAAC;AAAA,IACvE,SAAS,OAAO;AACd,SAAG,MAAM;AACT,cAAQ,MAAMA,OAAM,IAAI,wBAAmB,GAAG,KAAK;AACnD,cAAQ,KAAK,CAAC;AAAA,IAChB;AAAA,EACF,CAAC;AAEH,SACG,QAAQ,MAAM,EACd,YAAY,4BAA4B,EACxC,OAAO,YAAY;AAClB,QAAI;AACF,YAAMC,UAAS,MAAM,cAAc,KAAK;AAExC,cAAQ,IAAID,OAAM,KAAK,KAAK,qCAA8B,CAAC;AAC3D,cAAQ,IAAIA,OAAM,OAAO,WAAW,GAAGC,QAAO,QAAQ;AACtD,cAAQ,IAAID,OAAM,OAAO,gBAAgB,GAAGC,QAAO,iBAAiBD,OAAM,KAAK,WAAW,CAAC;AAC3F,cAAQ,IAAIA,OAAM,OAAO,sBAAsB,CAAC;AAEhD,UAAI,OAAO,KAAKC,QAAO,MAAM,EAAE,WAAW,GAAG;AAC3C,gBAAQ,IAAID,OAAM,KAAK,wBAAwB,CAAC;AAAA,MAClD,OAAO;AACL,mBAAW,CAAC,MAAM,KAAK,KAAK,OAAO,QAAQC,QAAO,MAAM,GAAG;AACzD,gBAAM,YAAY,SAASA,QAAO;AAClC,gBAAM,SAAS,YAAYD,OAAM,MAAM,QAAG,IAAI;AAC9C,kBAAQ,IAAI,KAAK,MAAM,IAAIA,OAAM,KAAK,IAAI,CAAC,KAAK,MAAM,EAAE,GAAG;AAAA,QAC7D;AAAA,MACF;AAEA,cAAQ,IAAIA,OAAM,KAAK;AAAA,eAAkB,cAAc,cAAc,CAAC;AAAA,CAAI,CAAC;AAAA,IAC7E,SAAS,OAAO;AACd,cAAQ,MAAMA,OAAM,IAAI,+BAA+B,GAAG,KAAK;AAC/D,cAAQ,KAAK,CAAC;AAAA,IAChB;AAAA,EACF,CAAC;AAEH,SAAO;AACT;;;AEzHA,SAAS,WAAAE,gBAAe;AACxB,OAAOC,YAAW;AAClB,OAAOC,UAAS;AAChB,YAAYC,eAAc;AAC1B,SAAS,gBAAgB;;;ACJzB,OAAOC,YAAW;AAEX,SAAS,WAAW,SAAwB;AACjD,UAAQ,IAAI;AACZ,UAAQ,IAAIA,OAAM,IAAI,SAAS,EAAE,KAAK;AAAA;AAAA;AAAA;AAAA,CAIvC,CAAC;AACA,UAAQ,IAAIA,OAAM,KAAK,KAAK,gCAAgC,CAAC;AAC7D,MAAI,SAAS;AACX,YAAQ,IAAIA,OAAM,KAAK,OAAO,OAAO,EAAE,CAAC;AAAA,EAC1C;AACA,UAAQ,IAAIA,OAAM,KAAK,0BAA0B,CAAC;AAClD,UAAQ,IAAIA,OAAM,KAAK,mLAAkC,CAAC;AAC1D,UAAQ,IAAI;AACd;;;ADPO,SAAS,yBAAyB,SAA2B;AAClE,QAAM,cAAc,IAAIC,SAAQ,aAAa;AAE7C,cACG,YAAY,mCAAmC,EAC/C,OAAO,sBAAsB,+CAA+C,EAC5E,OAAO,OAAO,YAAgC;AAC7C,QAAI;AACF,YAAM,SAAS,MAAM,cAAc,KAAK;AACxC,YAAM,YAAY,QAAQ,SAAS,OAAO;AAE1C,UAAI,CAAC,WAAW;AACd,gBAAQ,MAAMC,OAAM,IAAI,sCAAiC,CAAC;AAC1D,gBAAQ,MAAMA,OAAM,OAAO,8BAA8B,CAAC;AAC1D,gBAAQ,KAAK,CAAC;AAAA,MAChB;AAEA,YAAM,QAAQ,OAAO,OAAO,SAAS;AACrC,UAAI,CAAC,OAAO;AACV,gBAAQ,MAAMA,OAAM,IAAI;AAAA,gBAAc,SAAS,aAAa,CAAC;AAC7D,gBAAQ,KAAK,CAAC;AAAA,MAChB;AAGA,iBAAW,OAAO;AAElB,cAAQ,IAAIA,OAAM,KAAK,KAAK,2BAAoB,MAAM,IAAI,EAAE,CAAC;AAC7D,cAAQ,IAAIA,OAAM,KAAK,+CAA+C,CAAC;AAEvE,YAAM,iBAAiB,SAAS;AAChC,UAAI,eAAe;AACnB,UAAI,iBAAiB;AACrB,YAAM,mBAAmB,KAAK,IAAI;AAGlC,YAAM,IAAI,QAAc,CAAC,YAAY;AACnC,cAAM,KAAc,0BAAgB;AAAA,UAClC,OAAO,QAAQ;AAAA,UACf,QAAQ,QAAQ;AAAA,UAChB,QAAQA,OAAM,MAAM,IAAI;AAAA,QAC1B,CAAC;AAED,WAAG,OAAO;AAEV,WAAG,GAAG,QAAQ,OAAO,UAAU;AAC/B,gBAAM,UAAU,MAAM,KAAK;AAG3B,cAAI,QAAQ,WAAW,GAAG,GAAG;AAC3B,kBAAM,CAAC,SAAS,GAAG,IAAI,IAAI,QAAQ,MAAM,CAAC,EAAE,MAAM,GAAG;AAErD,oBAAQ,QAAQ,YAAY,GAAG;AAAA,cAC7B,KAAK;AAAA,cACL,KAAK;AACH,mBAAG,MAAM;AACT;AAAA,cAEF,KAAK;AACH,wBAAQ,IAAIA,OAAM,KAAK,mCAA4B,CAAC;AACpD,wBAAQ,IAAIA,OAAM,KAAK,oCAAoC,CAAC;AAC5D,wBAAQ,IAAIA,OAAM,KAAK,uCAAuC,CAAC;AAC/D,wBAAQ,IAAIA,OAAM,KAAK,iDAAiD,CAAC;AACzE,wBAAQ,IAAIA,OAAM,KAAK,kDAAkD,CAAC;AAC1E,wBAAQ,IAAIA,OAAM,KAAK,+CAA+C,CAAC;AACvE,mBAAG,OAAO;AACV;AAAA,cAEF,KAAK;AACH,wBAAQ,MAAM;AACd,2BAAW,OAAO;AAClB,wBAAQ,IAAIA,OAAM,KAAK,KAAK,2BAAoB,MAAM,IAAI,EAAE,CAAC;AAC7D,wBAAQ,IAAIA,OAAM,KAAK,+CAA+C,CAAC;AACvE,mBAAG,OAAO;AACV;AAAA,cAEF,KAAK;AACH,wBAAQ,IAAIA,OAAM,KAAK,0CAAgC,CAAC;AACxD,wBAAQ,IAAIA,OAAM,KAAK,YAAY,MAAM,IAAI,KAAK,MAAM,EAAE,GAAG,CAAC;AAC9D,wBAAQ,IAAIA,OAAM,KAAK,eAAe,OAAO,QAAQ,EAAE,CAAC;AACxD,wBAAQ,IAAIA,OAAM,KAAK,sBAAsB,cAAc;AAAA,CAAI,CAAC;AAChE,mBAAG,OAAO;AACV;AAAA,cAEF,KAAK;AACH,oBAAI,CAAC,KAAK,CAAC,GAAG;AACZ,0BAAQ,IAAIA,OAAM,IAAI,uCAAkC,CAAC;AACzD,0BAAQ,IAAIA,OAAM,OAAO,mBAAmB,CAAC;AAC7C,yBAAO,KAAK,OAAO,MAAM,EAAE,QAAQ,UAAQ;AACzC,4BAAQ,IAAIA,OAAM,KAAK,OAAO,IAAI,EAAE,CAAC;AAAA,kBACvC,CAAC;AACD,0BAAQ,IAAI,EAAE;AACd,qBAAG,OAAO;AACV;AAAA,gBACF;AAEA,wBAAQ,IAAIA,OAAM,OAAO,uDAA6C,CAAC;AACvE,mBAAG,OAAO;AACV;AAAA,cAEF;AACE,wBAAQ,IAAIA,OAAM,IAAI;AAAA,2BAAyB,OAAO,EAAE,CAAC;AACzD,wBAAQ,IAAIA,OAAM,OAAO,qCAAqC,CAAC;AAC/D,mBAAG,OAAO;AACV;AAAA,YACJ;AAAA,UACF;AAGA,cAAI,YAAY,UAAU,YAAY,QAAQ;AAC5C,eAAG,MAAM;AACT;AAAA,UACF;AAEA,cAAI,CAAC,SAAS;AACZ,eAAG,OAAO;AACV;AAAA,UACF;AAEA,cAAI;AACF;AAGA,oBAAQ,IAAI,EAAE;AACd,kBAAM,eAAeC,KAAI;AAAA,cACvB,MAAMD,OAAM,KAAK,aAAa;AAAA,cAC9B,OAAO;AAAA,YACT,CAAC,EAAE,MAAM;AAET,kBAAM,WAAW,MAAM;AAAA,cACrB,GAAG,OAAO,QAAQ,iBAAiB,MAAM,EAAE;AAAA,cAC3C;AAAA,gBACE,QAAQ;AAAA,gBACR,SAAS;AAAA,kBACP,gBAAgB;AAAA,kBAChB,eAAe,UAAU,MAAM,OAAO;AAAA,gBACxC;AAAA,gBACA,MAAM,KAAK,UAAU;AAAA,kBACnB,OAAO;AAAA,kBACP,WAAW;AAAA,kBACX,eAAe;AAAA,kBACf;AAAA,gBACF,CAAC;AAAA,cACH;AAAA,YACF;AAGA,yBAAa,KAAK;AAElB,gBAAI,CAAC,SAAS,IAAI;AAChB,kBAAI,eAAe,mBAAmB,SAAS,MAAM;AACrD,kBAAI;AACF,sBAAM,YAAY,MAAM,SAAS,KAAK;AACtC,+BAAe,UAAU,SAAS,UAAU,WAAW;AAAA,cACzD,QAAQ;AACN,sBAAM,YAAY,MAAM,SAAS,KAAK;AACtC,+BAAe,aAAa;AAAA,cAC9B;AAEA,sBAAQ,MAAMA,OAAM,IAAI,iBAAY,GAAG,YAAY;AAGnD,kBAAI,SAAS,WAAW,KAAK;AAC3B,wBAAQ,IAAIA,OAAM,OAAO,0CAA0C,CAAC;AAAA,cACtE,WAAW,SAAS,WAAW,KAAK;AAClC,wBAAQ,IAAIA,OAAM,OAAO,mDAAmD,CAAC;AAAA,cAC/E,WAAW,SAAS,WAAW,KAAK;AAClC,wBAAQ,IAAIA,OAAM,OAAO,8CAA8C,CAAC;AAAA,cAC1E;AAEA,sBAAQ,IAAI,EAAE;AACd,iBAAG,OAAO;AACV;AAAA,YACF;AAEA,kBAAM,UAAU,IAAI,cAAc;AAClC,kBAAM,QAAQ,cAAc,QAAQ;AAGpC,kBAAM,UAAU,QAAQ,kBAAkB;AAC1C,8BAAkB,QAAQ;AAE1B,oBAAQ,IAAI,IAAI;AAChB,eAAG,OAAO;AAAA,UACZ,SAAS,OAAO;AACd,gBAAI,UAAU;AACd,gBAAI,OAAO;AAEX,gBAAI,iBAAiB,OAAO;AAC1B,wBAAU,MAAM;AAGhB,kBAAI,QAAQ,SAAS,cAAc,GAAG;AACpC,uBAAO;AAAA,cACT,WAAW,QAAQ,SAAS,WAAW,GAAG;AACxC,uBAAO;AAAA,cACT,WAAW,QAAQ,SAAS,WAAW,GAAG;AACxC,uBAAO;AAAA,cACT,WAAW,QAAQ,SAAS,aAAa,KAAK,QAAQ,SAAS,KAAK,GAAG;AACrE,uBAAO;AAAA,cACT,WAAW,QAAQ,SAAS,cAAc,GAAG;AAC3C,uBAAO;AAAA,cACT;AAAA,YACF;AAEA,oBAAQ,MAAMA,OAAM,IAAI,iBAAY,GAAG,OAAO;AAC9C,gBAAI,MAAM;AACR,sBAAQ,IAAIA,OAAM,OAAO,WAAW,IAAI,EAAE,CAAC;AAAA,YAC7C;AACA,oBAAQ,IAAI,EAAE;AACd,eAAG,OAAO;AAAA,UACZ;AAAA,QACF,CAAC;AAEC,WAAG,GAAG,SAAS,MAAM;AACnB,gBAAM,kBAAkB,KAAK,IAAI,IAAI;AACrC,gBAAM,kBAAkB,KAAK,MAAM,kBAAkB,GAAK;AAC1D,gBAAM,kBAAkB,KAAK,MAAO,kBAAkB,MAAS,GAAI;AAEnE,kBAAQ,IAAI,EAAE;AACd,kBAAQ,IAAIA,OAAM,KAAK,SAAI,OAAO,EAAE,CAAC,CAAC;AACtC,kBAAQ,IAAIA,OAAM,KAAK,KAAK,6BAAsB,CAAC;AACnD,kBAAQ,IAAIA,OAAM,KAAK,eAAe,YAAY,EAAE,CAAC;AACrD,kBAAQ,IAAIA,OAAM,KAAK,iBAAiB,cAAc,EAAE,CAAC;AACzD,kBAAQ,IAAIA,OAAM,KAAK,eAAe,eAAe,KAAK,eAAe,GAAG,CAAC;AAC7E,kBAAQ,IAAIA,OAAM,KAAK,sBAAsB,cAAc,EAAE,CAAC;AAE9D,cAAI,eAAe,GAAG;AACpB,oBAAQ,IAAIA,OAAM,KAAK,uCAAgC,CAAC;AACxD,oBAAQ,IAAIA,OAAM,OAAO,wBAAwB,eAAe,MAAM,GAAG,CAAC,CAAC,EAAE,CAAC;AAAA,UAChF;AAEA,kBAAQ,IAAIA,OAAM,KAAK,WAAM,OAAO,EAAE,CAAC,CAAC;AACxC,kBAAQ,IAAIA,OAAM,KAAK,wBAAiB,CAAC;AAGzC,kBAAQ;AAAA,QACV,CAAC;AAAA,MACH,CAAC;AAAA,IACH,SAAS,OAAO;AACd,YAAM,UAAU,iBAAiB,QAAQ,MAAM,UAAU;AACzD,cAAQ,MAAMA,OAAM,IAAI,mCAA8B,GAAG,OAAO;AAChE,cAAQ,KAAK,CAAC;AAAA,IAChB;AAAA,EACF,CAAC;AAEH,SAAO;AACT;;;AE/PA,OAAOE,YAAW;AAIlB,eAAsB,UAAU,SAAiC;AAC/D,MAAI;AAEF,UAAM,SAAS,MAAM,cAAc,KAAK;AAGxC,QAAI,CAAC,OAAO,iBAAiB,CAAC,OAAO,OAAO,OAAO,aAAa,GAAG;AAEjE,iBAAW,OAAO;AAClB,cAAQ,IAAIC,OAAM,KAAK,uCAAgC,CAAC;AACxD,cAAQ,IAAIA,OAAM,OAAO,uCAAuC,CAAC;AACjE,cAAQ,IAAIA,OAAM,MAAM,2BAA2B,CAAC;AACpD,cAAQ,KAAK,CAAC;AAAA,IAChB;AAAA,EAKF,SAAS,OAAO;AAEd,eAAW,OAAO;AAClB,YAAQ,IAAIA,OAAM,KAAK,uCAAgC,CAAC;AACxD,YAAQ,IAAIA,OAAM,OAAO,uCAAuC,CAAC;AACjE,YAAQ,IAAIA,OAAM,MAAM,2BAA2B,CAAC;AACpD,YAAQ,KAAK,CAAC;AAAA,EAChB;AACF;;;ATnBA,IAAMC,cAAa,cAAc,YAAY,GAAG;AAChD,IAAMC,aAAY,QAAQD,WAAU;AACpC,IAAM,cAAc,KAAK;AAAA,EACvB,aAAaE,MAAKD,YAAW,iBAAiB,GAAG,OAAO;AAC1D;AACA,IAAM,UAAU,YAAY;AAE5B,IAAM,UAAU,IAAIE,SAAQ;AAE5B,QACG,KAAK,WAAW,EAChB,YAAY,4CAA4C,EACxD,QAAQ,OAAO;AAElB,QAAQ,WAAW,kBAAkB,CAAC;AACtC,QAAQ,WAAW,oBAAoB,CAAC;AACxC,QAAQ,WAAW,yBAAyB,OAAO,CAAC;AAEpD,QAAQ,GAAG,aAAa,MAAM;AAC5B,UAAQ,MAAMC,OAAM,IAAI,0BAAqB,CAAC;AAC9C,UAAQ,IAAIA,OAAM,OAAO,uBAAuB,CAAC;AACjD,UAAQ,IAAIA,OAAM,KAAK,yDAAyD,CAAC;AACjF,UAAQ,IAAIA,OAAM,KAAK,2DAA2D,CAAC;AACnF,UAAQ,IAAIA,OAAM,KAAK,0DAA0D,CAAC;AAClF,UAAQ,IAAIA,OAAM,KAAK,4DAA4D,CAAC;AACpF,UAAQ,IAAIA,OAAM,KAAK,6CAA6C,CAAC;AACrE,UAAQ,KAAK,CAAC;AAChB,CAAC;AAGD,eAAe,OAAO;AAEpB,MAAI,CAAC,QAAQ,KAAK,MAAM,CAAC,EAAE,QAAQ;AACjC,UAAM,UAAU,OAAO;AAEvB,YAAQ,KAAK,KAAK,aAAa;AAAA,EACjC;AAEA,QAAM,QAAQ,WAAW,QAAQ,IAAI;AACvC;AAGA,KAAK,EAAE,MAAM,CAAC,UAAU;AACtB,UAAQ,MAAMA,OAAM,IAAI,uBAAkB,GAAG,MAAM,OAAO;AAC1D,UAAQ,KAAK,CAAC;AAChB,CAAC;","names":["Command","chalk","join","chalk","chalk","chalk","chalk","message","Command","chalk","chalk","Command","chalk","config","Command","chalk","ora","readline","chalk","Command","chalk","ora","chalk","chalk","__filename","__dirname","join","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';\nimport { readFileSync } from 'fs';\nimport { fileURLToPath } from 'url';\nimport { dirname, join } from 'path';\n\n// Read version from package.json\nconst __filename = fileURLToPath(import.meta.url);\nconst __dirname = dirname(__filename);\nconst packageJson = JSON.parse(\n readFileSync(join(__dirname, '../../package.json'), 'utf-8')\n);\nconst VERSION = packageJson.version;\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(` v${VERSION}`));\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 { readFileSync } from 'fs';\nimport { fileURLToPath } from 'url';\nimport { dirname, join } from 'path';\nimport { createChatCommand } from './commands/chat.js';\nimport { createConfigCommand } from './commands/config.js';\nimport { createInteractiveCommand } from './commands/interactive.js';\n\n// Read version from package.json\nconst __filename = fileURLToPath(import.meta.url);\nconst __dirname = dirname(__filename);\nconst packageJson = JSON.parse(\n readFileSync(join(__dirname, '../package.json'), 'utf-8')\n);\nconst VERSION = packageJson.version;\n\nconst program = new Command();\n\nprogram\n .name('horneross')\n .description('Terminal interface for Horneross AI agents')\n .version(VERSION);\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","fileURLToPath","join","__filename","__dirname","chalk","Command","chalk","readFileSync","fileURLToPath","dirname","join","chalk","chalk","message","Command","chalk","chalk","Command","chalk","config","Command","chalk","ora","readline","Command","chalk","ora","__filename","fileURLToPath","__dirname","dirname","packageJson","readFileSync","join","VERSION","Command","chalk","autoStart"]}
|