@horneross/cli 0.4.2 → 0.5.0

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 CHANGED
@@ -93,17 +93,17 @@ var init_config_manager = __esm({
93
93
  });
94
94
 
95
95
  // src/utils/banner.ts
96
- import chalk5 from "chalk";
96
+ import chalk6 from "chalk";
97
97
  function showBanner() {
98
98
  console.log();
99
- console.log(chalk5.hex("#FF8800").bold(`
99
+ console.log(chalk6.hex("#FF8800").bold(`
100
100
  \u2566 \u2566\u2554\u2550\u2557\u2566\u2550\u2557\u2554\u2557\u2554\u2554\u2550\u2557\u2566\u2550\u2557\u2554\u2550\u2557\u2554\u2550\u2557\u2554\u2550\u2557
101
101
  \u2560\u2550\u2563\u2551 \u2551\u2560\u2566\u255D\u2551\u2551\u2551\u2551\u2563 \u2560\u2566\u255D\u2551 \u2551\u255A\u2550\u2557\u255A\u2550\u2557
102
102
  \u2569 \u2569\u255A\u2550\u255D\u2569\u255A\u2550\u255D\u255A\u255D\u255A\u2550\u255D\u2569\u255A\u2550\u255A\u2550\u255D\u255A\u2550\u255D\u255A\u2550\u255D
103
103
  `));
104
- console.log(chalk5.gray.bold(" Terminal AI Agent Interface"));
105
- console.log(chalk5.gray(" https://horneross.com"));
106
- console.log(chalk5.gray(" \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500"));
104
+ console.log(chalk6.gray.bold(" Terminal AI Agent Interface"));
105
+ console.log(chalk6.gray(" https://horneross.com"));
106
+ 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"));
107
107
  console.log();
108
108
  }
109
109
  var init_banner = __esm({
@@ -118,22 +118,22 @@ var auto_start_exports = {};
118
118
  __export(auto_start_exports, {
119
119
  autoStart: () => autoStart
120
120
  });
121
- import chalk7 from "chalk";
121
+ import chalk8 from "chalk";
122
122
  async function autoStart() {
123
123
  try {
124
124
  const config = await ConfigManager.load();
125
125
  if (!config.default_agent || !config.agents[config.default_agent]) {
126
126
  showBanner();
127
- console.log(chalk7.cyan("\u{1F44B} Welcome to Horneross CLI!\n"));
128
- console.log(chalk7.yellow("No configuration found. Please run:\n"));
129
- console.log(chalk7.white(" horneross config init\n"));
127
+ console.log(chalk8.cyan("\u{1F44B} Welcome to Horneross CLI!\n"));
128
+ console.log(chalk8.yellow("No configuration found. Please run:\n"));
129
+ console.log(chalk8.white(" horneross config init\n"));
130
130
  process.exit(0);
131
131
  }
132
132
  } catch (error) {
133
133
  showBanner();
134
- console.log(chalk7.cyan("\u{1F44B} Welcome to Horneross CLI!\n"));
135
- console.log(chalk7.yellow("No configuration found. Please run:\n"));
136
- console.log(chalk7.white(" horneross config init\n"));
134
+ console.log(chalk8.cyan("\u{1F44B} Welcome to Horneross CLI!\n"));
135
+ console.log(chalk8.yellow("No configuration found. Please run:\n"));
136
+ console.log(chalk8.white(" horneross config init\n"));
137
137
  process.exit(0);
138
138
  }
139
139
  }
@@ -149,19 +149,32 @@ var init_auto_start = __esm({
149
149
  // src/index.ts
150
150
  init_esm_shims();
151
151
  import { Command as Command4 } from "commander";
152
- import chalk8 from "chalk";
152
+ import chalk9 from "chalk";
153
153
 
154
154
  // src/commands/chat.ts
155
155
  init_esm_shims();
156
156
  init_config_manager();
157
157
  import { Command } from "commander";
158
- import chalk2 from "chalk";
158
+ import chalk3 from "chalk";
159
159
 
160
160
  // src/adapters/stream-adapter.ts
161
161
  init_esm_shims();
162
162
  import { createParser } from "eventsource-parser";
163
163
  import ora from "ora";
164
+ import chalk2 from "chalk";
165
+
166
+ // src/utils/markdown.ts
167
+ init_esm_shims();
164
168
  import chalk from "chalk";
169
+ function renderMarkdown(text) {
170
+ let result = text;
171
+ result = result.replace(/\*\*([^*]+)\*\*/g, (_, content) => chalk.bold(content));
172
+ result = result.replace(/\*([^*]+)\*/g, (_, content) => chalk.italic(content));
173
+ result = result.replace(/`([^`]+)`/g, (_, content) => chalk.cyan(content));
174
+ return result;
175
+ }
176
+
177
+ // src/adapters/stream-adapter.ts
165
178
  var StreamAdapter = class {
166
179
  activeSpinner = null;
167
180
  toolCallStack = /* @__PURE__ */ new Map();
@@ -175,7 +188,7 @@ var StreamAdapter = class {
175
188
  throw new Error("Response body is null");
176
189
  }
177
190
  this.isThinking = true;
178
- process.stdout.write(chalk.gray("\u{1F914} Thinking...\n"));
191
+ process.stdout.write(chalk2.gray("\u{1F914} Thinking...\n"));
179
192
  const reader = response.body.getReader();
180
193
  const decoder = new TextDecoder();
181
194
  return new Promise((resolve, reject) => {
@@ -189,7 +202,7 @@ var StreamAdapter = class {
189
202
  this.handleEvent(data);
190
203
  } catch (error) {
191
204
  if (event.data !== "[DONE]") {
192
- console.error(chalk.red("Failed to parse SSE event:"), error);
205
+ console.error(chalk2.red("Failed to parse SSE event:"), error);
193
206
  }
194
207
  }
195
208
  }
@@ -253,7 +266,8 @@ var StreamAdapter = class {
253
266
  const text = event.delta || event.content;
254
267
  if (text) {
255
268
  this.hasOutputText = true;
256
- process.stdout.write(text);
269
+ const formatted = renderMarkdown(text);
270
+ process.stdout.write(formatted);
257
271
  }
258
272
  }
259
273
  handleToolCall(event) {
@@ -276,7 +290,7 @@ var StreamAdapter = class {
276
290
  const argsPreview = this.formatArgs(args);
277
291
  const toolIcon = this.getToolIcon(toolName);
278
292
  this.activeSpinner = ora({
279
- text: chalk.cyan(`${toolIcon} ${toolName}${argsPreview}`)
293
+ text: chalk2.cyan(`${toolIcon} ${toolName}${argsPreview}`)
280
294
  }).start();
281
295
  }
282
296
  handleToolResult(event) {
@@ -289,20 +303,20 @@ var StreamAdapter = class {
289
303
  this.toolsExecuted.push({ name: toolName, duration: elapsedMs });
290
304
  }
291
305
  this.activeSpinner.succeed(
292
- chalk.green(`${toolIcon} ${toolName} ${chalk.gray(`(${elapsed})`)}`)
306
+ chalk2.green(`${toolIcon} ${toolName} ${chalk2.gray(`(${elapsed})`)}`)
293
307
  );
294
308
  this.activeSpinner = null;
295
309
  }
296
310
  if (!this.isThinking) {
297
311
  this.isThinking = true;
298
- process.stdout.write(chalk.gray("\u{1F914} Thinking...\n"));
312
+ process.stdout.write(chalk2.gray("\u{1F914} Thinking...\n"));
299
313
  }
300
314
  }
301
315
  handleToolOutput(event) {
302
316
  if (event.data && typeof event.data === "object") {
303
317
  const data = event.data;
304
318
  if (this.activeSpinner && data.message) {
305
- this.activeSpinner.text = chalk.cyan(data.message);
319
+ this.activeSpinner.text = chalk2.cyan(data.message);
306
320
  }
307
321
  }
308
322
  }
@@ -310,9 +324,9 @@ var StreamAdapter = class {
310
324
  if (event.data && Array.isArray(event.data)) {
311
325
  const sources = event.data;
312
326
  if (sources.length > 0) {
313
- console.log(chalk.blue("\n\u{1F4DA} Consulting knowledge base:"));
327
+ console.log(chalk2.blue("\n\u{1F4DA} Consulting knowledge base:"));
314
328
  sources.forEach((source) => {
315
- console.log(chalk.gray(` \u2022 ${source.datastoreName} (${source.results.length} results)`));
329
+ console.log(chalk2.gray(` \u2022 ${source.datastoreName} (${source.results.length} results)`));
316
330
  });
317
331
  console.log("");
318
332
  }
@@ -322,9 +336,9 @@ var StreamAdapter = class {
322
336
  if (event.data && typeof event.data === "object") {
323
337
  const data = event.data;
324
338
  if (data.suggestions && data.suggestions.length > 0) {
325
- console.log(chalk.blue("\n\u{1F4A1} Suggestions:"));
339
+ console.log(chalk2.blue("\n\u{1F4A1} Suggestions:"));
326
340
  data.suggestions.forEach((suggestion, i) => {
327
- console.log(chalk.gray(` ${i + 1}. ${suggestion}`));
341
+ console.log(chalk2.gray(` ${i + 1}. ${suggestion}`));
328
342
  });
329
343
  }
330
344
  }
@@ -351,7 +365,7 @@ var StreamAdapter = class {
351
365
  }
352
366
  handleError(event) {
353
367
  this.cleanup();
354
- console.error(chalk.red("\n\u2716 Error:"), event.content || "Unknown error");
368
+ console.error(chalk2.red("\n\u2716 Error:"), event.content || "Unknown error");
355
369
  }
356
370
  formatArgs(args) {
357
371
  if (!args || typeof args !== "object") {
@@ -366,7 +380,7 @@ var StreamAdapter = class {
366
380
  const truncated = valueStr.length > 30 ? valueStr.slice(0, 30) + "..." : valueStr;
367
381
  return `${key}: ${truncated}`;
368
382
  }).join(", ");
369
- return ` ${chalk.gray(`(${preview})`)}`;
383
+ return ` ${chalk2.gray(`(${preview})`)}`;
370
384
  }
371
385
  getElapsedTimeMs() {
372
386
  const lastTool = Array.from(this.toolCallStack.values()).pop();
@@ -405,17 +419,17 @@ function createChatCommand() {
405
419
  const config = await ConfigManager.load();
406
420
  const agentName = options.agent || config.default_agent;
407
421
  if (!agentName) {
408
- console.error(chalk2.red("\n\u2716 No default agent configured"));
409
- console.error(chalk2.yellow("Run: horneross config init\n"));
422
+ console.error(chalk3.red("\n\u2716 No default agent configured"));
423
+ console.error(chalk3.yellow("Run: horneross config init\n"));
410
424
  process.exit(1);
411
425
  }
412
426
  const agent = config.agents[agentName];
413
427
  if (!agent) {
414
- console.error(chalk2.red(`
428
+ console.error(chalk3.red(`
415
429
  \u2716 Agent "${agentName}" not found`));
416
- console.error(chalk2.yellow("Available agents:"));
430
+ console.error(chalk3.yellow("Available agents:"));
417
431
  for (const name of Object.keys(config.agents)) {
418
- console.error(chalk2.gray(` - ${name}`));
432
+ console.error(chalk3.gray(` - ${name}`));
419
433
  }
420
434
  console.error();
421
435
  process.exit(1);
@@ -439,7 +453,7 @@ function createChatCommand() {
439
453
  );
440
454
  if (!response.ok) {
441
455
  const errorText = await response.text();
442
- console.error(chalk2.red(`
456
+ console.error(chalk3.red(`
443
457
  \u2716 Request failed (${response.status}):`), errorText);
444
458
  process.exit(1);
445
459
  }
@@ -447,7 +461,7 @@ function createChatCommand() {
447
461
  const metadata = await adapter.processStream(response);
448
462
  if (metadata) {
449
463
  console.log(
450
- chalk2.gray(
464
+ chalk3.gray(
451
465
  `
452
466
 
453
467
  Conversation ID: ${metadata.conversationId}`
@@ -457,7 +471,7 @@ Conversation ID: ${metadata.conversationId}`
457
471
  console.log();
458
472
  } catch (error) {
459
473
  const message2 = error instanceof Error ? error.message : "Unknown error";
460
- console.error(chalk2.red("\n\u2716 Chat failed:"), message2);
474
+ console.error(chalk3.red("\n\u2716 Chat failed:"), message2);
461
475
  process.exit(1);
462
476
  }
463
477
  });
@@ -468,12 +482,12 @@ Conversation ID: ${metadata.conversationId}`
468
482
  init_esm_shims();
469
483
  init_config_manager();
470
484
  import { Command as Command2 } from "commander";
471
- import chalk4 from "chalk";
485
+ import chalk5 from "chalk";
472
486
  import * as readline from "readline/promises";
473
487
 
474
488
  // src/auth/auth-manager.ts
475
489
  init_esm_shims();
476
- import chalk3 from "chalk";
490
+ import chalk4 from "chalk";
477
491
  var AuthManager = class {
478
492
  static async validateConnection(agentConfig, baseUrl) {
479
493
  try {
@@ -498,12 +512,12 @@ var AuthManager = class {
498
512
  }
499
513
  }
500
514
  static displayAuthError(error) {
501
- console.error(chalk3.red("\n\u2716 Authentication failed:"), error);
502
- console.error(chalk3.yellow("\nTroubleshooting:"));
503
- console.error(chalk3.gray(" 1. Check your API key is correct"));
504
- console.error(chalk3.gray(" 2. Verify the agent ID exists"));
505
- console.error(chalk3.gray(" 3. Ensure the base URL is accessible"));
506
- console.error(chalk3.gray("\nRun: horneross config init"));
515
+ console.error(chalk4.red("\n\u2716 Authentication failed:"), error);
516
+ console.error(chalk4.yellow("\nTroubleshooting:"));
517
+ console.error(chalk4.gray(" 1. Check your API key is correct"));
518
+ console.error(chalk4.gray(" 2. Verify the agent ID exists"));
519
+ console.error(chalk4.gray(" 3. Ensure the base URL is accessible"));
520
+ console.error(chalk4.gray("\nRun: horneross config init"));
507
521
  }
508
522
  };
509
523
 
@@ -511,35 +525,35 @@ var AuthManager = class {
511
525
  function createConfigCommand() {
512
526
  const config = new Command2("config");
513
527
  config.command("init").description("Initialize Horneross CLI configuration").action(async () => {
514
- console.log(chalk4.bold.cyan("\n\u{1F916} Horneross CLI Setup\n"));
528
+ console.log(chalk5.bold.cyan("\n\u{1F916} Horneross CLI Setup\n"));
515
529
  const rl = readline.createInterface({
516
530
  input: process.stdin,
517
531
  output: process.stdout
518
532
  });
519
533
  try {
520
534
  const agentName = await rl.question(
521
- chalk4.yellow('Agent name (e.g., "adam"): ')
535
+ chalk5.yellow('Agent name (e.g., "adam"): ')
522
536
  );
523
537
  if (!agentName.trim()) {
524
- console.error(chalk4.red("\n\u2716 Agent name is required"));
538
+ console.error(chalk5.red("\n\u2716 Agent name is required"));
525
539
  process.exit(1);
526
540
  }
527
541
  const agentId = await rl.question(
528
- chalk4.yellow("Agent ID: ")
542
+ chalk5.yellow("Agent ID: ")
529
543
  );
530
544
  if (!agentId.trim()) {
531
- console.error(chalk4.red("\n\u2716 Agent ID is required"));
545
+ console.error(chalk5.red("\n\u2716 Agent ID is required"));
532
546
  process.exit(1);
533
547
  }
534
548
  const apiKey = await rl.question(
535
- chalk4.yellow("API Key: ")
549
+ chalk5.yellow("API Key: ")
536
550
  );
537
551
  if (!apiKey.trim()) {
538
- console.error(chalk4.red("\n\u2716 API Key is required"));
552
+ console.error(chalk5.red("\n\u2716 API Key is required"));
539
553
  process.exit(1);
540
554
  }
541
555
  const baseUrl = await rl.question(
542
- chalk4.yellow("Base URL [http://localhost:3000]: ")
556
+ chalk5.yellow("Base URL [http://localhost:3000]: ")
543
557
  );
544
558
  const finalBaseUrl = baseUrl.trim() || "http://localhost:3000";
545
559
  rl.close();
@@ -548,7 +562,7 @@ function createConfigCommand() {
548
562
  api_key: apiKey.trim(),
549
563
  name: agentName.trim()
550
564
  };
551
- console.log(chalk4.gray("\n\u23F3 Validating connection..."));
565
+ console.log(chalk5.gray("\n\u23F3 Validating connection..."));
552
566
  const { valid, error } = await AuthManager.validateConnection(
553
567
  agentConfig,
554
568
  finalBaseUrl
@@ -561,38 +575,38 @@ function createConfigCommand() {
561
575
  const currentConfig = await ConfigManager.load();
562
576
  currentConfig.base_url = finalBaseUrl;
563
577
  await ConfigManager.save(currentConfig);
564
- console.log(chalk4.green("\n\u2713 Configuration saved successfully!"));
565
- console.log(chalk4.gray(`
578
+ console.log(chalk5.green("\n\u2713 Configuration saved successfully!"));
579
+ console.log(chalk5.gray(`
566
580
  Config file: ${ConfigManager.getConfigPath()}`));
567
- console.log(chalk4.gray(`Default agent: ${agentName.trim()}`));
568
- console.log(chalk4.cyan('\nYou can now run: horneross chat "Hello"\n'));
581
+ console.log(chalk5.gray(`Default agent: ${agentName.trim()}`));
582
+ console.log(chalk5.cyan('\nYou can now run: horneross chat "Hello"\n'));
569
583
  } catch (error) {
570
584
  rl.close();
571
- console.error(chalk4.red("\n\u2716 Setup failed:"), error);
585
+ console.error(chalk5.red("\n\u2716 Setup failed:"), error);
572
586
  process.exit(1);
573
587
  }
574
588
  });
575
589
  config.command("show").description("Show current configuration").action(async () => {
576
590
  try {
577
591
  const config2 = await ConfigManager.load();
578
- console.log(chalk4.bold.cyan("\n\u{1F527} Current Configuration\n"));
579
- console.log(chalk4.yellow("Base URL:"), config2.base_url);
580
- console.log(chalk4.yellow("Default Agent:"), config2.default_agent || chalk4.gray("(not set)"));
581
- console.log(chalk4.yellow("\nConfigured Agents:"));
592
+ console.log(chalk5.bold.cyan("\n\u{1F527} Current Configuration\n"));
593
+ console.log(chalk5.yellow("Base URL:"), config2.base_url);
594
+ console.log(chalk5.yellow("Default Agent:"), config2.default_agent || chalk5.gray("(not set)"));
595
+ console.log(chalk5.yellow("\nConfigured Agents:"));
582
596
  if (Object.keys(config2.agents).length === 0) {
583
- console.log(chalk4.gray(" No agents configured"));
597
+ console.log(chalk5.gray(" No agents configured"));
584
598
  } else {
585
599
  for (const [name, agent] of Object.entries(config2.agents)) {
586
600
  const isDefault = name === config2.default_agent;
587
- const marker = isDefault ? chalk4.green("\u2713") : " ";
588
- console.log(` ${marker} ${chalk4.cyan(name)} (${agent.id})`);
601
+ const marker = isDefault ? chalk5.green("\u2713") : " ";
602
+ console.log(` ${marker} ${chalk5.cyan(name)} (${agent.id})`);
589
603
  }
590
604
  }
591
- console.log(chalk4.gray(`
605
+ console.log(chalk5.gray(`
592
606
  Config file: ${ConfigManager.getConfigPath()}
593
607
  `));
594
608
  } catch (error) {
595
- console.error(chalk4.red("Failed to load configuration:"), error);
609
+ console.error(chalk5.red("Failed to load configuration:"), error);
596
610
  process.exit(1);
597
611
  }
598
612
  });
@@ -603,7 +617,7 @@ Config file: ${ConfigManager.getConfigPath()}
603
617
  init_esm_shims();
604
618
  init_config_manager();
605
619
  import { Command as Command3 } from "commander";
606
- import chalk6 from "chalk";
620
+ import chalk7 from "chalk";
607
621
  import ora2 from "ora";
608
622
  import * as readline2 from "readline";
609
623
  import { createId } from "@paralleldrive/cuid2";
@@ -615,19 +629,19 @@ function createInteractiveCommand() {
615
629
  const config = await ConfigManager.load();
616
630
  const agentName = options.agent || config.default_agent;
617
631
  if (!agentName) {
618
- console.error(chalk6.red("\n\u2716 No default agent configured"));
619
- console.error(chalk6.yellow("Run: horneross config init\n"));
632
+ console.error(chalk7.red("\n\u2716 No default agent configured"));
633
+ console.error(chalk7.yellow("Run: horneross config init\n"));
620
634
  process.exit(1);
621
635
  }
622
636
  const agent = config.agents[agentName];
623
637
  if (!agent) {
624
- console.error(chalk6.red(`
638
+ console.error(chalk7.red(`
625
639
  \u2716 Agent "${agentName}" not found`));
626
640
  process.exit(1);
627
641
  }
628
642
  showBanner();
629
- console.log(chalk6.bold.cyan(`\u{1F916} Chatting with ${agent.name}`));
630
- console.log(chalk6.gray("Commands: /help /exit /clear /agent /config\n"));
643
+ console.log(chalk7.bold.cyan(`\u{1F916} Chatting with ${agent.name}`));
644
+ console.log(chalk7.gray("Commands: /help /exit /clear /agent /config\n"));
631
645
  const conversationId = createId();
632
646
  let messageCount = 0;
633
647
  let totalToolsUsed = 0;
@@ -635,7 +649,7 @@ function createInteractiveCommand() {
635
649
  const rl = readline2.createInterface({
636
650
  input: process.stdin,
637
651
  output: process.stdout,
638
- prompt: chalk6.green("> ")
652
+ prompt: chalk7.green("> ")
639
653
  });
640
654
  rl.prompt();
641
655
  rl.on("line", async (input) => {
@@ -645,58 +659,58 @@ function createInteractiveCommand() {
645
659
  switch (command.toLowerCase()) {
646
660
  case "exit":
647
661
  case "quit":
648
- console.log(chalk6.gray("\nGoodbye! \u{1F44B}\n"));
662
+ console.log(chalk7.gray("\nGoodbye! \u{1F44B}\n"));
649
663
  rl.close();
650
664
  process.exit(0);
651
665
  break;
652
666
  case "help":
653
- console.log(chalk6.cyan("\n\u{1F4DA} Available Commands:\n"));
654
- console.log(chalk6.gray(" /exit Exit the chat"));
655
- console.log(chalk6.gray(" /clear Clear the screen"));
656
- console.log(chalk6.gray(" /config Show current configuration"));
657
- console.log(chalk6.gray(" /agent <name> Switch to a different agent"));
658
- console.log(chalk6.gray(" /help Show this help message\n"));
667
+ console.log(chalk7.cyan("\n\u{1F4DA} Available Commands:\n"));
668
+ console.log(chalk7.gray(" /exit Exit the chat"));
669
+ console.log(chalk7.gray(" /clear Clear the screen"));
670
+ console.log(chalk7.gray(" /config Show current configuration"));
671
+ console.log(chalk7.gray(" /agent <name> Switch to a different agent"));
672
+ console.log(chalk7.gray(" /help Show this help message\n"));
659
673
  rl.prompt();
660
674
  return;
661
675
  case "clear":
662
676
  console.clear();
663
677
  showBanner();
664
- console.log(chalk6.bold.cyan(`\u{1F916} Chatting with ${agent.name}`));
665
- console.log(chalk6.gray("Commands: /help /exit /clear /agent /config\n"));
678
+ console.log(chalk7.bold.cyan(`\u{1F916} Chatting with ${agent.name}`));
679
+ console.log(chalk7.gray("Commands: /help /exit /clear /agent /config\n"));
666
680
  rl.prompt();
667
681
  return;
668
682
  case "config":
669
- console.log(chalk6.cyan("\n\u2699\uFE0F Current Configuration:\n"));
670
- console.log(chalk6.gray(` Agent: ${agent.name} (${agent.id})`));
671
- console.log(chalk6.gray(` Base URL: ${config.base_url}`));
672
- console.log(chalk6.gray(` Conversation ID: ${conversationId}
683
+ console.log(chalk7.cyan("\n\u2699\uFE0F Current Configuration:\n"));
684
+ console.log(chalk7.gray(` Agent: ${agent.name} (${agent.id})`));
685
+ console.log(chalk7.gray(` Base URL: ${config.base_url}`));
686
+ console.log(chalk7.gray(` Conversation ID: ${conversationId}
673
687
  `));
674
688
  rl.prompt();
675
689
  return;
676
690
  case "agent":
677
691
  if (!args[0]) {
678
- console.log(chalk6.red("\n\u2716 Please specify an agent name"));
679
- console.log(chalk6.yellow("Available agents:"));
692
+ console.log(chalk7.red("\n\u2716 Please specify an agent name"));
693
+ console.log(chalk7.yellow("Available agents:"));
680
694
  Object.keys(config.agents).forEach((name) => {
681
- console.log(chalk6.gray(` - ${name}`));
695
+ console.log(chalk7.gray(` - ${name}`));
682
696
  });
683
697
  console.log("");
684
698
  rl.prompt();
685
699
  return;
686
700
  }
687
- console.log(chalk6.yellow("\n\u26A0\uFE0F Agent switching not yet implemented\n"));
701
+ console.log(chalk7.yellow("\n\u26A0\uFE0F Agent switching not yet implemented\n"));
688
702
  rl.prompt();
689
703
  return;
690
704
  default:
691
- console.log(chalk6.red(`
705
+ console.log(chalk7.red(`
692
706
  \u2716 Unknown command: /${command}`));
693
- console.log(chalk6.yellow("Type /help for available commands\n"));
707
+ console.log(chalk7.yellow("Type /help for available commands\n"));
694
708
  rl.prompt();
695
709
  return;
696
710
  }
697
711
  }
698
712
  if (trimmed === "exit" || trimmed === "quit") {
699
- console.log(chalk6.gray("\nGoodbye! \u{1F44B}\n"));
713
+ console.log(chalk7.gray("\nGoodbye! \u{1F44B}\n"));
700
714
  rl.close();
701
715
  process.exit(0);
702
716
  }
@@ -708,7 +722,7 @@ function createInteractiveCommand() {
708
722
  messageCount++;
709
723
  console.log("");
710
724
  const startSpinner = ora2({
711
- text: chalk6.gray("Starting..."),
725
+ text: chalk7.gray("Starting..."),
712
726
  color: "gray"
713
727
  }).start();
714
728
  const response = await fetch(
@@ -737,13 +751,13 @@ function createInteractiveCommand() {
737
751
  const errorText = await response.text();
738
752
  errorMessage = errorText || errorMessage;
739
753
  }
740
- console.error(chalk6.red("\n\u2716 Error:"), errorMessage);
754
+ console.error(chalk7.red("\n\u2716 Error:"), errorMessage);
741
755
  if (response.status === 401) {
742
- console.log(chalk6.yellow(" Hint: Check your API key configuration"));
756
+ console.log(chalk7.yellow(" Hint: Check your API key configuration"));
743
757
  } else if (response.status === 429) {
744
- console.log(chalk6.yellow(" Hint: Rate limit exceeded, please wait a moment"));
758
+ console.log(chalk7.yellow(" Hint: Rate limit exceeded, please wait a moment"));
745
759
  } else if (response.status === 500) {
746
- console.log(chalk6.yellow(" Hint: Server error, please try again later"));
760
+ console.log(chalk7.yellow(" Hint: Server error, please try again later"));
747
761
  }
748
762
  console.log("");
749
763
  rl.prompt();
@@ -772,9 +786,9 @@ function createInteractiveCommand() {
772
786
  hint = "Network request failed. Check your internet connection and base_url.";
773
787
  }
774
788
  }
775
- console.error(chalk6.red("\n\u2716 Error:"), message);
789
+ console.error(chalk7.red("\n\u2716 Error:"), message);
776
790
  if (hint) {
777
- console.log(chalk6.yellow(` Hint: ${hint}`));
791
+ console.log(chalk7.yellow(` Hint: ${hint}`));
778
792
  }
779
793
  console.log("");
780
794
  rl.prompt();
@@ -785,23 +799,23 @@ function createInteractiveCommand() {
785
799
  const durationMinutes = Math.floor(sessionDuration / 6e4);
786
800
  const durationSeconds = Math.floor(sessionDuration % 6e4 / 1e3);
787
801
  console.log("");
788
- console.log(chalk6.blue("\u2501".repeat(50)));
789
- console.log(chalk6.bold.cyan("\n\u{1F4CA} Session Summary"));
790
- console.log(chalk6.gray(` Messages: ${messageCount}`));
791
- console.log(chalk6.gray(` Tools used: ${totalToolsUsed}`));
792
- console.log(chalk6.gray(` Duration: ${durationMinutes}m ${durationSeconds}s`));
793
- console.log(chalk6.gray(` Conversation ID: ${conversationId}`));
802
+ console.log(chalk7.blue("\u2501".repeat(50)));
803
+ console.log(chalk7.bold.cyan("\n\u{1F4CA} Session Summary"));
804
+ console.log(chalk7.gray(` Messages: ${messageCount}`));
805
+ console.log(chalk7.gray(` Tools used: ${totalToolsUsed}`));
806
+ console.log(chalk7.gray(` Duration: ${durationMinutes}m ${durationSeconds}s`));
807
+ console.log(chalk7.gray(` Conversation ID: ${conversationId}`));
794
808
  if (messageCount > 0) {
795
- console.log(chalk6.blue("\n\u{1F4A1} Resume this conversation:"));
796
- console.log(chalk6.yellow(` horneross --resume ${conversationId.slice(0, 8)}`));
809
+ console.log(chalk7.blue("\n\u{1F4A1} Resume this conversation:"));
810
+ console.log(chalk7.yellow(` horneross --resume ${conversationId.slice(0, 8)}`));
797
811
  }
798
- console.log(chalk6.blue("\n\u2501".repeat(50)));
799
- console.log(chalk6.gray("\nGoodbye! \u{1F44B}\n"));
812
+ console.log(chalk7.blue("\n\u2501".repeat(50)));
813
+ console.log(chalk7.gray("\nGoodbye! \u{1F44B}\n"));
800
814
  process.exit(0);
801
815
  });
802
816
  } catch (error) {
803
817
  const message = error instanceof Error ? error.message : "Unknown error";
804
- console.error(chalk6.red("\n\u2716 Interactive mode failed:"), message);
818
+ console.error(chalk7.red("\n\u2716 Interactive mode failed:"), message);
805
819
  process.exit(1);
806
820
  }
807
821
  });
@@ -815,22 +829,22 @@ program.addCommand(createChatCommand());
815
829
  program.addCommand(createConfigCommand());
816
830
  program.addCommand(createInteractiveCommand());
817
831
  program.on("command:*", () => {
818
- console.error(chalk8.red("\n\u2716 Invalid command"));
819
- console.log(chalk8.yellow("\nAvailable commands:"));
820
- console.log(chalk8.gray(" horneross chat <message> Send a one-shot message"));
821
- console.log(chalk8.gray(" horneross interactive Start interactive session"));
822
- console.log(chalk8.gray(" horneross config init Initialize configuration"));
823
- console.log(chalk8.gray(" horneross config show Show current configuration"));
824
- console.log(chalk8.gray('\nRun "horneross --help" for more details\n'));
832
+ console.error(chalk9.red("\n\u2716 Invalid command"));
833
+ console.log(chalk9.yellow("\nAvailable commands:"));
834
+ console.log(chalk9.gray(" horneross chat <message> Send a one-shot message"));
835
+ console.log(chalk9.gray(" horneross interactive Start interactive session"));
836
+ console.log(chalk9.gray(" horneross config init Initialize configuration"));
837
+ console.log(chalk9.gray(" horneross config show Show current configuration"));
838
+ console.log(chalk9.gray('\nRun "horneross --help" for more details\n'));
825
839
  process.exit(1);
826
840
  });
827
841
  if (!process.argv.slice(2).length) {
828
842
  Promise.resolve().then(() => (init_auto_start(), auto_start_exports)).then(async ({ autoStart: autoStart2 }) => {
829
843
  await autoStart2();
830
844
  process.argv.push("interactive");
831
- program.parse(process.argv);
845
+ await program.parseAsync(process.argv);
832
846
  });
833
847
  } else {
834
- program.parse(process.argv);
848
+ await program.parseAsync(process.argv);
835
849
  }
836
850
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../node_modules/.pnpm/tsup@8.5.1_tsx@3.14.0_typescript@5.9.3_yaml@2.8.1/node_modules/tsup/assets/esm_shims.js","../src/config/config-manager.ts","../src/utils/banner.ts","../src/utils/auto-start.ts","../src/index.ts","../src/commands/chat.ts","../src/adapters/stream-adapter.ts","../src/commands/config.ts","../src/auth/auth-manager.ts","../src/commands/interactive.ts"],"sourcesContent":["// Shim globals in esm bundle\nimport path from 'node:path'\nimport { fileURLToPath } from 'node:url'\n\nconst getFilename = () => fileURLToPath(import.meta.url)\nconst getDirname = () => path.dirname(getFilename())\n\nexport const __dirname = /* @__PURE__ */ getDirname()\nexport const __filename = /* @__PURE__ */ getFilename()\n","import { readFile, writeFile, mkdir } from 'fs/promises';\nimport { homedir } from 'os';\nimport { join } from 'path';\nimport { parse, stringify } from 'yaml';\nimport type { CLIConfig, AgentConfig } from '../types.js';\n\nconst CONFIG_DIR = join(homedir(), '.horneross');\nconst CONFIG_PATH = join(CONFIG_DIR, 'config.yaml');\n\nconst DEFAULT_CONFIG: CLIConfig = {\n default_agent: '',\n base_url: 'http://localhost:3000',\n agents: {},\n};\n\nexport class ConfigManager {\n static async load(): Promise<CLIConfig> {\n try {\n const content = await readFile(CONFIG_PATH, 'utf-8');\n const config = parse(content) as CLIConfig;\n return { ...DEFAULT_CONFIG, ...config };\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code === 'ENOENT') {\n return DEFAULT_CONFIG;\n }\n throw error;\n }\n }\n\n static async save(config: CLIConfig): Promise<void> {\n await mkdir(CONFIG_DIR, { recursive: true });\n const content = stringify(config);\n await writeFile(CONFIG_PATH, content, { mode: 0o600 });\n }\n\n static async addAgent(\n name: string,\n agentConfig: AgentConfig\n ): Promise<void> {\n const config = await this.load();\n config.agents[name] = agentConfig;\n\n if (!config.default_agent) {\n config.default_agent = name;\n }\n\n await this.save(config);\n }\n\n static async getAgent(name?: string): Promise<AgentConfig> {\n const config = await this.load();\n const agentName = name || config.default_agent;\n\n if (!agentName) {\n throw new Error('No default agent configured. Run: horneross config init');\n }\n\n const agent = config.agents[agentName];\n if (!agent) {\n throw new Error(`Agent \"${agentName}\" not found in configuration`);\n }\n\n return agent;\n }\n\n static async validateAuth(\n agentConfig: AgentConfig,\n baseUrl: string\n ): Promise<boolean> {\n try {\n const response = await fetch(`${baseUrl}/api/v2/agent/${agentConfig.id}/config`, {\n headers: {\n Authorization: `Bearer ${agentConfig.api_key}`,\n },\n });\n\n return response.ok;\n } catch {\n return false;\n }\n }\n\n static getConfigPath(): string {\n return CONFIG_PATH;\n }\n}\n","import chalk from 'chalk';\n\nexport function showBanner(): void {\n console.log();\n console.log(chalk.hex('#FF8800').bold(`\n ╦ ╦╔═╗╦═╗╔╗╔╔═╗╦═╗╔═╗╔═╗╔═╗\n ╠═╣║ ║╠╦╝║║║║╣ ╠╦╝║ ║╚═╗╚═╗\n ╩ ╩╚═╝╩╚═╝╚╝╚═╝╩╚═╚═╝╚═╝╚═╝\n`));\n console.log(chalk.gray.bold(' Terminal AI Agent Interface'));\n console.log(chalk.gray(' https://horneross.com'));\n console.log(chalk.gray(' ─────────────────────────────'));\n console.log();\n}\n","import chalk from 'chalk';\nimport { ConfigManager } from '../config/config-manager.js';\nimport { showBanner } from './banner.js';\n\nexport async function autoStart(): Promise<void> {\n try {\n // Try to load existing configuration\n const config = await ConfigManager.load();\n\n // Check if there's a default agent configured\n if (!config.default_agent || !config.agents[config.default_agent]) {\n // No configuration found - show welcome and exit\n showBanner();\n console.log(chalk.cyan('👋 Welcome to Horneross CLI!\\n'));\n console.log(chalk.yellow('No configuration found. Please run:\\n'));\n console.log(chalk.white(' horneross config init\\n'));\n process.exit(0);\n }\n\n // Configuration exists - return to let interactive mode run\n // (This function is called from index.ts which will then parse 'interactive' command)\n\n } catch (error) {\n // If config loading fails, assume no config exists\n showBanner();\n console.log(chalk.cyan('👋 Welcome to Horneross CLI!\\n'));\n console.log(chalk.yellow('No configuration found. Please run:\\n'));\n console.log(chalk.white(' horneross config init\\n'));\n process.exit(0);\n }\n}\n","import { Command } from 'commander';\nimport chalk from 'chalk';\nimport { createChatCommand } from './commands/chat.js';\nimport { createConfigCommand } from './commands/config.js';\nimport { createInteractiveCommand } from './commands/interactive.js';\n\nconst program = new Command();\n\nprogram\n .name('horneross')\n .description('Terminal interface for Horneross AI agents')\n .version('0.1.0');\n\nprogram.addCommand(createChatCommand());\nprogram.addCommand(createConfigCommand());\nprogram.addCommand(createInteractiveCommand());\n\nprogram.on('command:*', () => {\n console.error(chalk.red('\\n✖ Invalid command'));\n console.log(chalk.yellow('\\nAvailable commands:'));\n console.log(chalk.gray(' horneross chat <message> Send a one-shot message'));\n console.log(chalk.gray(' horneross interactive Start interactive session'));\n console.log(chalk.gray(' horneross config init Initialize configuration'));\n console.log(chalk.gray(' horneross config show Show current configuration'));\n console.log(chalk.gray('\\nRun \"horneross --help\" for more details\\n'));\n process.exit(1);\n});\n\n// Auto-start interactive mode when no command is provided\nif (!process.argv.slice(2).length) {\n // Import dynamically to avoid circular dependencies\n import('./utils/auto-start.js').then(async ({ autoStart }) => {\n await autoStart();\n // If autoStart didn't exit (config is valid), start interactive mode\n process.argv.push('interactive');\n program.parse(process.argv);\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 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 process.stdout.write(text);\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 { Command } from 'commander';\nimport chalk from 'chalk';\nimport * as readline from 'readline/promises';\nimport { ConfigManager } from '../config/config-manager.js';\nimport { AuthManager } from '../auth/auth-manager.js';\n\nexport function createConfigCommand(): Command {\n const config = new Command('config');\n\n config\n .command('init')\n .description('Initialize Horneross CLI configuration')\n .action(async () => {\n console.log(chalk.bold.cyan('\\n🤖 Horneross CLI Setup\\n'));\n\n const rl = readline.createInterface({\n input: process.stdin,\n output: process.stdout,\n });\n\n try {\n const agentName = await rl.question(\n chalk.yellow('Agent name (e.g., \"adam\"): ')\n );\n\n if (!agentName.trim()) {\n console.error(chalk.red('\\n✖ Agent name is required'));\n process.exit(1);\n }\n\n const agentId = await rl.question(\n chalk.yellow('Agent ID: ')\n );\n\n if (!agentId.trim()) {\n console.error(chalk.red('\\n✖ Agent ID is required'));\n process.exit(1);\n }\n\n const apiKey = await rl.question(\n chalk.yellow('API Key: ')\n );\n\n if (!apiKey.trim()) {\n console.error(chalk.red('\\n✖ API Key is required'));\n process.exit(1);\n }\n\n const baseUrl = await rl.question(\n chalk.yellow('Base URL [http://localhost:3000]: ')\n );\n\n const finalBaseUrl = baseUrl.trim() || 'http://localhost:3000';\n\n rl.close();\n\n const agentConfig = {\n id: agentId.trim(),\n api_key: apiKey.trim(),\n name: agentName.trim(),\n };\n\n console.log(chalk.gray('\\n⏳ Validating connection...'));\n\n const { valid, error } = await AuthManager.validateConnection(\n agentConfig,\n finalBaseUrl\n );\n\n if (!valid) {\n AuthManager.displayAuthError(error || 'Unknown error');\n process.exit(1);\n }\n\n await ConfigManager.addAgent(agentName.trim(), agentConfig);\n\n const currentConfig = await ConfigManager.load();\n currentConfig.base_url = finalBaseUrl;\n await ConfigManager.save(currentConfig);\n\n console.log(chalk.green('\\n✓ Configuration saved successfully!'));\n console.log(chalk.gray(`\\nConfig file: ${ConfigManager.getConfigPath()}`));\n console.log(chalk.gray(`Default agent: ${agentName.trim()}`));\n console.log(chalk.cyan('\\nYou can now run: horneross chat \"Hello\"\\n'));\n } catch (error) {\n rl.close();\n console.error(chalk.red('\\n✖ Setup failed:'), error);\n process.exit(1);\n }\n });\n\n config\n .command('show')\n .description('Show current configuration')\n .action(async () => {\n try {\n const config = await ConfigManager.load();\n\n console.log(chalk.bold.cyan('\\n🔧 Current Configuration\\n'));\n console.log(chalk.yellow('Base URL:'), config.base_url);\n console.log(chalk.yellow('Default Agent:'), config.default_agent || chalk.gray('(not set)'));\n console.log(chalk.yellow('\\nConfigured Agents:'));\n\n if (Object.keys(config.agents).length === 0) {\n console.log(chalk.gray(' No agents configured'));\n } else {\n for (const [name, agent] of Object.entries(config.agents)) {\n const isDefault = name === config.default_agent;\n const marker = isDefault ? chalk.green('✓') : ' ';\n console.log(` ${marker} ${chalk.cyan(name)} (${agent.id})`);\n }\n }\n\n console.log(chalk.gray(`\\nConfig file: ${ConfigManager.getConfigPath()}\\n`));\n } catch (error) {\n console.error(chalk.red('Failed to load configuration:'), error);\n process.exit(1);\n }\n });\n\n return config;\n}\n","import chalk from 'chalk';\nimport type { AgentConfig } from '../types.js';\n\nexport class AuthManager {\n static async validateConnection(\n agentConfig: AgentConfig,\n baseUrl: string\n ): Promise<{ valid: boolean; error?: string }> {\n try {\n const response = await fetch(`${baseUrl}/api/v2/agent/${agentConfig.id}/config`, {\n headers: {\n Authorization: `Bearer ${agentConfig.api_key}`,\n },\n });\n\n if (response.ok) {\n return { valid: true };\n }\n\n if (response.status === 401) {\n return { valid: false, error: 'Invalid API key' };\n }\n\n if (response.status === 404) {\n return { valid: false, error: 'Agent not found' };\n }\n\n return { valid: false, error: `HTTP ${response.status}: ${response.statusText}` };\n } catch (error) {\n const message = error instanceof Error ? error.message : 'Unknown error';\n return { valid: false, error: `Connection failed: ${message}` };\n }\n }\n\n static displayAuthError(error: string): void {\n console.error(chalk.red('\\n✖ Authentication failed:'), error);\n console.error(chalk.yellow('\\nTroubleshooting:'));\n console.error(chalk.gray(' 1. Check your API key is correct'));\n console.error(chalk.gray(' 2. Verify the agent ID exists'));\n console.error(chalk.gray(' 3. Ensure the base URL is accessible'));\n console.error(chalk.gray('\\nRun: horneross config init'));\n }\n}\n","import { Command } from 'commander';\nimport chalk from 'chalk';\nimport ora from 'ora';\nimport * as readline from 'readline';\nimport { createId } from '@paralleldrive/cuid2';\nimport { ConfigManager } from '../config/config-manager.js';\nimport { StreamAdapter } from '../adapters/stream-adapter.js';\nimport { showBanner } from '../utils/banner.js';\n\nexport function createInteractiveCommand(): Command {\n const interactive = new Command('interactive');\n\n interactive\n .description('Start an interactive chat session')\n .option('-a, --agent <name>', 'Agent to use (defaults to configured default)')\n .action(async (options: { agent?: string }) => {\n try {\n const config = await ConfigManager.load();\n const agentName = options.agent || config.default_agent;\n\n if (!agentName) {\n console.error(chalk.red('\\n✖ No default agent configured'));\n console.error(chalk.yellow('Run: horneross config init\\n'));\n process.exit(1);\n }\n\n const agent = config.agents[agentName];\n if (!agent) {\n console.error(chalk.red(`\\n✖ Agent \"${agentName}\" not found`));\n process.exit(1);\n }\n\n // Show banner\n showBanner();\n\n console.log(chalk.bold.cyan(`🤖 Chatting with ${agent.name}`));\n console.log(chalk.gray('Commands: /help /exit /clear /agent /config\\n'));\n\n const conversationId = createId();\n let messageCount = 0;\n let totalToolsUsed = 0;\n const sessionStartTime = Date.now();\n\n 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 console.log(chalk.gray('\\nGoodbye! 👋\\n'));\n rl.close();\n process.exit(0);\n break;\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 console.log(chalk.gray('\\nGoodbye! 👋\\n'));\n rl.close();\n process.exit(0);\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 process.exit(0);\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":";;;;;;;;;;;;AACA,OAAO,UAAU;AACjB,SAAS,qBAAqB;AAF9B;AAAA;AAAA;AAAA;AAAA;;;ACAA,SAAS,UAAU,WAAW,aAAa;AAC3C,SAAS,eAAe;AACxB,SAAS,YAAY;AACrB,SAAS,OAAO,iBAAiB;AAHjC,IAMM,YACA,aAEA,gBAMO;AAfb;AAAA;AAAA;AAAA;AAMA,IAAM,aAAa,KAAK,QAAQ,GAAG,YAAY;AAC/C,IAAM,cAAc,KAAK,YAAY,aAAa;AAElD,IAAM,iBAA4B;AAAA,MAChC,eAAe;AAAA,MACf,UAAU;AAAA,MACV,QAAQ,CAAC;AAAA,IACX;AAEO,IAAM,gBAAN,MAAoB;AAAA,MACzB,aAAa,OAA2B;AACtC,YAAI;AACF,gBAAM,UAAU,MAAM,SAAS,aAAa,OAAO;AACnD,gBAAM,SAAS,MAAM,OAAO;AAC5B,iBAAO,EAAE,GAAG,gBAAgB,GAAG,OAAO;AAAA,QACxC,SAAS,OAAO;AACd,cAAK,MAAgC,SAAS,UAAU;AACtD,mBAAO;AAAA,UACT;AACA,gBAAM;AAAA,QACR;AAAA,MACF;AAAA,MAEA,aAAa,KAAK,QAAkC;AAClD,cAAM,MAAM,YAAY,EAAE,WAAW,KAAK,CAAC;AAC3C,cAAM,UAAU,UAAU,MAAM;AAChC,cAAM,UAAU,aAAa,SAAS,EAAE,MAAM,IAAM,CAAC;AAAA,MACvD;AAAA,MAEA,aAAa,SACX,MACA,aACe;AACf,cAAM,SAAS,MAAM,KAAK,KAAK;AAC/B,eAAO,OAAO,IAAI,IAAI;AAEtB,YAAI,CAAC,OAAO,eAAe;AACzB,iBAAO,gBAAgB;AAAA,QACzB;AAEA,cAAM,KAAK,KAAK,MAAM;AAAA,MACxB;AAAA,MAEA,aAAa,SAAS,MAAqC;AACzD,cAAM,SAAS,MAAM,KAAK,KAAK;AAC/B,cAAM,YAAY,QAAQ,OAAO;AAEjC,YAAI,CAAC,WAAW;AACd,gBAAM,IAAI,MAAM,yDAAyD;AAAA,QAC3E;AAEA,cAAM,QAAQ,OAAO,OAAO,SAAS;AACrC,YAAI,CAAC,OAAO;AACV,gBAAM,IAAI,MAAM,UAAU,SAAS,8BAA8B;AAAA,QACnE;AAEA,eAAO;AAAA,MACT;AAAA,MAEA,aAAa,aACX,aACA,SACkB;AAClB,YAAI;AACF,gBAAM,WAAW,MAAM,MAAM,GAAG,OAAO,iBAAiB,YAAY,EAAE,WAAW;AAAA,YAC/E,SAAS;AAAA,cACP,eAAe,UAAU,YAAY,OAAO;AAAA,YAC9C;AAAA,UACF,CAAC;AAED,iBAAO,SAAS;AAAA,QAClB,QAAQ;AACN,iBAAO;AAAA,QACT;AAAA,MACF;AAAA,MAEA,OAAO,gBAAwB;AAC7B,eAAO;AAAA,MACT;AAAA,IACF;AAAA;AAAA;;;ACrFA,OAAOA,YAAW;AAEX,SAAS,aAAmB;AACjC,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,UAAQ,IAAIA,OAAM,KAAK,0BAA0B,CAAC;AAClD,UAAQ,IAAIA,OAAM,KAAK,mLAAkC,CAAC;AAC1D,UAAQ,IAAI;AACd;AAbA;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACAA;AAAA;AAAA;AAAA;AAAA,OAAOC,YAAW;AAIlB,eAAsB,YAA2B;AAC/C,MAAI;AAEF,UAAM,SAAS,MAAM,cAAc,KAAK;AAGxC,QAAI,CAAC,OAAO,iBAAiB,CAAC,OAAO,OAAO,OAAO,aAAa,GAAG;AAEjE,iBAAW;AACX,cAAQ,IAAIA,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;AACX,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;AA9BA;AAAA;AAAA;AAAA;AACA;AACA;AAAA;AAAA;;;ACFA;AAAA,SAAS,WAAAC,gBAAe;AACxB,OAAOC,YAAW;;;ACDlB;AAEA;AAFA,SAAS,eAAe;AACxB,OAAOC,YAAW;;;ACDlB;AAAA,SAAS,oBAAoB;AAC7B,OAAO,SAAuB;AAC9B,OAAO,WAAW;AAGX,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,MAAM,MAAM,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,MAAM,MAAM,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;AACrB,cAAQ,OAAO,MAAM,IAAI;AAAA,IAC3B;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,MAAM,MAAM,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,QACjB,MAAM,MAAM,GAAG,QAAQ,IAAI,QAAQ,IAAI,MAAM,KAAK,IAAI,OAAO,GAAG,CAAC,EAAE;AAAA,MACrE;AACA,WAAK,gBAAgB;AAAA,IACvB;AAGA,QAAI,CAAC,KAAK,YAAY;AACpB,WAAK,aAAa;AAClB,cAAQ,OAAO,MAAM,MAAM,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,OAAO,MAAM,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,IAAI,MAAM,KAAK,wCAAiC,CAAC;AACzD,gBAAQ,QAAQ,CAAC,WAAW;AAC1B,kBAAQ,IAAI,MAAM,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,IAAI,MAAM,KAAK,0BAAmB,CAAC;AAC3C,aAAK,YAAY,QAAQ,CAAC,YAAY,MAAM;AAC1C,kBAAQ,IAAI,MAAM,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,MAAM,MAAM,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,IAAI,MAAM,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;;;ADlSO,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;;;AEjFA;AAGA;AAHA,SAAS,WAAAC,gBAAe;AACxB,OAAOC,YAAW;AAClB,YAAY,cAAc;;;ACF1B;AAAA,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;AAKA;AALA,SAAS,WAAAE,gBAAe;AACxB,OAAOC,YAAW;AAClB,OAAOC,UAAS;AAChB,YAAYC,eAAc;AAC1B,SAAS,gBAAgB;AAGzB;AAEO,SAAS,2BAAoC;AAClD,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;AAEX,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;AAElC,YAAM,KAAc,0BAAgB;AAAA,QAClC,OAAO,QAAQ;AAAA,QACf,QAAQ,QAAQ;AAAA,QAChB,QAAQA,OAAM,MAAM,IAAI;AAAA,MAC1B,CAAC;AAED,SAAG,OAAO;AAEV,SAAG,GAAG,QAAQ,OAAO,UAAU;AAC7B,cAAM,UAAU,MAAM,KAAK;AAG3B,YAAI,QAAQ,WAAW,GAAG,GAAG;AAC3B,gBAAM,CAAC,SAAS,GAAG,IAAI,IAAI,QAAQ,MAAM,CAAC,EAAE,MAAM,GAAG;AAErD,kBAAQ,QAAQ,YAAY,GAAG;AAAA,YAC7B,KAAK;AAAA,YACL,KAAK;AACH,sBAAQ,IAAIA,OAAM,KAAK,wBAAiB,CAAC;AACzC,iBAAG,MAAM;AACT,sBAAQ,KAAK,CAAC;AACd;AAAA,YAEF,KAAK;AACH,sBAAQ,IAAIA,OAAM,KAAK,mCAA4B,CAAC;AACpD,sBAAQ,IAAIA,OAAM,KAAK,oCAAoC,CAAC;AAC5D,sBAAQ,IAAIA,OAAM,KAAK,uCAAuC,CAAC;AAC/D,sBAAQ,IAAIA,OAAM,KAAK,iDAAiD,CAAC;AACzE,sBAAQ,IAAIA,OAAM,KAAK,kDAAkD,CAAC;AAC1E,sBAAQ,IAAIA,OAAM,KAAK,+CAA+C,CAAC;AACvE,iBAAG,OAAO;AACV;AAAA,YAEF,KAAK;AACH,sBAAQ,MAAM;AACd,yBAAW;AACX,sBAAQ,IAAIA,OAAM,KAAK,KAAK,2BAAoB,MAAM,IAAI,EAAE,CAAC;AAC7D,sBAAQ,IAAIA,OAAM,KAAK,+CAA+C,CAAC;AACvE,iBAAG,OAAO;AACV;AAAA,YAEF,KAAK;AACH,sBAAQ,IAAIA,OAAM,KAAK,0CAAgC,CAAC;AACxD,sBAAQ,IAAIA,OAAM,KAAK,YAAY,MAAM,IAAI,KAAK,MAAM,EAAE,GAAG,CAAC;AAC9D,sBAAQ,IAAIA,OAAM,KAAK,eAAe,OAAO,QAAQ,EAAE,CAAC;AACxD,sBAAQ,IAAIA,OAAM,KAAK,sBAAsB,cAAc;AAAA,CAAI,CAAC;AAChE,iBAAG,OAAO;AACV;AAAA,YAEF,KAAK;AACH,kBAAI,CAAC,KAAK,CAAC,GAAG;AACZ,wBAAQ,IAAIA,OAAM,IAAI,uCAAkC,CAAC;AACzD,wBAAQ,IAAIA,OAAM,OAAO,mBAAmB,CAAC;AAC7C,uBAAO,KAAK,OAAO,MAAM,EAAE,QAAQ,UAAQ;AACzC,0BAAQ,IAAIA,OAAM,KAAK,OAAO,IAAI,EAAE,CAAC;AAAA,gBACvC,CAAC;AACD,wBAAQ,IAAI,EAAE;AACd,mBAAG,OAAO;AACV;AAAA,cACF;AAEA,sBAAQ,IAAIA,OAAM,OAAO,uDAA6C,CAAC;AACvE,iBAAG,OAAO;AACV;AAAA,YAEF;AACE,sBAAQ,IAAIA,OAAM,IAAI;AAAA,2BAAyB,OAAO,EAAE,CAAC;AACzD,sBAAQ,IAAIA,OAAM,OAAO,qCAAqC,CAAC;AAC/D,iBAAG,OAAO;AACV;AAAA,UACJ;AAAA,QACF;AAGA,YAAI,YAAY,UAAU,YAAY,QAAQ;AAC5C,kBAAQ,IAAIA,OAAM,KAAK,wBAAiB,CAAC;AACzC,aAAG,MAAM;AACT,kBAAQ,KAAK,CAAC;AAAA,QAChB;AAEA,YAAI,CAAC,SAAS;AACZ,aAAG,OAAO;AACV;AAAA,QACF;AAEA,YAAI;AACF;AAGA,kBAAQ,IAAI,EAAE;AACd,gBAAM,eAAeC,KAAI;AAAA,YACvB,MAAMD,OAAM,KAAK,aAAa;AAAA,YAC9B,OAAO;AAAA,UACT,CAAC,EAAE,MAAM;AAET,gBAAM,WAAW,MAAM;AAAA,YACrB,GAAG,OAAO,QAAQ,iBAAiB,MAAM,EAAE;AAAA,YAC3C;AAAA,cACE,QAAQ;AAAA,cACR,SAAS;AAAA,gBACP,gBAAgB;AAAA,gBAChB,eAAe,UAAU,MAAM,OAAO;AAAA,cACxC;AAAA,cACA,MAAM,KAAK,UAAU;AAAA,gBACnB,OAAO;AAAA,gBACP,WAAW;AAAA,gBACX,eAAe;AAAA,gBACf;AAAA,cACF,CAAC;AAAA,YACH;AAAA,UACF;AAGA,uBAAa,KAAK;AAElB,cAAI,CAAC,SAAS,IAAI;AAChB,gBAAI,eAAe,mBAAmB,SAAS,MAAM;AACrD,gBAAI;AACF,oBAAM,YAAY,MAAM,SAAS,KAAK;AACtC,6BAAe,UAAU,SAAS,UAAU,WAAW;AAAA,YACzD,QAAQ;AACN,oBAAM,YAAY,MAAM,SAAS,KAAK;AACtC,6BAAe,aAAa;AAAA,YAC9B;AAEA,oBAAQ,MAAMA,OAAM,IAAI,iBAAY,GAAG,YAAY;AAGnD,gBAAI,SAAS,WAAW,KAAK;AAC3B,sBAAQ,IAAIA,OAAM,OAAO,0CAA0C,CAAC;AAAA,YACtE,WAAW,SAAS,WAAW,KAAK;AAClC,sBAAQ,IAAIA,OAAM,OAAO,mDAAmD,CAAC;AAAA,YAC/E,WAAW,SAAS,WAAW,KAAK;AAClC,sBAAQ,IAAIA,OAAM,OAAO,8CAA8C,CAAC;AAAA,YAC1E;AAEA,oBAAQ,IAAI,EAAE;AACd,eAAG,OAAO;AACV;AAAA,UACF;AAEA,gBAAM,UAAU,IAAI,cAAc;AAClC,gBAAM,QAAQ,cAAc,QAAQ;AAGpC,gBAAM,UAAU,QAAQ,kBAAkB;AAC1C,4BAAkB,QAAQ;AAE1B,kBAAQ,IAAI,IAAI;AAChB,aAAG,OAAO;AAAA,QACZ,SAAS,OAAO;AACd,cAAI,UAAU;AACd,cAAI,OAAO;AAEX,cAAI,iBAAiB,OAAO;AAC1B,sBAAU,MAAM;AAGhB,gBAAI,QAAQ,SAAS,cAAc,GAAG;AACpC,qBAAO;AAAA,YACT,WAAW,QAAQ,SAAS,WAAW,GAAG;AACxC,qBAAO;AAAA,YACT,WAAW,QAAQ,SAAS,WAAW,GAAG;AACxC,qBAAO;AAAA,YACT,WAAW,QAAQ,SAAS,aAAa,KAAK,QAAQ,SAAS,KAAK,GAAG;AACrE,qBAAO;AAAA,YACT,WAAW,QAAQ,SAAS,cAAc,GAAG;AAC3C,qBAAO;AAAA,YACT;AAAA,UACF;AAEA,kBAAQ,MAAMA,OAAM,IAAI,iBAAY,GAAG,OAAO;AAC9C,cAAI,MAAM;AACR,oBAAQ,IAAIA,OAAM,OAAO,WAAW,IAAI,EAAE,CAAC;AAAA,UAC7C;AACA,kBAAQ,IAAI,EAAE;AACd,aAAG,OAAO;AAAA,QACZ;AAAA,MACF,CAAC;AAED,SAAG,GAAG,SAAS,MAAM;AACnB,cAAM,kBAAkB,KAAK,IAAI,IAAI;AACrC,cAAM,kBAAkB,KAAK,MAAM,kBAAkB,GAAK;AAC1D,cAAM,kBAAkB,KAAK,MAAO,kBAAkB,MAAS,GAAI;AAEnE,gBAAQ,IAAI,EAAE;AACd,gBAAQ,IAAIA,OAAM,KAAK,SAAI,OAAO,EAAE,CAAC,CAAC;AACtC,gBAAQ,IAAIA,OAAM,KAAK,KAAK,6BAAsB,CAAC;AACnD,gBAAQ,IAAIA,OAAM,KAAK,eAAe,YAAY,EAAE,CAAC;AACrD,gBAAQ,IAAIA,OAAM,KAAK,iBAAiB,cAAc,EAAE,CAAC;AACzD,gBAAQ,IAAIA,OAAM,KAAK,eAAe,eAAe,KAAK,eAAe,GAAG,CAAC;AAC7E,gBAAQ,IAAIA,OAAM,KAAK,sBAAsB,cAAc,EAAE,CAAC;AAE9D,YAAI,eAAe,GAAG;AACpB,kBAAQ,IAAIA,OAAM,KAAK,uCAAgC,CAAC;AACxD,kBAAQ,IAAIA,OAAM,OAAO,wBAAwB,eAAe,MAAM,GAAG,CAAC,CAAC,EAAE,CAAC;AAAA,QAChF;AAEA,gBAAQ,IAAIA,OAAM,KAAK,WAAM,OAAO,EAAE,CAAC,CAAC;AACxC,gBAAQ,IAAIA,OAAM,KAAK,wBAAiB,CAAC;AACzC,gBAAQ,KAAK,CAAC;AAAA,MAChB,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;;;ALvPA,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,CAAC;AAE7C,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,IAAI,CAAC,QAAQ,KAAK,MAAM,CAAC,EAAE,QAAQ;AAEjC,wEAAgC,KAAK,OAAO,EAAE,WAAAC,WAAU,MAAM;AAC5D,UAAMA,WAAU;AAEhB,YAAQ,KAAK,KAAK,aAAa;AAC/B,YAAQ,MAAM,QAAQ,IAAI;AAAA,EAC5B,CAAC;AACH,OAAO;AACL,UAAQ,MAAM,QAAQ,IAAI;AAC5B;","names":["chalk","chalk","Command","chalk","chalk","chalk","message","Command","chalk","chalk","Command","chalk","config","Command","chalk","ora","readline","Command","chalk","ora","Command","chalk","autoStart"]}
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/utils/markdown.ts","../src/commands/config.ts","../src/auth/auth-manager.ts","../src/commands/interactive.ts"],"sourcesContent":["// Shim globals in esm bundle\nimport path from 'node:path'\nimport { fileURLToPath } from 'node:url'\n\nconst getFilename = () => fileURLToPath(import.meta.url)\nconst getDirname = () => path.dirname(getFilename())\n\nexport const __dirname = /* @__PURE__ */ getDirname()\nexport const __filename = /* @__PURE__ */ getFilename()\n","import { readFile, writeFile, mkdir } from 'fs/promises';\nimport { homedir } from 'os';\nimport { join } from 'path';\nimport { parse, stringify } from 'yaml';\nimport type { CLIConfig, AgentConfig } from '../types.js';\n\nconst CONFIG_DIR = join(homedir(), '.horneross');\nconst CONFIG_PATH = join(CONFIG_DIR, 'config.yaml');\n\nconst DEFAULT_CONFIG: CLIConfig = {\n default_agent: '',\n base_url: 'http://localhost:3000',\n agents: {},\n};\n\nexport class ConfigManager {\n static async load(): Promise<CLIConfig> {\n try {\n const content = await readFile(CONFIG_PATH, 'utf-8');\n const config = parse(content) as CLIConfig;\n return { ...DEFAULT_CONFIG, ...config };\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code === 'ENOENT') {\n return DEFAULT_CONFIG;\n }\n throw error;\n }\n }\n\n static async save(config: CLIConfig): Promise<void> {\n await mkdir(CONFIG_DIR, { recursive: true });\n const content = stringify(config);\n await writeFile(CONFIG_PATH, content, { mode: 0o600 });\n }\n\n static async addAgent(\n name: string,\n agentConfig: AgentConfig\n ): Promise<void> {\n const config = await this.load();\n config.agents[name] = agentConfig;\n\n if (!config.default_agent) {\n config.default_agent = name;\n }\n\n await this.save(config);\n }\n\n static async getAgent(name?: string): Promise<AgentConfig> {\n const config = await this.load();\n const agentName = name || config.default_agent;\n\n if (!agentName) {\n throw new Error('No default agent configured. Run: horneross config init');\n }\n\n const agent = config.agents[agentName];\n if (!agent) {\n throw new Error(`Agent \"${agentName}\" not found in configuration`);\n }\n\n return agent;\n }\n\n static async validateAuth(\n agentConfig: AgentConfig,\n baseUrl: string\n ): Promise<boolean> {\n try {\n const response = await fetch(`${baseUrl}/api/v2/agent/${agentConfig.id}/config`, {\n headers: {\n Authorization: `Bearer ${agentConfig.api_key}`,\n },\n });\n\n return response.ok;\n } catch {\n return false;\n }\n }\n\n static getConfigPath(): string {\n return CONFIG_PATH;\n }\n}\n","import chalk from 'chalk';\n\nexport function showBanner(): void {\n console.log();\n console.log(chalk.hex('#FF8800').bold(`\n ╦ ╦╔═╗╦═╗╔╗╔╔═╗╦═╗╔═╗╔═╗╔═╗\n ╠═╣║ ║╠╦╝║║║║╣ ╠╦╝║ ║╚═╗╚═╗\n ╩ ╩╚═╝╩╚═╝╚╝╚═╝╩╚═╚═╝╚═╝╚═╝\n`));\n console.log(chalk.gray.bold(' Terminal AI Agent Interface'));\n console.log(chalk.gray(' https://horneross.com'));\n console.log(chalk.gray(' ─────────────────────────────'));\n console.log();\n}\n","import chalk from 'chalk';\nimport { ConfigManager } from '../config/config-manager.js';\nimport { showBanner } from './banner.js';\n\nexport async function autoStart(): Promise<void> {\n try {\n // Try to load existing configuration\n const config = await ConfigManager.load();\n\n // Check if there's a default agent configured\n if (!config.default_agent || !config.agents[config.default_agent]) {\n // No configuration found - show welcome and exit\n showBanner();\n console.log(chalk.cyan('👋 Welcome to Horneross CLI!\\n'));\n console.log(chalk.yellow('No configuration found. Please run:\\n'));\n console.log(chalk.white(' horneross config init\\n'));\n process.exit(0);\n }\n\n // Configuration exists - return to let interactive mode run\n // (This function is called from index.ts which will then parse 'interactive' command)\n\n } catch (error) {\n // If config loading fails, assume no config exists\n showBanner();\n console.log(chalk.cyan('👋 Welcome to Horneross CLI!\\n'));\n console.log(chalk.yellow('No configuration found. Please run:\\n'));\n console.log(chalk.white(' horneross config init\\n'));\n process.exit(0);\n }\n}\n","import { Command } from 'commander';\nimport chalk from 'chalk';\nimport { createChatCommand } from './commands/chat.js';\nimport { createConfigCommand } from './commands/config.js';\nimport { createInteractiveCommand } from './commands/interactive.js';\n\nconst program = new Command();\n\nprogram\n .name('horneross')\n .description('Terminal interface for Horneross AI agents')\n .version('0.1.0');\n\nprogram.addCommand(createChatCommand());\nprogram.addCommand(createConfigCommand());\nprogram.addCommand(createInteractiveCommand());\n\nprogram.on('command:*', () => {\n console.error(chalk.red('\\n✖ Invalid command'));\n console.log(chalk.yellow('\\nAvailable commands:'));\n console.log(chalk.gray(' horneross chat <message> Send a one-shot message'));\n console.log(chalk.gray(' horneross interactive Start interactive session'));\n console.log(chalk.gray(' horneross config init Initialize configuration'));\n console.log(chalk.gray(' horneross config show Show current configuration'));\n console.log(chalk.gray('\\nRun \"horneross --help\" for more details\\n'));\n process.exit(1);\n});\n\n// Auto-start interactive mode when no command is provided\nif (!process.argv.slice(2).length) {\n // Import dynamically to avoid circular dependencies\n import('./utils/auto-start.js').then(async ({ autoStart }) => {\n await autoStart();\n // If autoStart didn't exit (config is valid), start interactive mode\n process.argv.push('interactive');\n await program.parseAsync(process.argv);\n });\n} else {\n await program.parseAsync(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 { renderMarkdown } from '../utils/markdown.js';\nimport type { SSEEvent, StreamMetadata } from '../types.js';\n\nexport class StreamAdapter {\n private activeSpinner: Ora | null = null;\n private toolCallStack: Map<string, { name: string; startTime: number }> =\n new Map();\n private metadata: StreamMetadata | null = null;\n private isThinking = false;\n private hasOutputText = false;\n private toolsExecuted: Array<{ name: string; duration: number }> = [];\n private sessionStartTime = Date.now();\n\n async processStream(response: Response): Promise<StreamMetadata | null> {\n if (!response.body) {\n throw new Error('Response body is null');\n }\n\n // Show initial thinking indicator\n this.isThinking = true;\n process.stdout.write(chalk.gray('🤔 Thinking...\\n'));\n\n const reader = response.body.getReader();\n const decoder = new TextDecoder();\n\n return new Promise((resolve, reject) => {\n const parser = createParser((event) => {\n if (event.type === 'event') {\n // Ignore [DONE] marker\n if (event.data === '[DONE]') {\n return;\n }\n\n try {\n const data = JSON.parse(event.data);\n this.handleEvent(data);\n } catch (error) {\n // Silently ignore parse errors (they happen with [DONE] and other markers)\n if (event.data !== '[DONE]') {\n console.error(chalk.red('Failed to parse SSE event:'), error);\n }\n }\n }\n });\n\n const processChunk = async (): Promise<void> => {\n try {\n const { done, value } = await reader.read();\n\n if (done) {\n this.cleanup();\n resolve(this.metadata);\n return;\n }\n\n const chunk = decoder.decode(value, { stream: true });\n parser.feed(chunk);\n\n await processChunk();\n } catch (error) {\n this.cleanup();\n reject(error);\n }\n };\n\n processChunk();\n });\n }\n\n private handleEvent(event: SSEEvent): void {\n switch (event.type) {\n case 'text-delta':\n this.handleTextDelta(event);\n break;\n case 'tool-call':\n this.handleToolCall(event);\n break;\n case 'tool-result':\n this.handleToolResult(event);\n break;\n case 'data-message-ids':\n this.handleMetadata(event);\n break;\n case 'data-prefetched_sources':\n this.handleSources(event);\n break;\n case 'data-suggestions':\n this.handleSuggestions(event);\n break;\n case 'data-tool-output':\n this.handleToolOutput(event);\n break;\n case 'error':\n this.handleError(event);\n break;\n }\n }\n\n private handleTextDelta(event: SSEEvent): void {\n // Stop any active spinner when text starts coming\n if (this.activeSpinner) {\n this.activeSpinner.stop();\n this.activeSpinner = null;\n }\n\n // Clear thinking indicator on first text output\n if (this.isThinking && !this.hasOutputText) {\n // Move cursor up and clear the \"Thinking...\" line\n process.stdout.write('\\x1b[1A\\x1b[2K');\n this.isThinking = false;\n }\n\n const text = event.delta || event.content;\n if (text) {\n this.hasOutputText = true;\n // Render markdown formatting (bold, italic, code)\n const formatted = renderMarkdown(text);\n process.stdout.write(formatted);\n }\n }\n\n private handleToolCall(event: SSEEvent): void {\n const { toolName, args } = event;\n const toolCallId = `${toolName}-${Date.now()}`;\n\n this.toolCallStack.set(toolCallId, {\n name: toolName || 'unknown',\n startTime: Date.now(),\n });\n\n // Stop previous spinner if any\n if (this.activeSpinner) {\n this.activeSpinner.stop();\n }\n\n // Clear thinking indicator if still showing\n if (this.isThinking) {\n process.stdout.write('\\x1b[1A\\x1b[2K');\n this.isThinking = false;\n }\n\n // Add newline if this is the first tool after text output\n if (this.hasOutputText) {\n process.stdout.write('\\n');\n }\n\n const argsPreview = this.formatArgs(args);\n const toolIcon = this.getToolIcon(toolName);\n this.activeSpinner = ora({\n text: chalk.cyan(`${toolIcon} ${toolName}${argsPreview}`),\n }).start();\n }\n\n private handleToolResult(event: SSEEvent): void {\n if (this.activeSpinner) {\n const { toolName } = event;\n const elapsedMs = this.getElapsedTimeMs();\n const elapsed = this.formatDuration(elapsedMs);\n const toolIcon = this.getToolIcon(toolName);\n\n // Track tool execution\n if (toolName) {\n this.toolsExecuted.push({ name: toolName, duration: elapsedMs });\n }\n\n this.activeSpinner.succeed(\n chalk.green(`${toolIcon} ${toolName} ${chalk.gray(`(${elapsed})`)}`)\n );\n this.activeSpinner = null;\n }\n\n // Show thinking indicator after tool completes\n if (!this.isThinking) {\n this.isThinking = true;\n process.stdout.write(chalk.gray('🤔 Thinking...\\n'));\n }\n }\n\n private handleToolOutput(event: SSEEvent): void {\n // Handle progress updates from tools\n if (event.data && typeof event.data === 'object') {\n const data = event.data as { status?: string; message?: string };\n if (this.activeSpinner && data.message) {\n this.activeSpinner.text = chalk.cyan(data.message);\n }\n }\n }\n\n private handleSources(event: SSEEvent): void {\n if (event.data && Array.isArray(event.data)) {\n const sources = event.data as Array<{ datastoreName: string; results: unknown[] }>;\n if (sources.length > 0) {\n console.log(chalk.blue('\\n📚 Consulting knowledge base:'));\n sources.forEach((source) => {\n console.log(chalk.gray(` • ${source.datastoreName} (${source.results.length} results)`));\n });\n console.log('');\n }\n }\n }\n\n private handleSuggestions(event: SSEEvent): void {\n if (event.data && typeof event.data === 'object') {\n const data = event.data as { suggestions?: string[] };\n if (data.suggestions && data.suggestions.length > 0) {\n console.log(chalk.blue('\\n💡 Suggestions:'));\n data.suggestions.forEach((suggestion, i) => {\n console.log(chalk.gray(` ${i + 1}. ${suggestion}`));\n });\n }\n }\n }\n\n private getToolIcon(toolName?: string): string {\n const icons: Record<string, string> = {\n web_search: '🔍',\n browser: '🌐',\n pdf_generator: '📄',\n pdf_report: '📊',\n sandbox_shell: '💻',\n sandbox_file_write: '📝',\n sandbox_file_read: '📖',\n http: '🌐',\n think: '🤔',\n analyze: '🔬',\n };\n return icons[toolName || ''] || '🔧';\n }\n\n private handleMetadata(event: SSEEvent): void {\n if (event.data && typeof event.data === 'object' && 'conversationId' in event.data) {\n this.metadata = event.data as StreamMetadata;\n }\n }\n\n private handleError(event: SSEEvent): void {\n this.cleanup();\n console.error(chalk.red('\\n✖ Error:'), event.content || 'Unknown error');\n }\n\n private formatArgs(args: unknown): string {\n if (!args || typeof args !== 'object') {\n return '';\n }\n\n const entries = Object.entries(args as Record<string, unknown>);\n if (entries.length === 0) {\n return '';\n }\n\n const preview = entries\n .slice(0, 2)\n .map(([key, value]) => {\n const valueStr = typeof value === 'string' ? value : JSON.stringify(value);\n const truncated = valueStr.length > 30 ? valueStr.slice(0, 30) + '...' : valueStr;\n return `${key}: ${truncated}`;\n })\n .join(', ');\n\n return ` ${chalk.gray(`(${preview})`)}`;\n }\n\n private getElapsedTimeMs(): number {\n const lastTool = Array.from(this.toolCallStack.values()).pop();\n if (!lastTool) {\n return 0;\n }\n return Date.now() - lastTool.startTime;\n }\n\n private formatDuration(ms: number): string {\n if (ms < 1000) {\n return `${ms}ms`;\n }\n return `${(ms / 1000).toFixed(1)}s`;\n }\n\n getSessionSummary(): {\n duration: number;\n toolsUsed: number;\n toolsList: Array<{ name: string; duration: number }>;\n } {\n return {\n duration: Date.now() - this.sessionStartTime,\n toolsUsed: this.toolsExecuted.length,\n toolsList: this.toolsExecuted,\n };\n }\n\n private cleanup(): void {\n if (this.activeSpinner) {\n this.activeSpinner.stop();\n this.activeSpinner = null;\n }\n this.toolCallStack.clear();\n }\n}\n","import chalk from 'chalk';\n\n/**\n * Convert basic markdown to ANSI codes for terminal display\n * Supports: **bold**, *italic*, `code`\n */\nexport function renderMarkdown(text: string): string {\n let result = text;\n\n // Bold: **text** -> chalk.bold()\n result = result.replace(/\\*\\*([^*]+)\\*\\*/g, (_, content) => chalk.bold(content));\n\n // Italic: *text* -> chalk.italic()\n result = result.replace(/\\*([^*]+)\\*/g, (_, content) => chalk.italic(content));\n\n // Code: `text` -> chalk.cyan()\n result = result.replace(/`([^`]+)`/g, (_, content) => chalk.cyan(content));\n\n return result;\n}\n","import { Command } from 'commander';\nimport chalk from 'chalk';\nimport * as readline from 'readline/promises';\nimport { ConfigManager } from '../config/config-manager.js';\nimport { AuthManager } from '../auth/auth-manager.js';\n\nexport function createConfigCommand(): Command {\n const config = new Command('config');\n\n config\n .command('init')\n .description('Initialize Horneross CLI configuration')\n .action(async () => {\n console.log(chalk.bold.cyan('\\n🤖 Horneross CLI Setup\\n'));\n\n const rl = readline.createInterface({\n input: process.stdin,\n output: process.stdout,\n });\n\n try {\n const agentName = await rl.question(\n chalk.yellow('Agent name (e.g., \"adam\"): ')\n );\n\n if (!agentName.trim()) {\n console.error(chalk.red('\\n✖ Agent name is required'));\n process.exit(1);\n }\n\n const agentId = await rl.question(\n chalk.yellow('Agent ID: ')\n );\n\n if (!agentId.trim()) {\n console.error(chalk.red('\\n✖ Agent ID is required'));\n process.exit(1);\n }\n\n const apiKey = await rl.question(\n chalk.yellow('API Key: ')\n );\n\n if (!apiKey.trim()) {\n console.error(chalk.red('\\n✖ API Key is required'));\n process.exit(1);\n }\n\n const baseUrl = await rl.question(\n chalk.yellow('Base URL [http://localhost:3000]: ')\n );\n\n const finalBaseUrl = baseUrl.trim() || 'http://localhost:3000';\n\n rl.close();\n\n const agentConfig = {\n id: agentId.trim(),\n api_key: apiKey.trim(),\n name: agentName.trim(),\n };\n\n console.log(chalk.gray('\\n⏳ Validating connection...'));\n\n const { valid, error } = await AuthManager.validateConnection(\n agentConfig,\n finalBaseUrl\n );\n\n if (!valid) {\n AuthManager.displayAuthError(error || 'Unknown error');\n process.exit(1);\n }\n\n await ConfigManager.addAgent(agentName.trim(), agentConfig);\n\n const currentConfig = await ConfigManager.load();\n currentConfig.base_url = finalBaseUrl;\n await ConfigManager.save(currentConfig);\n\n console.log(chalk.green('\\n✓ Configuration saved successfully!'));\n console.log(chalk.gray(`\\nConfig file: ${ConfigManager.getConfigPath()}`));\n console.log(chalk.gray(`Default agent: ${agentName.trim()}`));\n console.log(chalk.cyan('\\nYou can now run: horneross chat \"Hello\"\\n'));\n } catch (error) {\n rl.close();\n console.error(chalk.red('\\n✖ Setup failed:'), error);\n process.exit(1);\n }\n });\n\n config\n .command('show')\n .description('Show current configuration')\n .action(async () => {\n try {\n const config = await ConfigManager.load();\n\n console.log(chalk.bold.cyan('\\n🔧 Current Configuration\\n'));\n console.log(chalk.yellow('Base URL:'), config.base_url);\n console.log(chalk.yellow('Default Agent:'), config.default_agent || chalk.gray('(not set)'));\n console.log(chalk.yellow('\\nConfigured Agents:'));\n\n if (Object.keys(config.agents).length === 0) {\n console.log(chalk.gray(' No agents configured'));\n } else {\n for (const [name, agent] of Object.entries(config.agents)) {\n const isDefault = name === config.default_agent;\n const marker = isDefault ? chalk.green('✓') : ' ';\n console.log(` ${marker} ${chalk.cyan(name)} (${agent.id})`);\n }\n }\n\n console.log(chalk.gray(`\\nConfig file: ${ConfigManager.getConfigPath()}\\n`));\n } catch (error) {\n console.error(chalk.red('Failed to load configuration:'), error);\n process.exit(1);\n }\n });\n\n return config;\n}\n","import chalk from 'chalk';\nimport type { AgentConfig } from '../types.js';\n\nexport class AuthManager {\n static async validateConnection(\n agentConfig: AgentConfig,\n baseUrl: string\n ): Promise<{ valid: boolean; error?: string }> {\n try {\n const response = await fetch(`${baseUrl}/api/v2/agent/${agentConfig.id}/config`, {\n headers: {\n Authorization: `Bearer ${agentConfig.api_key}`,\n },\n });\n\n if (response.ok) {\n return { valid: true };\n }\n\n if (response.status === 401) {\n return { valid: false, error: 'Invalid API key' };\n }\n\n if (response.status === 404) {\n return { valid: false, error: 'Agent not found' };\n }\n\n return { valid: false, error: `HTTP ${response.status}: ${response.statusText}` };\n } catch (error) {\n const message = error instanceof Error ? error.message : 'Unknown error';\n return { valid: false, error: `Connection failed: ${message}` };\n }\n }\n\n static displayAuthError(error: string): void {\n console.error(chalk.red('\\n✖ Authentication failed:'), error);\n console.error(chalk.yellow('\\nTroubleshooting:'));\n console.error(chalk.gray(' 1. Check your API key is correct'));\n console.error(chalk.gray(' 2. Verify the agent ID exists'));\n console.error(chalk.gray(' 3. Ensure the base URL is accessible'));\n console.error(chalk.gray('\\nRun: horneross config init'));\n }\n}\n","import { Command } from 'commander';\nimport chalk from 'chalk';\nimport ora from 'ora';\nimport * as readline from 'readline';\nimport { createId } from '@paralleldrive/cuid2';\nimport { ConfigManager } from '../config/config-manager.js';\nimport { StreamAdapter } from '../adapters/stream-adapter.js';\nimport { showBanner } from '../utils/banner.js';\n\nexport function createInteractiveCommand(): Command {\n const interactive = new Command('interactive');\n\n interactive\n .description('Start an interactive chat session')\n .option('-a, --agent <name>', 'Agent to use (defaults to configured default)')\n .action(async (options: { agent?: string }) => {\n try {\n const config = await ConfigManager.load();\n const agentName = options.agent || config.default_agent;\n\n if (!agentName) {\n console.error(chalk.red('\\n✖ No default agent configured'));\n console.error(chalk.yellow('Run: horneross config init\\n'));\n process.exit(1);\n }\n\n const agent = config.agents[agentName];\n if (!agent) {\n console.error(chalk.red(`\\n✖ Agent \"${agentName}\" not found`));\n process.exit(1);\n }\n\n // Show banner\n showBanner();\n\n console.log(chalk.bold.cyan(`🤖 Chatting with ${agent.name}`));\n console.log(chalk.gray('Commands: /help /exit /clear /agent /config\\n'));\n\n const conversationId = createId();\n let messageCount = 0;\n let totalToolsUsed = 0;\n const sessionStartTime = Date.now();\n\n 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 console.log(chalk.gray('\\nGoodbye! 👋\\n'));\n rl.close();\n process.exit(0);\n break;\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 console.log(chalk.gray('\\nGoodbye! 👋\\n'));\n rl.close();\n process.exit(0);\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 process.exit(0);\n });\n } catch (error) {\n const message = error instanceof Error ? error.message : 'Unknown error';\n console.error(chalk.red('\\n✖ Interactive mode failed:'), message);\n process.exit(1);\n }\n });\n\n return interactive;\n}\n"],"mappings":"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","names":["chalk","chalk","Command","chalk","chalk","chalk","chalk","chalk","message","Command","chalk","chalk","Command","chalk","config","Command","chalk","ora","readline","Command","chalk","ora","Command","chalk","autoStart"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@horneross/cli",
3
- "version": "0.4.2",
3
+ "version": "0.5.0",
4
4
  "description": "Terminal interface for Horneross AI agents",
5
5
  "type": "module",
6
6
  "bin": {