@johpaz/hive 1.1.4 → 1.1.5

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 (69) hide show
  1. package/package.json +5 -5
  2. package/packages/cli/dist/commands/agent-run.d.ts +1 -0
  3. package/packages/cli/dist/commands/agent-run.js +178 -0
  4. package/packages/cli/dist/commands/agents.d.ts +1 -0
  5. package/packages/cli/dist/commands/agents.js +372 -0
  6. package/packages/cli/dist/commands/chat.d.ts +1 -0
  7. package/packages/cli/dist/commands/chat.js +152 -0
  8. package/packages/cli/dist/commands/config.d.ts +1 -0
  9. package/packages/cli/dist/commands/config.js +49 -0
  10. package/packages/cli/dist/commands/cron.d.ts +1 -0
  11. package/packages/cli/dist/commands/cron.js +166 -0
  12. package/packages/cli/dist/commands/dev.d.ts +1 -0
  13. package/packages/cli/dist/commands/dev.js +120 -0
  14. package/packages/cli/dist/commands/doctor.d.ts +1 -0
  15. package/packages/cli/dist/commands/doctor.js +161 -0
  16. package/packages/cli/dist/commands/gateway.d.ts +4 -0
  17. package/packages/cli/dist/commands/gateway.js +444 -0
  18. package/packages/cli/dist/commands/logs.d.ts +1 -0
  19. package/packages/cli/dist/commands/logs.js +87 -0
  20. package/packages/cli/dist/commands/mcp.d.ts +1 -0
  21. package/packages/cli/dist/commands/mcp.js +175 -0
  22. package/packages/cli/dist/commands/message.d.ts +1 -0
  23. package/packages/cli/dist/commands/message.js +65 -0
  24. package/packages/cli/dist/commands/onboard.d.ts +1 -0
  25. package/packages/cli/dist/commands/onboard.js +1715 -0
  26. package/packages/cli/dist/commands/security.d.ts +1 -0
  27. package/packages/cli/dist/commands/security.js +155 -0
  28. package/packages/cli/dist/commands/service.d.ts +1 -0
  29. package/packages/cli/dist/commands/service.js +77 -0
  30. package/packages/cli/dist/commands/sessions.d.ts +1 -0
  31. package/packages/cli/dist/commands/sessions.js +132 -0
  32. package/packages/cli/dist/commands/skills.d.ts +1 -0
  33. package/packages/cli/dist/commands/skills.js +190 -0
  34. package/packages/cli/dist/commands/update.d.ts +1 -0
  35. package/packages/cli/dist/commands/update.js +27 -0
  36. package/packages/cli/dist/hive-binary +0 -0
  37. package/packages/cli/dist/index.d.ts +2 -0
  38. package/packages/cli/dist/index.js +184 -0
  39. package/packages/cli/dist/utils/token.d.ts +1 -0
  40. package/packages/cli/dist/utils/token.js +8 -0
  41. package/packages/cli/package.json +3 -1
  42. package/packages/core/package.json +9 -1
  43. package/packages/core/src/config/loader.d.ts +298 -0
  44. package/packages/core/src/config/loader.js +513 -0
  45. package/packages/core/src/storage/schema.d.ts +3 -0
  46. package/packages/core/src/storage/schema.js +541 -0
  47. package/packages/core/src/storage/sqlite.d.ts +51 -0
  48. package/packages/core/src/storage/sqlite.js +350 -0
  49. package/packages/core/src/utils/logger.d.ts +84 -0
  50. package/packages/core/src/utils/logger.js +352 -0
  51. package/packages/cli/src/commands/agent-run.ts +0 -168
  52. package/packages/cli/src/commands/agents.ts +0 -398
  53. package/packages/cli/src/commands/chat.ts +0 -142
  54. package/packages/cli/src/commands/config.ts +0 -50
  55. package/packages/cli/src/commands/cron.ts +0 -161
  56. package/packages/cli/src/commands/dev.ts +0 -95
  57. package/packages/cli/src/commands/doctor.ts +0 -133
  58. package/packages/cli/src/commands/gateway.ts +0 -443
  59. package/packages/cli/src/commands/logs.ts +0 -57
  60. package/packages/cli/src/commands/mcp.ts +0 -175
  61. package/packages/cli/src/commands/message.ts +0 -77
  62. package/packages/cli/src/commands/onboard.ts +0 -1868
  63. package/packages/cli/src/commands/security.ts +0 -144
  64. package/packages/cli/src/commands/service.ts +0 -50
  65. package/packages/cli/src/commands/sessions.ts +0 -116
  66. package/packages/cli/src/commands/skills.ts +0 -187
  67. package/packages/cli/src/commands/update.ts +0 -25
  68. package/packages/cli/src/index.ts +0 -185
  69. package/packages/cli/src/utils/token.ts +0 -6
@@ -0,0 +1,152 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.chat = chat;
37
+ const fs = __importStar(require("fs"));
38
+ const readline = __importStar(require("readline"));
39
+ const loader_1 = require("@johpaz/hive-core/config/loader");
40
+ const getHiveDirConst = () => (0, loader_1.getHiveDir)();
41
+ async function chat(flags) {
42
+ const config = (0, loader_1.loadConfig)();
43
+ const HIVE_DIR = getHiveDirConst();
44
+ if (!fs.existsSync(HIVE_DIR)) {
45
+ console.log("❌ Directorio Hive no encontrado. Ejecuta: hive onboard");
46
+ return;
47
+ }
48
+ const agentId = flags.find((f) => f.startsWith("--agent"))?.split("=")[1] ||
49
+ flags[flags.indexOf("--agent") + 1] ||
50
+ "main";
51
+ console.log(`\n🐝 Chat con agente: ${agentId}`);
52
+ console.log(" Escribe /exit para salir, /new para nueva sesión\n");
53
+ const rl = readline.createInterface({
54
+ input: process.stdin,
55
+ output: process.stdout,
56
+ });
57
+ const question = (prompt) => {
58
+ return new Promise((resolve) => {
59
+ rl.question(prompt, resolve);
60
+ });
61
+ };
62
+ const messages = [];
63
+ while (true) {
64
+ const input = await question("> ");
65
+ const trimmed = input.trim();
66
+ if (!trimmed)
67
+ continue;
68
+ if (trimmed === "/exit" || trimmed === "/quit") {
69
+ console.log("👋 ¡Hasta luego!");
70
+ rl.close();
71
+ break;
72
+ }
73
+ if (trimmed === "/new") {
74
+ messages.length = 0;
75
+ console.log("📝 Nueva sesión iniciada\n");
76
+ continue;
77
+ }
78
+ if (trimmed === "/help") {
79
+ console.log(`
80
+ Comandos disponibles:
81
+ /exit, /quit - Salir del chat
82
+ /new - Iniciar nueva sesión
83
+ /help - Mostrar esta ayuda
84
+ `);
85
+ continue;
86
+ }
87
+ messages.push({ role: "user", content: trimmed });
88
+ console.log("\n🤖 Pensando...\n");
89
+ try {
90
+ const response = await callLLM(config, messages);
91
+ messages.push({ role: "assistant", content: response });
92
+ console.log(`\n${response}\n`);
93
+ }
94
+ catch (error) {
95
+ console.log(`❌ Error: ${error.message}\n`);
96
+ }
97
+ }
98
+ }
99
+ async function callLLM(config, messages) {
100
+ const models = config.models;
101
+ const provider = models?.defaultProvider || "anthropic";
102
+ const defaults = models?.defaults;
103
+ const model = defaults?.default || defaults?.[provider] || "claude-sonnet-4-5";
104
+ const providers = models?.providers;
105
+ const providerConfig = providers?.[provider];
106
+ // Try to get API key from config, then process.env
107
+ const apiKey = providerConfig?.apiKey ||
108
+ process.env[`${provider.toUpperCase()}_API_KEY`] ||
109
+ "";
110
+ if (provider === "anthropic") {
111
+ const response = await fetch("https://api.anthropic.com/v1/messages", {
112
+ method: "POST",
113
+ headers: {
114
+ "Content-Type": "application/json",
115
+ "x-api-key": apiKey,
116
+ "anthropic-version": "2023-06-01",
117
+ "anthropic-dangerous-direct-browser-access": "true",
118
+ },
119
+ body: JSON.stringify({
120
+ model,
121
+ max_tokens: 4096,
122
+ messages: messages.map((m) => ({ role: m.role, content: m.content })),
123
+ }),
124
+ });
125
+ if (!response.ok) {
126
+ const errorData = await response.json().catch(() => ({}));
127
+ throw new Error(`Anthropic API error: ${response.status} - ${JSON.stringify(errorData)}`);
128
+ }
129
+ const data = (await response.json());
130
+ return data.content[0]?.text || "Sin respuesta";
131
+ }
132
+ if (provider === "openai") {
133
+ const response = await fetch("https://api.openai.com/v1/chat/completions", {
134
+ method: "POST",
135
+ headers: {
136
+ "Content-Type": "application/json",
137
+ Authorization: `Bearer ${apiKey}`,
138
+ },
139
+ body: JSON.stringify({
140
+ model,
141
+ messages: messages.map((m) => ({ role: m.role, content: m.content })),
142
+ }),
143
+ });
144
+ if (!response.ok) {
145
+ const errorData = await response.json().catch(() => ({}));
146
+ throw new Error(`OpenAI API error: ${response.status} - ${JSON.stringify(errorData)}`);
147
+ }
148
+ const data = (await response.json());
149
+ return data.choices[0]?.message?.content || "Sin respuesta";
150
+ }
151
+ return `Proveedor '${provider}' no soportado en modo chat CLI. Usa 'hive start' para el Gateway completo.`;
152
+ }
@@ -0,0 +1 @@
1
+ export declare function config(subcommand: string | undefined, args: string[]): Promise<void>;
@@ -0,0 +1,49 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.config = config;
4
+ const loader_1 = require("@johpaz/hive-core/config/loader");
5
+ async function config(subcommand, args) {
6
+ switch (subcommand) {
7
+ case "show":
8
+ await showConfig();
9
+ break;
10
+ case "edit":
11
+ console.log("⚠️ La edición manual de archivos YAML ha sido deshabilitada.");
12
+ console.log("Configura Hive a través de variables de entorno o la base de datos.");
13
+ break;
14
+ default:
15
+ console.log(`
16
+ Usage: hive config <command>
17
+
18
+ Commands:
19
+ show Mostrar la configuración actual (redactada)
20
+ edit (Deshabilitado) Edición manual de configuración
21
+ `);
22
+ }
23
+ }
24
+ function redactSecrets(obj, depth = 0) {
25
+ if (depth > 10)
26
+ return obj;
27
+ if (typeof obj !== "object" || obj === null)
28
+ return obj;
29
+ const sensitiveKeys = ["apiKey", "token", "botToken", "password", "secret", "key"];
30
+ if (Array.isArray(obj)) {
31
+ return obj.map((item) => redactSecrets(item, depth + 1));
32
+ }
33
+ const result = {};
34
+ for (const [key, value] of Object.entries(obj)) {
35
+ if (sensitiveKeys.some((sk) => key.toLowerCase().includes(sk.toLowerCase()))) {
36
+ result[key] = "***REDACTED***";
37
+ }
38
+ else {
39
+ result[key] = redactSecrets(value, depth + 1);
40
+ }
41
+ }
42
+ return result;
43
+ }
44
+ async function showConfig() {
45
+ const config = (0, loader_1.loadConfig)();
46
+ console.log("\n⚙️ Configuración Actual (Redactada):\n");
47
+ console.log(JSON.stringify(redactSecrets(config), null, 2));
48
+ console.log();
49
+ }
@@ -0,0 +1 @@
1
+ export declare function cron(subcommand: string | undefined, args: string[]): Promise<void>;
@@ -0,0 +1,166 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.cron = cron;
37
+ const p = __importStar(require("@clack/prompts"));
38
+ const fs = __importStar(require("fs"));
39
+ const path = __importStar(require("path"));
40
+ const loader_1 = require("@johpaz/hive-core/config/loader");
41
+ const getHiveDirConst = () => (0, loader_1.getHiveDir)();
42
+ const getCronDir = () => path.join(getHiveDirConst(), "cron");
43
+ const CRON_DB = path.join(getCronDir(), "jobs.json");
44
+ function loadJobs() {
45
+ if (!fs.existsSync(CRON_DB))
46
+ return [];
47
+ try {
48
+ return JSON.parse(fs.readFileSync(CRON_DB, "utf-8"));
49
+ }
50
+ catch {
51
+ return [];
52
+ }
53
+ }
54
+ function saveJobs(jobs) {
55
+ if (!fs.existsSync(getCronDir())) {
56
+ fs.mkdirSync(getCronDir(), { recursive: true });
57
+ }
58
+ fs.writeFileSync(CRON_DB, JSON.stringify(jobs, null, 2));
59
+ }
60
+ async function cron(subcommand, args) {
61
+ switch (subcommand) {
62
+ case "list":
63
+ await listCron();
64
+ break;
65
+ case "add":
66
+ await addCron();
67
+ break;
68
+ case "remove":
69
+ await removeCron(args[0]);
70
+ break;
71
+ case "logs":
72
+ await cronLogs();
73
+ break;
74
+ default:
75
+ console.log(`
76
+ Usage: hive cron <command>
77
+
78
+ Commands:
79
+ list Listar cron jobs
80
+ add Añadir cron job
81
+ remove <id> Eliminar cron job
82
+ logs Ver logs de cron
83
+ `);
84
+ }
85
+ }
86
+ async function listCron() {
87
+ const jobs = loadJobs();
88
+ if (jobs.length === 0) {
89
+ console.log("No hay cron jobs configurados");
90
+ return;
91
+ }
92
+ console.log("\n⏰ Cron Jobs:\n");
93
+ for (const job of jobs) {
94
+ const status = job.enabled ? "✅ Activo" : "⏸️ Pausado";
95
+ console.log(` ${job.id}`);
96
+ console.log(` Estado: ${status}`);
97
+ console.log(` Schedule: ${job.schedule}`);
98
+ console.log(` Comando: ${job.command}`);
99
+ if (job.lastRun) {
100
+ console.log(` Última: ${job.lastRun}`);
101
+ }
102
+ console.log();
103
+ }
104
+ }
105
+ async function addCron() {
106
+ const idValue = await p.text({
107
+ message: "ID del cron job:",
108
+ placeholder: "daily-report",
109
+ validate: (v) => (!v ? "El ID es requerido" : undefined),
110
+ });
111
+ if (p.isCancel(idValue)) {
112
+ p.cancel("Cancelado");
113
+ return;
114
+ }
115
+ const scheduleValue = await p.text({
116
+ message: "Schedule (cron expression):",
117
+ placeholder: "0 9 * * *",
118
+ validate: (v) => (!v ? "El schedule es requerido" : undefined),
119
+ });
120
+ if (p.isCancel(scheduleValue)) {
121
+ p.cancel("Cancelado");
122
+ return;
123
+ }
124
+ const commandValue = await p.text({
125
+ message: "Comando a ejecutar:",
126
+ placeholder: "hive chat --agent work 'Genera el reporte diario'",
127
+ validate: (v) => (!v ? "El comando es requerido" : undefined),
128
+ });
129
+ if (p.isCancel(commandValue)) {
130
+ p.cancel("Cancelado");
131
+ return;
132
+ }
133
+ const jobs = loadJobs();
134
+ jobs.push({
135
+ id: idValue,
136
+ schedule: scheduleValue,
137
+ command: commandValue,
138
+ enabled: true,
139
+ });
140
+ saveJobs(jobs);
141
+ console.log(`✅ Cron job "${idValue}" creado`);
142
+ }
143
+ async function removeCron(id) {
144
+ if (!id) {
145
+ console.log("❌ Especifica el ID: hive cron remove <id>");
146
+ return;
147
+ }
148
+ const jobs = loadJobs();
149
+ const index = jobs.findIndex((j) => j.id === id);
150
+ if (index === -1) {
151
+ console.log(`❌ Cron job no encontrado: ${id}`);
152
+ return;
153
+ }
154
+ jobs.splice(index, 1);
155
+ saveJobs(jobs);
156
+ console.log(`✅ Cron job "${id}" eliminado`);
157
+ }
158
+ async function cronLogs() {
159
+ const logFile = path.join(getCronDir(), "cron.log");
160
+ if (!fs.existsSync(logFile)) {
161
+ console.log("No hay logs de cron");
162
+ return;
163
+ }
164
+ const content = fs.readFileSync(logFile, "utf-8");
165
+ console.log(content);
166
+ }
@@ -0,0 +1 @@
1
+ export declare function dev(): Promise<void>;
@@ -0,0 +1,120 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.dev = dev;
37
+ const p = __importStar(require("@clack/prompts"));
38
+ const fs = __importStar(require("fs"));
39
+ const path = __importStar(require("path"));
40
+ const loader_1 = require("../../../core/src/config/loader");
41
+ function showDevBanner() {
42
+ const hiveDir = (0, loader_1.getHiveDir)();
43
+ console.log(`
44
+ ╔══════════════════════════════════════════════════╗
45
+ ║ 🔧 HIVE DEV MODE ║
46
+ ║ Configuración en: ${hiveDir}
47
+ ║ Tu configuración real en ~/.hive/ no será modificada. ║
48
+ ╚══════════════════════════════════════════════════╝
49
+ `);
50
+ }
51
+ async function dev() {
52
+ const hiveDir = (0, loader_1.getHiveDir)();
53
+ const dbPath = path.join(hiveDir, "data", "hive.db");
54
+ // Create hiveDir if it doesn't exist
55
+ if (!fs.existsSync(hiveDir)) {
56
+ fs.mkdirSync(hiveDir, { recursive: true });
57
+ }
58
+ // ── Step 1: Si existe sesión anterior, preguntar si limpiar ──
59
+ if (fs.readdirSync(hiveDir).length > 0) {
60
+ const stats = fs.statSync(hiveDir);
61
+ const hoursAgo = Math.floor((Date.now() - stats.mtime.getTime()) / (1000 * 60 * 60));
62
+ const timeAgo = hoursAgo < 1 ? "hace unos minutos" : `hace ${hoursAgo} hora${hoursAgo > 1 ? "s" : ""}`;
63
+ console.log(`\n⚠️ Se encontró una sesión de dev anterior en ${hiveDir}\n Última configuración: ${timeAgo}\n`);
64
+ const shouldClean = await p.confirm({
65
+ message: "¿Limpiar y empezar de nuevo?",
66
+ initialValue: true,
67
+ });
68
+ if (p.isCancel(shouldClean)) {
69
+ p.cancel("Operación cancelada.");
70
+ process.exit(0);
71
+ }
72
+ if (shouldClean) {
73
+ console.log("🧹 Limpiando entorno de dev anterior...");
74
+ fs.rmSync(hiveDir, { recursive: true, force: true });
75
+ fs.mkdirSync(hiveDir, { recursive: true });
76
+ }
77
+ }
78
+ showDevBanner();
79
+ // ── Step 2: Verificar si ya hay un agente configurado ──
80
+ let hasCompletedAgent = false;
81
+ if (fs.existsSync(dbPath)) {
82
+ try {
83
+ const { initializeDatabase, getDb } = await Promise.resolve().then(() => __importStar(require("../../../core/src/storage/sqlite")));
84
+ initializeDatabase();
85
+ const db = getDb();
86
+ const agent = db.query("SELECT id FROM agents WHERE is_coordinator = 1 AND status = 'idle' LIMIT 1").get();
87
+ hasCompletedAgent = !!agent;
88
+ }
89
+ catch {
90
+ hasCompletedAgent = false;
91
+ }
92
+ }
93
+ // ── Step 3: Si no hay agente, ejecutar onboarding (él crea dir + BD) ──
94
+ if (!hasCompletedAgent) {
95
+ console.log("🚀 Ejecutando onboarding interactivo...\n");
96
+ const { onboard } = await Promise.resolve().then(() => __importStar(require("./onboard")));
97
+ await onboard();
98
+ // Verificar que onboarding creó el agente
99
+ try {
100
+ const { getDb } = await Promise.resolve().then(() => __importStar(require("../../../core/src/storage/sqlite")));
101
+ const db = getDb();
102
+ const agent = db.query("SELECT id FROM agents WHERE is_coordinator = 1 AND status = 'idle' LIMIT 1").get();
103
+ if (!agent) {
104
+ console.error("❌ Onboard no creó la configuración en BD");
105
+ process.exit(1);
106
+ }
107
+ }
108
+ catch (e) {
109
+ console.error("❌ Error verificando configuración:", e.message);
110
+ process.exit(1);
111
+ }
112
+ console.log("\n✅ Onboarding completado. Arrancando el servidor...\n");
113
+ }
114
+ else {
115
+ console.log("🚀 Arrancando gateway con configuración existente...\n");
116
+ }
117
+ // ── Step 4: Arrancar gateway ──
118
+ const { start } = await Promise.resolve().then(() => __importStar(require("./gateway")));
119
+ await start(["--skip-check"]);
120
+ }
@@ -0,0 +1 @@
1
+ export declare function doctor(): Promise<void>;
@@ -0,0 +1,161 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.doctor = doctor;
37
+ const p = __importStar(require("@clack/prompts"));
38
+ const fs = __importStar(require("fs"));
39
+ const path = __importStar(require("path"));
40
+ const child_process_1 = require("child_process");
41
+ const loader_1 = require("@johpaz/hive-core/config/loader");
42
+ const getHiveDirConst = () => (0, loader_1.getHiveDir)();
43
+ const getWorkspace = () => path.join(getHiveDirConst(), "workspace");
44
+ const getPidFile = () => path.join(getHiveDirConst(), "hive.pid");
45
+ const getDbFile = () => path.join(getHiveDirConst(), "hive.db");
46
+ function checkBun() {
47
+ try {
48
+ const version = (0, child_process_1.execSync)("bun --version", { encoding: "utf-8" }).trim();
49
+ return { ok: true, version };
50
+ }
51
+ catch {
52
+ return { ok: false, version: "no instalado" };
53
+ }
54
+ }
55
+ function checkNode() {
56
+ try {
57
+ const version = (0, child_process_1.execSync)("node --version", { encoding: "utf-8" }).trim();
58
+ return { ok: true, version };
59
+ }
60
+ catch {
61
+ return { ok: false, version: "no instalado" };
62
+ }
63
+ }
64
+ function isGatewayRunning() {
65
+ if (!fs.existsSync(getPidFile()))
66
+ return false;
67
+ const pid = parseInt(fs.readFileSync(getPidFile(), "utf-8").trim(), 10);
68
+ if (isNaN(pid))
69
+ return false;
70
+ try {
71
+ process.kill(pid, 0);
72
+ return true;
73
+ }
74
+ catch {
75
+ return false;
76
+ }
77
+ }
78
+ async function doctor() {
79
+ console.log("\n🐝 Hive Doctor — Diagnóstico del sistema\n");
80
+ const checks = [];
81
+ // Runtime
82
+ const bun = checkBun();
83
+ checks.push({ category: "Runtime", name: "Bun", status: bun.ok ? "ok" : "error", message: `v${bun.version}` });
84
+ const node = checkNode();
85
+ checks.push({ category: "Runtime", name: "Node.js", status: node.ok ? "ok" : "warn", message: `${node.version} (para MCP servers)` });
86
+ // Directorio Base
87
+ if (fs.existsSync(getHiveDirConst())) {
88
+ checks.push({ category: "Sistema", name: "Directorio Hive", status: "ok", message: getHiveDirConst() });
89
+ }
90
+ else {
91
+ checks.push({ category: "Sistema", name: "Directorio Hive", status: "error", message: "no existe", hint: "Ejecuta 'hive onboard'" });
92
+ }
93
+ // Base de Datos
94
+ if (fs.existsSync(getDbFile())) {
95
+ checks.push({ category: "Sistema", name: "Base de Datos", status: "ok", message: "hive.db presente" });
96
+ }
97
+ else {
98
+ checks.push({ category: "Sistema", name: "Base de Datos", status: "warn", message: "hive.db no existe" });
99
+ }
100
+ // Configuración (In-memory/Env)
101
+ try {
102
+ const config = (0, loader_1.loadConfig)();
103
+ const gateway = config.gateway;
104
+ if (gateway) {
105
+ checks.push({ category: "Configuración", name: "Gateway Config", status: "ok", message: "cargada" });
106
+ }
107
+ else {
108
+ checks.push({ category: "Configuración", name: "Gateway Config", status: "warn", message: "usando valores por defecto" });
109
+ }
110
+ const models = config.models;
111
+ const provider = models?.defaultProvider;
112
+ if (provider) {
113
+ checks.push({ category: "Configuración", name: "Proveedor LLM", status: "ok", message: provider });
114
+ }
115
+ else {
116
+ checks.push({ category: "Configuración", name: "Proveedor LLM", status: "warn", message: "no configurado" });
117
+ }
118
+ }
119
+ catch (e) {
120
+ checks.push({ category: "Configuración", name: "Carga", status: "error", message: `Error: ${e.message}` });
121
+ }
122
+ // Workspace
123
+ checks.push({ category: "Workspace", name: "Directorio", status: fs.existsSync(getWorkspace()) ? "ok" : "warn", message: fs.existsSync(getWorkspace()) ? "existe" : "no existe" });
124
+ // Gateway
125
+ const running = isGatewayRunning();
126
+ checks.push({ category: "Gateway", name: "Estado", status: running ? "ok" : "warn", message: running ? "corriendo" : "detenido" });
127
+ // Mostrar resultados
128
+ const categories = [...new Set(checks.map((c) => c.category))];
129
+ for (const category of categories) {
130
+ console.log(`${category}`);
131
+ const categoryChecks = checks.filter((c) => c.category === category);
132
+ for (const check of categoryChecks) {
133
+ const icon = check.status === "ok" ? "✅" : check.status === "warn" ? "⚠️ " : "❌";
134
+ console.log(` ${icon} ${check.name}: ${check.message}`);
135
+ if (check.hint) {
136
+ console.log(` 💡 ${check.hint}`);
137
+ }
138
+ }
139
+ console.log();
140
+ }
141
+ // Resumen
142
+ const errors = checks.filter((c) => c.status === "error");
143
+ const warns = checks.filter((c) => c.status === "warn");
144
+ if (errors.length > 0) {
145
+ console.log(`❌ ${errors.length} error(es) encontrado(s)`);
146
+ const fix = await p.confirm({
147
+ message: "¿Deseas ejecutar el onboarding para reparar?",
148
+ initialValue: false,
149
+ });
150
+ if (fix) {
151
+ const { onboard } = await Promise.resolve().then(() => __importStar(require("./onboard")));
152
+ await onboard();
153
+ }
154
+ }
155
+ else if (warns.length > 0) {
156
+ console.log(`⚠️ ${warns.length} advertencia(s)`);
157
+ }
158
+ else {
159
+ console.log("✅ Todo en orden");
160
+ }
161
+ }
@@ -0,0 +1,4 @@
1
+ export declare function start(flags: string[]): Promise<void>;
2
+ export declare function stop(): Promise<void>;
3
+ export declare function status(flags: string[]): Promise<void>;
4
+ export declare function reload(): Promise<void>;