helix-assistant-cli 0.0.0-stage → 0.2.4

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.
Files changed (51) hide show
  1. package/bin/helix.js +3 -0
  2. package/dist/client/agent-client.d.ts +60 -0
  3. package/dist/client/agent-client.js +322 -0
  4. package/dist/client/agent-launcher.d.ts +30 -0
  5. package/dist/client/agent-launcher.js +339 -0
  6. package/dist/client/types.d.ts +88 -0
  7. package/dist/client/types.js +2 -0
  8. package/dist/commands/apikey.d.ts +3 -0
  9. package/dist/commands/apikey.js +123 -0
  10. package/dist/commands/browser.d.ts +2 -0
  11. package/dist/commands/browser.js +35 -0
  12. package/dist/commands/mcp.d.ts +3 -0
  13. package/dist/commands/mcp.js +102 -0
  14. package/dist/commands/mic.d.ts +2 -0
  15. package/dist/commands/mic.js +57 -0
  16. package/dist/commands/skills.d.ts +3 -0
  17. package/dist/commands/skills.js +105 -0
  18. package/dist/config/env.d.ts +6 -0
  19. package/dist/config/env.js +71 -0
  20. package/dist/index.d.ts +1 -0
  21. package/dist/index.js +193 -0
  22. package/dist/ui/autocomplete.d.ts +25 -0
  23. package/dist/ui/autocomplete.js +142 -0
  24. package/dist/ui/banner.d.ts +15 -0
  25. package/dist/ui/banner.js +84 -0
  26. package/dist/ui/chat.d.ts +1 -0
  27. package/dist/ui/chat.js +5 -0
  28. package/dist/ui/colors.d.ts +34 -0
  29. package/dist/ui/colors.js +69 -0
  30. package/dist/ui/repl.d.ts +31 -0
  31. package/dist/ui/repl.js +448 -0
  32. package/package.json +30 -3
  33. package/src/client/agent-client.ts +387 -0
  34. package/src/client/agent-launcher.ts +374 -0
  35. package/src/client/types.ts +95 -0
  36. package/src/commands/apikey.ts +129 -0
  37. package/src/commands/browser.ts +39 -0
  38. package/src/commands/mcp.ts +105 -0
  39. package/src/commands/mic.ts +57 -0
  40. package/src/commands/skills.ts +109 -0
  41. package/src/config/env.ts +63 -0
  42. package/src/index.ts +208 -0
  43. package/src/ui/autocomplete.ts +153 -0
  44. package/src/ui/banner.ts +85 -0
  45. package/src/ui/chat.ts +1 -0
  46. package/src/ui/colors.ts +70 -0
  47. package/src/ui/repl.ts +504 -0
  48. package/tests/cli.test.ts +187 -0
  49. package/tsconfig.json +19 -0
  50. package/tsconfig.test.json +7 -0
  51. package/README.md +0 -3
@@ -0,0 +1,142 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.Autocompleter = exports.SLASH_COMMANDS = void 0;
7
+ const chalk_1 = __importDefault(require("chalk"));
8
+ const colors_1 = require("./colors");
9
+ exports.SLASH_COMMANDS = [
10
+ { command: '/create-skill', description: 'Crear una nueva skill interactiva para HELIX' },
11
+ { command: '/skill', description: 'Listar o inspeccionar skills registradas', usage: '/skill [nombre]' },
12
+ { command: '/mcp', description: 'Listar servidores MCP y sus herramientas' },
13
+ { command: '/create-mcp', description: 'Registrar y configurar un nuevo servidor MCP' },
14
+ { command: '/browser', description: 'Ver estado del navegador web o abrir URLs', usage: '/browser [open <url>]' },
15
+ { command: '/config-apikey', description: 'Configurador interactivo de API Keys (OpenAI, Anthropic, Gemini, etc.)' },
16
+ { command: '/show-apikey', description: 'Ver estado y validez de las API Keys configuradas' },
17
+ { command: '/microphone', description: 'Ver o alternar estado del micrófono', usage: '/microphone [enable|disable]' },
18
+ { command: '/tasks', description: 'Ver tareas activas y recientes del agente' },
19
+ { command: '/models', description: 'Listar modelos disponibles de proveedores configurados' },
20
+ { command: '/status', description: 'Mostrar resumen del estado del sistema' },
21
+ { command: '/clear', description: 'Limpiar pantalla y restaurar el banner de HELIX' },
22
+ { command: '/stop', description: 'Parada de emergencia de todas las tareas activas' },
23
+ { command: '/help', description: 'Mostrar ayuda de comandos y atajos' },
24
+ { command: '/exit', description: 'Salir del CLI' },
25
+ ];
26
+ class Autocompleter {
27
+ client;
28
+ skills = [];
29
+ mcpTools = [];
30
+ constructor(client) {
31
+ this.client = client;
32
+ }
33
+ async refreshSuggestions() {
34
+ if (!this.client || !this.client.connected)
35
+ return;
36
+ try {
37
+ const skills = await this.client.getSkills();
38
+ if (skills) {
39
+ this.skills = skills.map((s) => s.name);
40
+ }
41
+ }
42
+ catch {
43
+ // Ignored if client is offline
44
+ }
45
+ try {
46
+ const servers = await this.client.getMcpServers();
47
+ if (servers) {
48
+ const tools = [];
49
+ for (const s of servers) {
50
+ tools.push(s.name);
51
+ if (s.tools) {
52
+ for (const t of s.tools) {
53
+ tools.push(`${s.name}_${t.name}`);
54
+ }
55
+ }
56
+ }
57
+ this.mcpTools = tools;
58
+ }
59
+ }
60
+ catch {
61
+ // Ignored
62
+ }
63
+ }
64
+ getSkills() {
65
+ return this.skills;
66
+ }
67
+ getMcpTools() {
68
+ return this.mcpTools;
69
+ }
70
+ /**
71
+ * Completer function matching readline specification:
72
+ * (line: string) => [string[], string]
73
+ */
74
+ completer(line) {
75
+ const trimmed = line.trimStart();
76
+ // 1. Skill sub-arguments for /skill <name>
77
+ if (trimmed.startsWith('/skill ')) {
78
+ const arg = trimmed.slice('/skill '.length).toLowerCase();
79
+ const hits = this.skills
80
+ .filter((s) => s.toLowerCase().startsWith(arg))
81
+ .map((s) => `/skill ${s}`);
82
+ return [hits.length ? hits : this.skills.map((s) => `/skill ${s}`), line];
83
+ }
84
+ // 2. Microphone sub-arguments
85
+ if (trimmed.startsWith('/microphone ')) {
86
+ const arg = trimmed.slice('/microphone '.length).toLowerCase();
87
+ const options = ['/microphone enable', '/microphone disable'];
88
+ const hits = options.filter((o) => o.toLowerCase().startsWith(trimmed.toLowerCase()));
89
+ return [hits.length ? hits : options, line];
90
+ }
91
+ // 3. Browser sub-arguments
92
+ if (trimmed.startsWith('/browser ')) {
93
+ const options = ['/browser open https://'];
94
+ return [options, line];
95
+ }
96
+ // 4. Slash command autocompletion
97
+ if (trimmed.startsWith('/')) {
98
+ const hits = exports.SLASH_COMMANDS
99
+ .map((c) => c.command)
100
+ .filter((c) => c.toLowerCase().startsWith(trimmed.toLowerCase()));
101
+ return [hits.length ? hits : exports.SLASH_COMMANDS.map((c) => c.command), line];
102
+ }
103
+ // 5. In-line @skill mention autocompletion
104
+ const lastAtMatch = /(?:^|\s)(@)([a-zA-Z0-9_-]*)$/.exec(line);
105
+ if (lastAtMatch) {
106
+ const prefix = line.slice(0, line.length - lastAtMatch[2].length);
107
+ const query = lastAtMatch[2].toLowerCase();
108
+ const matches = this.skills.filter((s) => s.toLowerCase().startsWith(query));
109
+ const hits = (matches.length ? matches : this.skills).map((s) => `${prefix}${s} `);
110
+ return [hits, line];
111
+ }
112
+ // 6. In-line #mcp mention autocompletion
113
+ const lastHashMatch = /(?:^|\s)(#)([a-zA-Z0-9_-]*)$/.exec(line);
114
+ if (lastHashMatch) {
115
+ const prefix = line.slice(0, line.length - lastHashMatch[2].length);
116
+ const query = lastHashMatch[2].toLowerCase();
117
+ const matches = this.mcpTools.filter((t) => t.toLowerCase().startsWith(query));
118
+ const hits = (matches.length ? matches : this.mcpTools).map((t) => `${prefix}${t} `);
119
+ return [hits, line];
120
+ }
121
+ return [[], line];
122
+ }
123
+ /**
124
+ * Formats the list of commands for display.
125
+ */
126
+ renderHelp() {
127
+ console.log('');
128
+ console.log(` ${chalk_1.default.hex('#FF8C00').bold('⬡ Comandos Disponibles')} ${chalk_1.default.gray('(/ + [Tab] para autocompletar)')}`);
129
+ console.log(` ${chalk_1.default.gray('─'.repeat(50))}`);
130
+ for (const cmd of exports.SLASH_COMMANDS) {
131
+ const usage = cmd.usage ? ` ${chalk_1.default.gray(cmd.usage)}` : '';
132
+ console.log(` ${chalk_1.default.magenta(cmd.command.padEnd(16))} ${chalk_1.default.gray(cmd.description)}${usage}`);
133
+ }
134
+ console.log('');
135
+ console.log(` ${chalk_1.default.hex('#FF8C00').bold('⬡ Prefijos Especiales')}`);
136
+ console.log(` ${chalk_1.default.gray('─'.repeat(50))}`);
137
+ console.log(` ${(0, colors_1.formatSkill)('nombre')} ${chalk_1.default.gray('Invoca una skill registrada')}`);
138
+ console.log(` ${(0, colors_1.formatMcp)('herramienta')} ${chalk_1.default.gray('Invoca herramientas MCP')}`);
139
+ console.log('');
140
+ }
141
+ }
142
+ exports.Autocompleter = Autocompleter;
@@ -0,0 +1,15 @@
1
+ export interface BannerStatusOptions {
2
+ connected: boolean;
3
+ wsUrl: string;
4
+ voiceEnabled: boolean;
5
+ isCapturingVoice?: boolean;
6
+ currentModel?: string | null;
7
+ activeTasksCount?: number;
8
+ }
9
+ export declare function getAsciiLogo(terminalWidth?: number): string;
10
+ export declare function getStatusBar(options: BannerStatusOptions): string;
11
+ export declare function renderHeader(options: BannerStatusOptions, clearScreen?: boolean): void;
12
+ export declare function getVoiceIndicator(isCapturing: boolean, voiceEnabled: boolean): string;
13
+ export declare const HELIX_LOGO_ASCII: typeof getAsciiLogo;
14
+ export declare const HELIX_BIG_ART: typeof getAsciiLogo;
15
+ export declare const HELIX_HARD_BLOCKS: typeof getAsciiLogo;
@@ -0,0 +1,84 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.HELIX_HARD_BLOCKS = exports.HELIX_BIG_ART = exports.HELIX_LOGO_ASCII = void 0;
7
+ exports.getAsciiLogo = getAsciiLogo;
8
+ exports.getStatusBar = getStatusBar;
9
+ exports.renderHeader = renderHeader;
10
+ exports.getVoiceIndicator = getVoiceIndicator;
11
+ const chalk_1 = __importDefault(require("chalk"));
12
+ // Exact bash logo with ANSI RGB codes - DO NOT MODIFY
13
+ function getAsciiLogo(terminalWidth = 80) {
14
+ const lines = [
15
+ ' \x1b[48;2;255;227;143m\x1b[38;2;255;255;255m▀\x1b[49m\x1b[38;2;255;227;143m█ \x1b[48;2;255;227;143m\x1b[38;2;255;255;255m▀\x1b[49m\x1b[38;2;255;227;143m█\x1b[0m',
16
+ ' \x1b[38;2;255;210;77m██ ██ \x1b[38;2;255;255;255m██████ ██ ██ ██ ██\x1b[0m',
17
+ '\x1b[38;2;255;215;119m██ \x1b[38;2;255;191;31m██ ██ \x1b[38;2;255;215;119m██ \x1b[38;2;246;246;246m██ ██ ██ ██ ██\x1b[0m',
18
+ '\x1b[38;2;255;191;36m██ \x1b[38;2;255;171;10m███\x1b[48;2;255;171;10m\x1b[38;2;255;255;255m▀\x1b[49m\x1b[38;2;255;171;10m███ \x1b[38;2;255;191;36m██ \x1b[38;2;236;236;236m████ ██ ██ ██\x1b[0m',
19
+ '\x1b[38;2;255;160;18m██ \x1b[38;2;255;145;20m███████ \x1b[38;2;255;160;18m██ \x1b[38;2;226;226;226m██ ██ ██ ██ ██\x1b[0m',
20
+ '\x1b[38;2;255;127;26m██ \x1b[38;2;255;122;26m██ ██ \x1b[38;2;255;127;26m██ \x1b[38;2;216;216;216m██████ ██████ ██ ██ ██\x1b[0m',
21
+ '\x1b[38;2;240;98;15m██ \x1b[38;2;255;95;18m██ ██ \x1b[38;2;240;98;15m██\x1b[0m',
22
+ ' \x1b[38;2;220;74;12m██ ██\x1b[0m'
23
+ ];
24
+ const visibleWidth = 62;
25
+ const leftPad = Math.max(0, Math.floor((terminalWidth - visibleWidth) / 2));
26
+ const padding = ' '.repeat(leftPad);
27
+ return lines.map(line => padding + line).join('\n');
28
+ }
29
+ function getStatusBar(options) {
30
+ const conn = options.connected
31
+ ? `${chalk_1.default.green('●')} ${chalk_1.default.greenBright.bold('CONECTADO')} ${chalk_1.default.gray(options.wsUrl)}`
32
+ : `${chalk_1.default.red('●')} ${chalk_1.default.redBright.bold('DESCONECTADO')} ${chalk_1.default.gray(options.wsUrl)}`;
33
+ let mic;
34
+ if (options.isCapturingVoice) {
35
+ mic = chalk_1.default.bgRed.white.bold(' 🎙️ CAPTURANDO ');
36
+ }
37
+ else if (options.voiceEnabled) {
38
+ mic = `${chalk_1.default.green('●')} ${chalk_1.default.white('Mic')} ${chalk_1.default.gray('"hey helix"')}`;
39
+ }
40
+ else {
41
+ mic = `${chalk_1.default.red('●')} ${chalk_1.default.gray('Mic Off')}`;
42
+ }
43
+ const model = options.currentModel
44
+ ? `${chalk_1.default.hex('#FF9F1C')('⚡')} ${chalk_1.default.white(options.currentModel)}`
45
+ : `${chalk_1.default.hex('#FF9F1C')('⚡')} ${chalk_1.default.white('Local ReAct')}`;
46
+ const tasks = (options.activeTasksCount ?? 0) > 0
47
+ ? ` ${chalk_1.default.yellow('⏳')} ${chalk_1.default.yellowBright(String(options.activeTasksCount))}`
48
+ : '';
49
+ const sep = chalk_1.default.gray(' │ ');
50
+ return ` ${conn}${sep}${mic}${sep}${model}${tasks}`;
51
+ }
52
+ function renderHeader(options, clearScreen = false) {
53
+ if (clearScreen) {
54
+ process.stdout.write('\x1bc');
55
+ }
56
+ const width = process.stdout.columns || 80;
57
+ const logo = getAsciiLogo(width);
58
+ const tagline = 'Persistent AI Desktop Agent';
59
+ const tagPad = Math.max(0, Math.floor((width - tagline.length - 8) / 2));
60
+ const subtitle = ' '.repeat(tagPad) + chalk_1.default.gray('╶───') + ' ' + chalk_1.default.hex('#FF9F1C')(tagline) + ' ' + chalk_1.default.gray('───╴');
61
+ const statusBar = getStatusBar(options);
62
+ const thinLine = chalk_1.default.gray('─'.repeat(width));
63
+ console.log('');
64
+ console.log(logo);
65
+ console.log('');
66
+ console.log(subtitle);
67
+ console.log('');
68
+ console.log(thinLine);
69
+ console.log(statusBar);
70
+ console.log(thinLine);
71
+ console.log(` ${chalk_1.default.hex('#FF8C00')('@skill')} ${chalk_1.default.gray('Skills')} ${chalk_1.default.gray('│')} ${chalk_1.default.cyan('#mcp')} ${chalk_1.default.gray('Herramientas')} ${chalk_1.default.gray('│')} ${chalk_1.default.magenta('/help')} ${chalk_1.default.gray('Comandos')}`);
72
+ console.log(thinLine);
73
+ console.log('');
74
+ }
75
+ function getVoiceIndicator(isCapturing, voiceEnabled) {
76
+ if (isCapturing)
77
+ return chalk_1.default.bgRed.white.bold(' 🎙️ VOZ DETECTADA [HEY HELIX] 🔊 ');
78
+ if (voiceEnabled)
79
+ return chalk_1.default.green('🟢 [Mic Activo]');
80
+ return chalk_1.default.red('🔴 [Mic Inactivo]');
81
+ }
82
+ exports.HELIX_LOGO_ASCII = getAsciiLogo;
83
+ exports.HELIX_BIG_ART = getAsciiLogo;
84
+ exports.HELIX_HARD_BLOCKS = getAsciiLogo;
@@ -0,0 +1 @@
1
+ export { HelixRepl, type ReplOptions } from './repl';
@@ -0,0 +1,5 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.HelixRepl = void 0;
4
+ var repl_1 = require("./repl");
5
+ Object.defineProperty(exports, "HelixRepl", { enumerable: true, get: function () { return repl_1.HelixRepl; } });
@@ -0,0 +1,34 @@
1
+ import chalk from 'chalk';
2
+ export declare const customChalk: chalk.Chalk;
3
+ export declare const ORANGE: chalk.Chalk;
4
+ export declare const ORANGE_BOLD: chalk.Chalk;
5
+ export declare const ORANGE_BG: chalk.Chalk;
6
+ export declare const CYAN: chalk.Chalk;
7
+ export declare const CYAN_BOLD: chalk.Chalk;
8
+ export declare const MAGENTA: chalk.Chalk;
9
+ export declare const MAGENTA_BOLD: chalk.Chalk;
10
+ export declare const GREEN: chalk.Chalk;
11
+ export declare const GREEN_BOLD: chalk.Chalk;
12
+ export declare const RED: chalk.Chalk;
13
+ export declare const RED_BOLD: chalk.Chalk;
14
+ export declare const YELLOW: chalk.Chalk;
15
+ export declare const YELLOW_BOLD: chalk.Chalk;
16
+ export declare const GRAY: chalk.Chalk;
17
+ export declare const BOLD: chalk.Chalk;
18
+ export declare const DIM: chalk.Chalk;
19
+ /**
20
+ * Highlights skill names with strong orange (#FF8C00).
21
+ */
22
+ export declare function formatSkill(name: string): string;
23
+ /**
24
+ * Highlights MCP tool/server names.
25
+ */
26
+ export declare function formatMcp(name: string): string;
27
+ /**
28
+ * Highlights slash commands.
29
+ */
30
+ export declare function formatCommand(cmd: string): string;
31
+ /**
32
+ * Formats user input text highlighting @skills in orange and #mcps in cyan.
33
+ */
34
+ export declare function highlightMentions(text: string, knownSkills?: string[]): string;
@@ -0,0 +1,69 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.DIM = exports.BOLD = exports.GRAY = exports.YELLOW_BOLD = exports.YELLOW = exports.RED_BOLD = exports.RED = exports.GREEN_BOLD = exports.GREEN = exports.MAGENTA_BOLD = exports.MAGENTA = exports.CYAN_BOLD = exports.CYAN = exports.ORANGE_BG = exports.ORANGE_BOLD = exports.ORANGE = exports.customChalk = void 0;
7
+ exports.formatSkill = formatSkill;
8
+ exports.formatMcp = formatMcp;
9
+ exports.formatCommand = formatCommand;
10
+ exports.highlightMentions = highlightMentions;
11
+ const chalk_1 = __importDefault(require("chalk"));
12
+ exports.customChalk = new chalk_1.default.Instance({ level: 3 });
13
+ // Brand colors
14
+ exports.ORANGE = exports.customChalk.hex('#FF8C00');
15
+ exports.ORANGE_BOLD = exports.customChalk.hex('#FF8C00').bold;
16
+ exports.ORANGE_BG = exports.customChalk.bgHex('#FF8C00').black.bold;
17
+ exports.CYAN = exports.customChalk.cyan;
18
+ exports.CYAN_BOLD = exports.customChalk.cyan.bold;
19
+ exports.MAGENTA = exports.customChalk.magenta;
20
+ exports.MAGENTA_BOLD = exports.customChalk.magenta.bold;
21
+ exports.GREEN = exports.customChalk.green;
22
+ exports.GREEN_BOLD = exports.customChalk.green.bold;
23
+ exports.RED = exports.customChalk.red;
24
+ exports.RED_BOLD = exports.customChalk.red.bold;
25
+ exports.YELLOW = exports.customChalk.yellow;
26
+ exports.YELLOW_BOLD = exports.customChalk.yellow.bold;
27
+ exports.GRAY = exports.customChalk.gray;
28
+ exports.BOLD = exports.customChalk.bold;
29
+ exports.DIM = exports.customChalk.dim;
30
+ /**
31
+ * Highlights skill names with strong orange (#FF8C00).
32
+ */
33
+ function formatSkill(name) {
34
+ const clean = name.startsWith('@') ? name : `@${name}`;
35
+ return (0, exports.ORANGE_BOLD)(clean);
36
+ }
37
+ /**
38
+ * Highlights MCP tool/server names.
39
+ */
40
+ function formatMcp(name) {
41
+ const clean = name.startsWith('#') ? name : `#${name}`;
42
+ return (0, exports.CYAN_BOLD)(clean);
43
+ }
44
+ /**
45
+ * Highlights slash commands.
46
+ */
47
+ function formatCommand(cmd) {
48
+ const clean = cmd.startsWith('/') ? cmd : `/${cmd}`;
49
+ return (0, exports.MAGENTA_BOLD)(clean);
50
+ }
51
+ /**
52
+ * Formats user input text highlighting @skills in orange and #mcps in cyan.
53
+ */
54
+ function highlightMentions(text, knownSkills = []) {
55
+ let result = text;
56
+ // Highlight @skill in orange
57
+ result = result.replace(/(^|\s)(@[a-zA-Z0-9_-]+)/g, (_match, prefix, mention) => {
58
+ return `${prefix}${(0, exports.ORANGE_BOLD)(mention)}`;
59
+ });
60
+ // Highlight #mcp in cyan
61
+ result = result.replace(/(^|\s)(#[a-zA-Z0-9_-]+)/g, (_match, prefix, mention) => {
62
+ return `${prefix}${(0, exports.CYAN_BOLD)(mention)}`;
63
+ });
64
+ // Highlight /commands in magenta
65
+ result = result.replace(/(^|\s)(\/[a-zA-Z0-9_-]+)/g, (_match, prefix, mention) => {
66
+ return `${prefix}${(0, exports.MAGENTA_BOLD)(mention)}`;
67
+ });
68
+ return result;
69
+ }
@@ -0,0 +1,31 @@
1
+ export interface ReplOptions {
2
+ wsUrl: string;
3
+ wsToken?: string;
4
+ }
5
+ export declare class HelixRepl {
6
+ private options;
7
+ private rl;
8
+ private client;
9
+ private autocompleter;
10
+ private conversationId;
11
+ private conversationHistory;
12
+ private voiceEnabled;
13
+ private isCapturingVoice;
14
+ private currentModel;
15
+ private activeTaskId;
16
+ private activeTasksCount;
17
+ private isProcessingPrompt;
18
+ constructor(options: ReplOptions);
19
+ start(): Promise<void>;
20
+ private _syncSettings;
21
+ refreshBanner(clearScreen?: boolean): void;
22
+ private waitingLogged;
23
+ private _setupClientEvents;
24
+ private _handleConfirmationDialog;
25
+ private _startReadline;
26
+ private _promptUser;
27
+ private _handleInputLine;
28
+ private _handleListTasks;
29
+ private _handleListModels;
30
+ private _handleStatus;
31
+ }