@johpaz/hive 1.1.3 → 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 -6
- 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 @@
|
|
|
1
|
+
export declare function securityAudit(): Promise<void>;
|
|
@@ -0,0 +1,155 @@
|
|
|
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.securityAudit = securityAudit;
|
|
37
|
+
const fs = __importStar(require("fs"));
|
|
38
|
+
const path = __importStar(require("path"));
|
|
39
|
+
const loader_1 = require("@johpaz/hive-core/config/loader");
|
|
40
|
+
const getHiveDirConst = () => (0, loader_1.getHiveDir)();
|
|
41
|
+
const getWorkspace = () => path.join(getHiveDirConst(), "workspace");
|
|
42
|
+
async function securityAudit() {
|
|
43
|
+
console.log("\n🔒 Hive Security Audit\n");
|
|
44
|
+
const results = [];
|
|
45
|
+
const config = (0, loader_1.loadConfig)();
|
|
46
|
+
// Red
|
|
47
|
+
results.push({ category: "Red", name: "Gateway bind", status: "ok", message: "127.0.0.1 (loopback)" });
|
|
48
|
+
results.push({ category: "Red", name: "Puerto", status: "ok", message: "18790 (no expuesto externamente)" });
|
|
49
|
+
const gateway = config.gateway;
|
|
50
|
+
const token = gateway?.authToken;
|
|
51
|
+
results.push({
|
|
52
|
+
category: "Red",
|
|
53
|
+
name: "Token bearer",
|
|
54
|
+
status: token && token.length > 0 ? "ok" : "warn",
|
|
55
|
+
message: token && token.length > 0 ? "configurado" : "no configurado",
|
|
56
|
+
});
|
|
57
|
+
// Archivos
|
|
58
|
+
const authProfiles = path.join(getHiveDirConst(), "auth-profiles.json");
|
|
59
|
+
if (fs.existsSync(authProfiles)) {
|
|
60
|
+
const stat = fs.statSync(authProfiles);
|
|
61
|
+
const mode = stat.mode & 0o777;
|
|
62
|
+
results.push({
|
|
63
|
+
category: "Archivos",
|
|
64
|
+
name: "auth-profiles.json permisos",
|
|
65
|
+
status: mode === 0o600 ? "ok" : "warn",
|
|
66
|
+
message: mode === 0o600 ? "600 (seguro)" : `${(mode).toString(8)} — ejecuta: chmod 600 ${authProfiles}`,
|
|
67
|
+
});
|
|
68
|
+
}
|
|
69
|
+
const envFile = path.join(getHiveDirConst(), ".env");
|
|
70
|
+
if (fs.existsSync(envFile)) {
|
|
71
|
+
const stat = fs.statSync(envFile);
|
|
72
|
+
const mode = stat.mode & 0o777;
|
|
73
|
+
results.push({
|
|
74
|
+
category: "Archivos",
|
|
75
|
+
name: ".env permisos",
|
|
76
|
+
status: mode === 0o600 ? "ok" : "warn",
|
|
77
|
+
message: mode === 0o600 ? "600 (seguro)" : `${(mode).toString(8)} — ejecuta: chmod 600 ${envFile}`,
|
|
78
|
+
});
|
|
79
|
+
}
|
|
80
|
+
// Configuración
|
|
81
|
+
const models = config.models;
|
|
82
|
+
const providers = models?.providers;
|
|
83
|
+
let hasHardcodedKey = false;
|
|
84
|
+
if (providers) {
|
|
85
|
+
for (const [, p] of Object.entries(providers)) {
|
|
86
|
+
const apiKey = p.apiKey;
|
|
87
|
+
if (apiKey && !apiKey.startsWith("${") && !apiKey.startsWith("process.env")) {
|
|
88
|
+
hasHardcodedKey = true;
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
results.push({
|
|
93
|
+
category: "Configuración",
|
|
94
|
+
name: "API keys",
|
|
95
|
+
status: !hasHardcodedKey ? "ok" : "warn",
|
|
96
|
+
message: !hasHardcodedKey ? "en variables de entorno" : "hardcodeadas en config — considera usar env vars",
|
|
97
|
+
});
|
|
98
|
+
// Workspace
|
|
99
|
+
results.push({
|
|
100
|
+
category: "Workspace",
|
|
101
|
+
name: "Permisos workspace",
|
|
102
|
+
status: fs.existsSync(getWorkspace()) ? "ok" : "warn",
|
|
103
|
+
message: fs.existsSync(getWorkspace()) ? "existe" : "no existe",
|
|
104
|
+
});
|
|
105
|
+
// MCP
|
|
106
|
+
const mcp = config.mcp;
|
|
107
|
+
const servers = mcp?.servers;
|
|
108
|
+
if (servers && Object.keys(servers).length > 0) {
|
|
109
|
+
results.push({ category: "MCP", name: "Servidores", status: "ok", message: `${Object.keys(servers).length} configurado(s)` });
|
|
110
|
+
for (const [name, server] of Object.entries(servers)) {
|
|
111
|
+
const cmd = server.command;
|
|
112
|
+
const isKnown = cmd?.includes("@modelcontextprotocol") || cmd?.includes("mcp-server");
|
|
113
|
+
results.push({
|
|
114
|
+
category: "MCP",
|
|
115
|
+
name: `Servidor '${name}'`,
|
|
116
|
+
status: isKnown ? "ok" : "warn",
|
|
117
|
+
message: isKnown ? "fuente conocida" : "verificar comando manualmente",
|
|
118
|
+
});
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
else {
|
|
122
|
+
results.push({ category: "MCP", name: "Servidores", status: "ok", message: "ninguno configurado" });
|
|
123
|
+
}
|
|
124
|
+
// Skills
|
|
125
|
+
const skillsDir = path.join(getHiveDirConst(), "skills");
|
|
126
|
+
if (fs.existsSync(skillsDir)) {
|
|
127
|
+
const managedSkills = fs.readdirSync(skillsDir).filter((f) => {
|
|
128
|
+
return fs.statSync(path.join(skillsDir, f)).isDirectory();
|
|
129
|
+
});
|
|
130
|
+
results.push({
|
|
131
|
+
category: "Skills",
|
|
132
|
+
name: "Skills de terceros",
|
|
133
|
+
status: managedSkills.length === 0 ? "ok" : "warn",
|
|
134
|
+
message: managedSkills.length === 0 ? "ninguna instalada" : `${managedSkills.length} instalada(s) — verificar manualmente`,
|
|
135
|
+
});
|
|
136
|
+
}
|
|
137
|
+
else {
|
|
138
|
+
results.push({ category: "Skills", name: "Skills de terceros", status: "ok", message: "ninguna instalada" });
|
|
139
|
+
}
|
|
140
|
+
// Mostrar resultados
|
|
141
|
+
const categories = [...new Set(results.map((r) => r.category))];
|
|
142
|
+
for (const category of categories) {
|
|
143
|
+
console.log(`${category}`);
|
|
144
|
+
const catResults = results.filter((r) => r.category === category);
|
|
145
|
+
for (const result of catResults) {
|
|
146
|
+
const icon = result.status === "ok" ? "✅" : result.status === "warn" ? "⚠️ " : "❌";
|
|
147
|
+
console.log(` ${icon} ${result.name}: ${result.message}`);
|
|
148
|
+
}
|
|
149
|
+
console.log();
|
|
150
|
+
}
|
|
151
|
+
// Resumen
|
|
152
|
+
const errors = results.filter((r) => r.status === "error");
|
|
153
|
+
const warns = results.filter((r) => r.status === "warn");
|
|
154
|
+
console.log(`📊 Resumen: ${results.length} checks, ${errors.length} errores, ${warns.length} advertencias`);
|
|
155
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare function installService(): Promise<void>;
|
|
@@ -0,0 +1,77 @@
|
|
|
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.installService = installService;
|
|
37
|
+
const fs = __importStar(require("fs"));
|
|
38
|
+
const path = __importStar(require("path"));
|
|
39
|
+
const child_process_1 = require("child_process");
|
|
40
|
+
const HOME = process.env.HOME || "";
|
|
41
|
+
const SYSTEMD_DIR = path.join(HOME, ".config", "systemd", "user");
|
|
42
|
+
async function installService() {
|
|
43
|
+
console.log("🔧 Instalando servicio systemd para Hive...\n");
|
|
44
|
+
if (!fs.existsSync(SYSTEMD_DIR)) {
|
|
45
|
+
fs.mkdirSync(SYSTEMD_DIR, { recursive: true });
|
|
46
|
+
}
|
|
47
|
+
const serviceContent = `[Unit]
|
|
48
|
+
Description=Hive Personal AI Gateway
|
|
49
|
+
After=network-online.target
|
|
50
|
+
Wants=network-online.target
|
|
51
|
+
|
|
52
|
+
[Service]
|
|
53
|
+
Type=simple
|
|
54
|
+
ExecStart=${HOME}/.bun/bin/hive start
|
|
55
|
+
ExecStop=${HOME}/.bun/bin/hive stop
|
|
56
|
+
Restart=on-failure
|
|
57
|
+
RestartSec=5
|
|
58
|
+
Environment=PATH=${HOME}/.bun/bin:${HOME}/.npm-global/bin:/usr/local/bin:/usr/bin:/bin
|
|
59
|
+
WorkingDirectory=${HOME}
|
|
60
|
+
|
|
61
|
+
[Install]
|
|
62
|
+
WantedBy=default.target
|
|
63
|
+
`;
|
|
64
|
+
const servicePath = path.join(SYSTEMD_DIR, "hive.service");
|
|
65
|
+
fs.writeFileSync(servicePath, serviceContent, "utf-8");
|
|
66
|
+
console.log(`✅ Archivo de servicio creado: ${servicePath}\n`);
|
|
67
|
+
console.log("Recargando systemd...");
|
|
68
|
+
(0, child_process_1.execSync)("systemctl --user daemon-reload", { stdio: "inherit" });
|
|
69
|
+
console.log("Habilitando servicio...");
|
|
70
|
+
(0, child_process_1.execSync)("systemctl --user enable hive", { stdio: "inherit" });
|
|
71
|
+
console.log("\n✅ Servicio instalado correctamente.\n");
|
|
72
|
+
console.log("Comandos disponibles:");
|
|
73
|
+
console.log(" systemctl --user start hive # Iniciar");
|
|
74
|
+
console.log(" systemctl --user stop hive # Detener");
|
|
75
|
+
console.log(" systemctl --user status hive # Ver estado");
|
|
76
|
+
console.log(" journalctl --user -u hive -f # Ver logs");
|
|
77
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare function sessions(subcommand: string | undefined, args: string[]): Promise<void>;
|
|
@@ -0,0 +1,132 @@
|
|
|
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.sessions = sessions;
|
|
37
|
+
const fs = __importStar(require("fs"));
|
|
38
|
+
const path = __importStar(require("path"));
|
|
39
|
+
const HIVE_DIR = path.join(process.env.HOME || "", ".hive");
|
|
40
|
+
const SESSIONS_DIR = path.join(HIVE_DIR, "sessions");
|
|
41
|
+
async function sessions(subcommand, args) {
|
|
42
|
+
switch (subcommand) {
|
|
43
|
+
case "list":
|
|
44
|
+
await listSessions();
|
|
45
|
+
break;
|
|
46
|
+
case "view":
|
|
47
|
+
await viewSession(args[0]);
|
|
48
|
+
break;
|
|
49
|
+
case "prune":
|
|
50
|
+
await pruneSessions();
|
|
51
|
+
break;
|
|
52
|
+
default:
|
|
53
|
+
console.log(`
|
|
54
|
+
Usage: hive sessions <command>
|
|
55
|
+
|
|
56
|
+
Commands:
|
|
57
|
+
list Listar sesiones
|
|
58
|
+
view <id> Ver transcripción
|
|
59
|
+
prune Eliminar sesiones inactivas
|
|
60
|
+
`);
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
async function listSessions() {
|
|
64
|
+
if (!fs.existsSync(SESSIONS_DIR)) {
|
|
65
|
+
console.log("No hay sesiones");
|
|
66
|
+
return;
|
|
67
|
+
}
|
|
68
|
+
const sessions = fs.readdirSync(SESSIONS_DIR).filter((f) => f.endsWith(".json"));
|
|
69
|
+
if (sessions.length === 0) {
|
|
70
|
+
console.log("No hay sesiones");
|
|
71
|
+
return;
|
|
72
|
+
}
|
|
73
|
+
console.log("\n📋 Sesiones:\n");
|
|
74
|
+
for (const session of sessions) {
|
|
75
|
+
const sessionPath = path.join(SESSIONS_DIR, session);
|
|
76
|
+
const stat = fs.statSync(sessionPath);
|
|
77
|
+
const id = session.replace(".json", "");
|
|
78
|
+
const date = stat.mtime.toLocaleDateString();
|
|
79
|
+
const time = stat.mtime.toLocaleTimeString();
|
|
80
|
+
let messageCount = 0;
|
|
81
|
+
try {
|
|
82
|
+
const content = JSON.parse(fs.readFileSync(sessionPath, "utf-8"));
|
|
83
|
+
messageCount = content.messages?.length || 0;
|
|
84
|
+
}
|
|
85
|
+
catch {
|
|
86
|
+
// ignore
|
|
87
|
+
}
|
|
88
|
+
console.log(` ${id}`);
|
|
89
|
+
console.log(` Última actividad: ${date} ${time}`);
|
|
90
|
+
console.log(` Mensajes: ${messageCount}`);
|
|
91
|
+
console.log();
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
async function viewSession(id) {
|
|
95
|
+
if (!id) {
|
|
96
|
+
console.log("❌ Especifica el ID de la sesión: hive sessions view <id>");
|
|
97
|
+
return;
|
|
98
|
+
}
|
|
99
|
+
const sessionPath = path.join(SESSIONS_DIR, `${id}.json`);
|
|
100
|
+
if (!fs.existsSync(sessionPath)) {
|
|
101
|
+
console.log(`❌ Sesión no encontrada: ${id}`);
|
|
102
|
+
return;
|
|
103
|
+
}
|
|
104
|
+
const content = JSON.parse(fs.readFileSync(sessionPath, "utf-8"));
|
|
105
|
+
const messages = content.messages || [];
|
|
106
|
+
console.log(`\n📜 Sesión: ${id}\n`);
|
|
107
|
+
for (const msg of messages) {
|
|
108
|
+
const role = msg.role === "user" ? "👤 Usuario" : "🤖 Agente";
|
|
109
|
+
console.log(`${role}:`);
|
|
110
|
+
console.log(` ${msg.content}`);
|
|
111
|
+
console.log();
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
async function pruneSessions() {
|
|
115
|
+
if (!fs.existsSync(SESSIONS_DIR)) {
|
|
116
|
+
console.log("No hay sesiones para limpiar");
|
|
117
|
+
return;
|
|
118
|
+
}
|
|
119
|
+
const sessions = fs.readdirSync(SESSIONS_DIR).filter((f) => f.endsWith(".json"));
|
|
120
|
+
const now = Date.now();
|
|
121
|
+
const maxAge = 7 * 24 * 60 * 60 * 1000; // 7 días
|
|
122
|
+
let pruned = 0;
|
|
123
|
+
for (const session of sessions) {
|
|
124
|
+
const sessionPath = path.join(SESSIONS_DIR, session);
|
|
125
|
+
const stat = fs.statSync(sessionPath);
|
|
126
|
+
if (now - stat.mtimeMs > maxAge) {
|
|
127
|
+
fs.unlinkSync(sessionPath);
|
|
128
|
+
pruned++;
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
console.log(`✅ Sesiones eliminadas: ${pruned}`);
|
|
132
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare function skills(subcommand: string | undefined, args: string[]): Promise<void>;
|
|
@@ -0,0 +1,190 @@
|
|
|
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.skills = skills;
|
|
37
|
+
const p = __importStar(require("@clack/prompts"));
|
|
38
|
+
const fs = __importStar(require("fs"));
|
|
39
|
+
const path = __importStar(require("path"));
|
|
40
|
+
const SKILLS_DIR = path.join(process.env.HOME || "", ".hive", "skills");
|
|
41
|
+
const BUNDLED_SKILLS = [
|
|
42
|
+
{ slug: "web-search", name: "Web Search", description: "Search the web using multiple search engines" },
|
|
43
|
+
{ slug: "code-exec", name: "Code Execution", description: "Execute code snippets safely" },
|
|
44
|
+
{ slug: "file-ops", name: "File Operations", description: "Read, write, and manage files" },
|
|
45
|
+
{ slug: "memory", name: "Memory", description: "Persistent memory and notes" },
|
|
46
|
+
{ slug: "cron", name: "Cron Jobs", description: "Schedule recurring tasks" },
|
|
47
|
+
];
|
|
48
|
+
async function skills(subcommand, args) {
|
|
49
|
+
switch (subcommand) {
|
|
50
|
+
case "list":
|
|
51
|
+
await listSkills();
|
|
52
|
+
break;
|
|
53
|
+
case "search":
|
|
54
|
+
await searchSkills(args[0]);
|
|
55
|
+
break;
|
|
56
|
+
case "install":
|
|
57
|
+
await installSkill(args[0]);
|
|
58
|
+
break;
|
|
59
|
+
case "remove":
|
|
60
|
+
await removeSkill(args[0]);
|
|
61
|
+
break;
|
|
62
|
+
case "update":
|
|
63
|
+
await updateSkills();
|
|
64
|
+
break;
|
|
65
|
+
default:
|
|
66
|
+
console.log(`
|
|
67
|
+
Usage: hive skills <command>
|
|
68
|
+
|
|
69
|
+
Commands:
|
|
70
|
+
list Listar skills instaladas
|
|
71
|
+
search <query> Buscar skills
|
|
72
|
+
install <slug> Instalar skill
|
|
73
|
+
remove <nombre> Eliminar skill
|
|
74
|
+
update Actualizar skills
|
|
75
|
+
`);
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
async function listSkills() {
|
|
79
|
+
console.log("\n📚 Skills instaladas:\n");
|
|
80
|
+
console.log(" Bundled (incluidas):");
|
|
81
|
+
for (const skill of BUNDLED_SKILLS) {
|
|
82
|
+
console.log(` • ${skill.name} (${skill.slug})`);
|
|
83
|
+
console.log(` ${skill.description}`);
|
|
84
|
+
}
|
|
85
|
+
if (fs.existsSync(SKILLS_DIR)) {
|
|
86
|
+
const managedSkills = fs.readdirSync(SKILLS_DIR).filter((f) => {
|
|
87
|
+
const skillPath = path.join(SKILLS_DIR, f);
|
|
88
|
+
return fs.statSync(skillPath).isDirectory();
|
|
89
|
+
});
|
|
90
|
+
if (managedSkills.length > 0) {
|
|
91
|
+
console.log("\n Managed (instaladas):");
|
|
92
|
+
for (const slug of managedSkills) {
|
|
93
|
+
const skillPath = path.join(SKILLS_DIR, slug, "skill.json");
|
|
94
|
+
if (fs.existsSync(skillPath)) {
|
|
95
|
+
const meta = JSON.parse(fs.readFileSync(skillPath, "utf-8"));
|
|
96
|
+
console.log(` • ${meta.name || slug}`);
|
|
97
|
+
console.log(` ${meta.description || "Sin descripción"}`);
|
|
98
|
+
}
|
|
99
|
+
else {
|
|
100
|
+
console.log(` • ${slug}`);
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
console.log();
|
|
106
|
+
}
|
|
107
|
+
async function searchSkills(query) {
|
|
108
|
+
if (!query) {
|
|
109
|
+
console.log("❌ Especifica un término de búsqueda: hive skills search <query>");
|
|
110
|
+
return;
|
|
111
|
+
}
|
|
112
|
+
console.log(`\n🔍 Buscando: "${query}"\n`);
|
|
113
|
+
const results = BUNDLED_SKILLS.filter((s) => s.name.toLowerCase().includes(query.toLowerCase()) ||
|
|
114
|
+
s.slug.toLowerCase().includes(query.toLowerCase()) ||
|
|
115
|
+
s.description.toLowerCase().includes(query.toLowerCase()));
|
|
116
|
+
if (results.length === 0) {
|
|
117
|
+
console.log("No se encontraron skills");
|
|
118
|
+
return;
|
|
119
|
+
}
|
|
120
|
+
for (const skill of results) {
|
|
121
|
+
console.log(` ${skill.slug}`);
|
|
122
|
+
console.log(` ${skill.name}`);
|
|
123
|
+
console.log(` ${skill.description}`);
|
|
124
|
+
console.log(` Tipo: bundled`);
|
|
125
|
+
console.log();
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
async function installSkill(slug) {
|
|
129
|
+
if (!slug) {
|
|
130
|
+
const result = await p.text({
|
|
131
|
+
message: "Slug de la skill a instalar:",
|
|
132
|
+
placeholder: "example-skill",
|
|
133
|
+
validate: (v) => (!v ? "El slug es requerido" : undefined),
|
|
134
|
+
});
|
|
135
|
+
if (p.isCancel(result)) {
|
|
136
|
+
p.cancel("Cancelado");
|
|
137
|
+
return;
|
|
138
|
+
}
|
|
139
|
+
slug = result;
|
|
140
|
+
}
|
|
141
|
+
console.log(`\n📦 Instalando skill: ${slug}`);
|
|
142
|
+
if (!fs.existsSync(SKILLS_DIR)) {
|
|
143
|
+
fs.mkdirSync(SKILLS_DIR, { recursive: true });
|
|
144
|
+
}
|
|
145
|
+
const skillPath = path.join(SKILLS_DIR, slug);
|
|
146
|
+
if (fs.existsSync(skillPath)) {
|
|
147
|
+
console.log("⚠️ La skill ya está instalada");
|
|
148
|
+
return;
|
|
149
|
+
}
|
|
150
|
+
fs.mkdirSync(skillPath, { recursive: true });
|
|
151
|
+
const meta = {
|
|
152
|
+
name: slug,
|
|
153
|
+
version: "1.0.0",
|
|
154
|
+
description: "Skill instalada manualmente",
|
|
155
|
+
installed: new Date().toISOString(),
|
|
156
|
+
};
|
|
157
|
+
fs.writeFileSync(path.join(skillPath, "skill.json"), JSON.stringify(meta, null, 2));
|
|
158
|
+
console.log(`✅ Skill "${slug}" instalada`);
|
|
159
|
+
}
|
|
160
|
+
async function removeSkill(slug) {
|
|
161
|
+
if (!slug) {
|
|
162
|
+
console.log("❌ Especifica la skill: hive skills remove <slug>");
|
|
163
|
+
return;
|
|
164
|
+
}
|
|
165
|
+
const skillPath = path.join(SKILLS_DIR, slug);
|
|
166
|
+
if (!fs.existsSync(skillPath)) {
|
|
167
|
+
console.log(`❌ La skill "${slug}" no está instalada`);
|
|
168
|
+
return;
|
|
169
|
+
}
|
|
170
|
+
const confirm = await p.confirm({
|
|
171
|
+
message: `¿Eliminar la skill "${slug}"?`,
|
|
172
|
+
initialValue: false,
|
|
173
|
+
});
|
|
174
|
+
if (p.isCancel(confirm) || !confirm) {
|
|
175
|
+
console.log("Cancelado");
|
|
176
|
+
return;
|
|
177
|
+
}
|
|
178
|
+
fs.rmSync(skillPath, { recursive: true });
|
|
179
|
+
console.log(`✅ Skill "${slug}" eliminada`);
|
|
180
|
+
}
|
|
181
|
+
async function updateSkills() {
|
|
182
|
+
if (!fs.existsSync(SKILLS_DIR)) {
|
|
183
|
+
console.log("No hay skills instaladas para actualizar");
|
|
184
|
+
return;
|
|
185
|
+
}
|
|
186
|
+
const spinner = p.spinner();
|
|
187
|
+
spinner.start("Actualizando skills...");
|
|
188
|
+
await new Promise((resolve) => setTimeout(resolve, 1000));
|
|
189
|
+
spinner.stop("Skills actualizadas ✅");
|
|
190
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare function update(): Promise<void>;
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.update = update;
|
|
4
|
+
const PACKAGES = ["@johpaz/hive-cli"];
|
|
5
|
+
async function update() {
|
|
6
|
+
console.log("🔄 Actualizando Hive...\n");
|
|
7
|
+
for (const pkg of PACKAGES) {
|
|
8
|
+
console.log(`Actualizando ${pkg}...`);
|
|
9
|
+
try {
|
|
10
|
+
const proc = Bun.spawn(["bun", "install", "-g", `${pkg}@latest`], {
|
|
11
|
+
stdout: "inherit",
|
|
12
|
+
stderr: "inherit",
|
|
13
|
+
});
|
|
14
|
+
const exitCode = await proc.exited;
|
|
15
|
+
if (exitCode === 0) {
|
|
16
|
+
console.log(`✅ ${pkg} actualizado\n`);
|
|
17
|
+
}
|
|
18
|
+
else {
|
|
19
|
+
console.log(`⚠️ Error actualizando ${pkg}\n`);
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
catch (e) {
|
|
23
|
+
console.log(`⚠️ Error actualizando ${pkg}: ${e.message}\n`);
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
console.log("✅ Hive actualizado. Ejecuta 'hive --version' para verificar.");
|
|
27
|
+
}
|
|
Binary file
|