@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.
- package/package.json +5 -5
- package/packages/cli/dist/commands/agent-run.d.ts +1 -0
- package/packages/cli/dist/commands/agent-run.js +178 -0
- package/packages/cli/dist/commands/agents.d.ts +1 -0
- package/packages/cli/dist/commands/agents.js +372 -0
- package/packages/cli/dist/commands/chat.d.ts +1 -0
- package/packages/cli/dist/commands/chat.js +152 -0
- package/packages/cli/dist/commands/config.d.ts +1 -0
- package/packages/cli/dist/commands/config.js +49 -0
- package/packages/cli/dist/commands/cron.d.ts +1 -0
- package/packages/cli/dist/commands/cron.js +166 -0
- package/packages/cli/dist/commands/dev.d.ts +1 -0
- package/packages/cli/dist/commands/dev.js +120 -0
- package/packages/cli/dist/commands/doctor.d.ts +1 -0
- package/packages/cli/dist/commands/doctor.js +161 -0
- package/packages/cli/dist/commands/gateway.d.ts +4 -0
- package/packages/cli/dist/commands/gateway.js +444 -0
- package/packages/cli/dist/commands/logs.d.ts +1 -0
- package/packages/cli/dist/commands/logs.js +87 -0
- package/packages/cli/dist/commands/mcp.d.ts +1 -0
- package/packages/cli/dist/commands/mcp.js +175 -0
- package/packages/cli/dist/commands/message.d.ts +1 -0
- package/packages/cli/dist/commands/message.js +65 -0
- package/packages/cli/dist/commands/onboard.d.ts +1 -0
- package/packages/cli/dist/commands/onboard.js +1715 -0
- package/packages/cli/dist/commands/security.d.ts +1 -0
- package/packages/cli/dist/commands/security.js +155 -0
- package/packages/cli/dist/commands/service.d.ts +1 -0
- package/packages/cli/dist/commands/service.js +77 -0
- package/packages/cli/dist/commands/sessions.d.ts +1 -0
- package/packages/cli/dist/commands/sessions.js +132 -0
- package/packages/cli/dist/commands/skills.d.ts +1 -0
- package/packages/cli/dist/commands/skills.js +190 -0
- package/packages/cli/dist/commands/update.d.ts +1 -0
- package/packages/cli/dist/commands/update.js +27 -0
- package/packages/cli/dist/hive-binary +0 -0
- package/packages/cli/dist/index.d.ts +2 -0
- package/packages/cli/dist/index.js +184 -0
- package/packages/cli/dist/utils/token.d.ts +1 -0
- package/packages/cli/dist/utils/token.js +8 -0
- package/packages/cli/package.json +3 -1
- package/packages/core/package.json +9 -1
- package/packages/core/src/config/loader.d.ts +298 -0
- package/packages/core/src/config/loader.js +513 -0
- package/packages/core/src/storage/schema.d.ts +3 -0
- package/packages/core/src/storage/schema.js +541 -0
- package/packages/core/src/storage/sqlite.d.ts +51 -0
- package/packages/core/src/storage/sqlite.js +350 -0
- package/packages/core/src/utils/logger.d.ts +84 -0
- package/packages/core/src/utils/logger.js +352 -0
- package/packages/cli/src/commands/agent-run.ts +0 -168
- package/packages/cli/src/commands/agents.ts +0 -398
- package/packages/cli/src/commands/chat.ts +0 -142
- package/packages/cli/src/commands/config.ts +0 -50
- package/packages/cli/src/commands/cron.ts +0 -161
- package/packages/cli/src/commands/dev.ts +0 -95
- package/packages/cli/src/commands/doctor.ts +0 -133
- package/packages/cli/src/commands/gateway.ts +0 -443
- package/packages/cli/src/commands/logs.ts +0 -57
- package/packages/cli/src/commands/mcp.ts +0 -175
- package/packages/cli/src/commands/message.ts +0 -77
- package/packages/cli/src/commands/onboard.ts +0 -1868
- package/packages/cli/src/commands/security.ts +0 -144
- package/packages/cli/src/commands/service.ts +0 -50
- package/packages/cli/src/commands/sessions.ts +0 -116
- package/packages/cli/src/commands/skills.ts +0 -187
- package/packages/cli/src/commands/update.ts +0 -25
- package/packages/cli/src/index.ts +0 -185
- 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
|
+
}
|