@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,350 @@
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.dbService = exports.DatabaseService = void 0;
37
+ exports.getDbPathLazy = getDbPathLazy;
38
+ exports.getDb = getDb;
39
+ exports.initializeDatabase = initializeDatabase;
40
+ const bun_sqlite_1 = require("bun:sqlite");
41
+ const logger_ts_1 = require("../utils/logger.ts");
42
+ const path = __importStar(require("node:path"));
43
+ const node_fs_1 = require("node:fs");
44
+ const loader_ts_1 = require("../config/loader.ts");
45
+ const schema_ts_1 = require("./schema.ts");
46
+ function getDbPath() {
47
+ return path.join((0, loader_ts_1.getHiveDir)(), "data", "hive.db");
48
+ }
49
+ function getDbPathLazy() {
50
+ return getDbPath();
51
+ }
52
+ let _db = null;
53
+ function getDb() {
54
+ if (!_db)
55
+ throw new Error("DB no inicializada. Llama initializeDatabase() primero.");
56
+ return _db;
57
+ }
58
+ function initializeDatabase() {
59
+ const hiveDir = (0, loader_ts_1.getHiveDir)();
60
+ const dir = path.join(hiveDir, "data");
61
+ if (!(0, node_fs_1.existsSync)(dir)) {
62
+ (0, node_fs_1.mkdirSync)(dir, { recursive: true });
63
+ }
64
+ const dbPath = getDbPath();
65
+ const dbFileExists = (0, node_fs_1.existsSync)(dbPath);
66
+ _db = new bun_sqlite_1.Database(dbPath, { create: true });
67
+ // Use type assertion to avoid deprecated signature with bindings
68
+ _db.exec(schema_ts_1.SCHEMA);
69
+ _db.exec(schema_ts_1.PROJECTS_SCHEMA);
70
+ _db.exec(schema_ts_1.CONTEXT_ENGINE_SCHEMA);
71
+ ensureSchemaSync();
72
+ return _db;
73
+ }
74
+ function ensureColumnExists(tableName, columnName, columnDefinition) {
75
+ if (!_db)
76
+ return;
77
+ try {
78
+ const info = _db.query(`PRAGMA table_info(${tableName})`).all();
79
+ const exists = info.some((col) => col.name === columnName);
80
+ if (!exists) {
81
+ logger_ts_1.logger.info(`🛠️ Añadiendo columna faltante '${columnName}' a la tabla '${tableName}'`);
82
+ _db.exec(`ALTER TABLE ${tableName} ADD COLUMN ${columnName} ${columnDefinition}`);
83
+ }
84
+ }
85
+ catch (err) {
86
+ logger_ts_1.logger.warn(`⚠️ No se pudo verificar/añadir la columna '${columnName}' en '${tableName}':`, { error: err.message });
87
+ }
88
+ }
89
+ function ensureSchemaSync() {
90
+ if (!_db)
91
+ return;
92
+ // Sync mcp_servers
93
+ ensureColumnExists("mcp_servers", "tools_count", "INTEGER DEFAULT 0");
94
+ ensureColumnExists("mcp_servers", "status", "TEXT NOT NULL DEFAULT 'disconnected'");
95
+ ensureColumnExists("mcp_servers", "env_encrypted", "TEXT");
96
+ ensureColumnExists("mcp_servers", "env_iv", "TEXT");
97
+ ensureColumnExists("mcp_servers", "headers_encrypted", "TEXT");
98
+ ensureColumnExists("mcp_servers", "headers_iv", "TEXT");
99
+ // Sync providers
100
+ ensureColumnExists("providers", "api_key_encrypted", "TEXT");
101
+ ensureColumnExists("providers", "api_key_iv", "TEXT");
102
+ ensureColumnExists("providers", "headers_encrypted", "TEXT");
103
+ ensureColumnExists("providers", "headers_iv", "TEXT");
104
+ ensureColumnExists("providers", "num_ctx", "INTEGER");
105
+ ensureColumnExists("providers", "num_gpu", "INTEGER DEFAULT -1");
106
+ // Sync agents (new Context Engine columns — safe no-ops if already present)
107
+ ensureColumnExists("agents", "headers_encrypted", "TEXT");
108
+ ensureColumnExists("agents", "headers_iv", "TEXT");
109
+ ensureColumnExists("agents", "system_prompt", "TEXT");
110
+ ensureColumnExists("agents", "role", "TEXT NOT NULL DEFAULT 'coordinator'");
111
+ ensureColumnExists("agents", "tools_json", "TEXT");
112
+ ensureColumnExists("agents", "skills_json", "TEXT");
113
+ ensureColumnExists("agents", "parent_id", "TEXT");
114
+ ensureColumnExists("agents", "max_iterations", "INTEGER NOT NULL DEFAULT 10");
115
+ ensureColumnExists("agents", "updated_at", "INTEGER NOT NULL DEFAULT (unixepoch())");
116
+ // Sync tasks (new Context Engine columns)
117
+ ensureColumnExists("tasks", "priority", "INTEGER NOT NULL DEFAULT 0");
118
+ ensureColumnExists("tasks", "depends_on", "TEXT");
119
+ ensureColumnExists("tasks", "error", "TEXT");
120
+ ensureColumnExists("tasks", "completed_at", "INTEGER");
121
+ // Sync cron_jobs
122
+ ensureColumnExists("cron_jobs", "max_runs", "INTEGER");
123
+ ensureColumnExists("cron_jobs", "run_count", "INTEGER NOT NULL DEFAULT 0");
124
+ ensureColumnExists("cron_jobs", "expires_at", "INTEGER");
125
+ // hive_capabilities: create if not exists (applied via CONTEXT_ENGINE_SCHEMA IF NOT EXISTS)
126
+ // No column migrations needed — table is seeded fresh each startup via INSERT OR REPLACE
127
+ }
128
+ class DatabaseService {
129
+ constructor() {
130
+ this.log = logger_ts_1.logger.child("sqlite");
131
+ }
132
+ get db() {
133
+ if (!_db) {
134
+ initializeDatabase();
135
+ }
136
+ return _db;
137
+ }
138
+ addMessage(sessionId, role, content, metadata) {
139
+ const stmt = this.db.query(`
140
+ INSERT INTO messages (id, session_id, thread_id, role, content, metadata)
141
+ VALUES ($id, $sessionId, $threadId, $role, $content, $metadata)
142
+ `);
143
+ try {
144
+ const id = crypto.randomUUID();
145
+ stmt.run({
146
+ $id: id,
147
+ $sessionId: sessionId,
148
+ $threadId: sessionId,
149
+ $role: role,
150
+ $content: content,
151
+ $metadata: metadata ? JSON.stringify(metadata) : null
152
+ });
153
+ this.log.debug(`Message added for session ${sessionId}`);
154
+ }
155
+ catch (error) {
156
+ this.log.error(`Failed to add message: ${error.message}`);
157
+ }
158
+ }
159
+ getMessages(sessionId, limit = 100) {
160
+ const stmt = this.db.query(`
161
+ SELECT * FROM messages
162
+ WHERE session_id = $sessionId
163
+ ORDER BY created_at DESC
164
+ LIMIT $limit
165
+ `);
166
+ try {
167
+ const rows = stmt.all({
168
+ $sessionId: sessionId,
169
+ $limit: limit
170
+ });
171
+ return rows.reverse();
172
+ }
173
+ catch (error) {
174
+ this.log.error(`Failed to get messages: ${error.message}`);
175
+ return [];
176
+ }
177
+ }
178
+ close() {
179
+ if (_db) {
180
+ _db.close();
181
+ _db = null;
182
+ }
183
+ }
184
+ writeNote(title, content) {
185
+ const stmt = this.db.query(`
186
+ INSERT INTO notes (id, title, content)
187
+ VALUES ($id, $title, $content)
188
+ ON CONFLICT(title) DO UPDATE SET
189
+ content = excluded.content,
190
+ updatedAt = CURRENT_TIMESTAMP
191
+ RETURNING *
192
+ `);
193
+ return stmt.get({
194
+ $id: crypto.randomUUID(),
195
+ $title: title,
196
+ $content: content
197
+ });
198
+ }
199
+ readNote(title) {
200
+ const stmt = this.db.query(`SELECT * FROM notes WHERE title = $title`);
201
+ return stmt.get({ $title: title });
202
+ }
203
+ listNotes() {
204
+ const stmt = this.db.query(`SELECT * FROM notes ORDER BY updatedAt DESC`);
205
+ return stmt.all();
206
+ }
207
+ searchNotes(queryText) {
208
+ const stmt = this.db.query(`
209
+ SELECT * FROM notes
210
+ WHERE title LIKE $query OR content LIKE $query
211
+ ORDER BY updatedAt DESC
212
+ `);
213
+ return stmt.all({ $query: `%${queryText}%` });
214
+ }
215
+ deleteNote(title) {
216
+ const stmt = this.db.query(`DELETE FROM notes WHERE title = $title`);
217
+ const result = stmt.run({ $title: title });
218
+ return result.changes > 0;
219
+ }
220
+ updateMCPServer(id, updates) {
221
+ const fields = [];
222
+ const values = { $id: id };
223
+ if (updates.enabled !== undefined) {
224
+ fields.push("enabled = $enabled");
225
+ values.$enabled = updates.enabled ? 1 : 0;
226
+ }
227
+ if (updates.active !== undefined) {
228
+ fields.push("active = $active");
229
+ values.$active = updates.active ? 1 : 0;
230
+ }
231
+ if (updates.status !== undefined) {
232
+ fields.push("status = $status");
233
+ values.$status = updates.status;
234
+ }
235
+ if (updates.tools_count !== undefined) {
236
+ fields.push("tools_count = $tools_count");
237
+ values.$tools_count = updates.tools_count;
238
+ }
239
+ if (updates.transport !== undefined) {
240
+ fields.push("transport = $transport");
241
+ values.$transport = updates.transport;
242
+ }
243
+ if (updates.command !== undefined) {
244
+ fields.push("command = $command");
245
+ values.$command = updates.command;
246
+ }
247
+ if (updates.args !== undefined) {
248
+ fields.push("args = $args");
249
+ values.$args = JSON.stringify(updates.args);
250
+ }
251
+ if (updates.url !== undefined) {
252
+ fields.push("url = $url");
253
+ values.$url = updates.url;
254
+ }
255
+ if (updates.env_encrypted !== undefined) {
256
+ fields.push("env_encrypted = $env_encrypted");
257
+ values.$env_encrypted = updates.env_encrypted;
258
+ }
259
+ if (updates.env_iv !== undefined) {
260
+ fields.push("env_iv = $env_iv");
261
+ values.$env_iv = updates.env_iv;
262
+ }
263
+ if (updates.headers_encrypted !== undefined) {
264
+ fields.push("headers_encrypted = $headers_encrypted");
265
+ values.$headers_encrypted = updates.headers_encrypted;
266
+ }
267
+ if (updates.headers_iv !== undefined) {
268
+ fields.push("headers_iv = $headers_iv");
269
+ values.$headers_iv = updates.headers_iv;
270
+ }
271
+ if (fields.length === 0)
272
+ return;
273
+ const query = `UPDATE mcp_servers SET ${fields.join(", ")} WHERE id = $id`;
274
+ try {
275
+ this.db.query(query).run(values);
276
+ this.log.debug(`MCP server ${id} updated in DB`);
277
+ }
278
+ catch (error) {
279
+ this.log.error(`Failed to update MCP server ${id}: ${error.message}`);
280
+ }
281
+ }
282
+ listMCPServers() {
283
+ try {
284
+ return this.db.query("SELECT * FROM mcp_servers").all();
285
+ }
286
+ catch (error) {
287
+ this.log.error(`Failed to list MCP servers: ${error.message}`);
288
+ return [];
289
+ }
290
+ }
291
+ createTask(task) {
292
+ const result = this.db.query(`
293
+ INSERT INTO tasks (project_id, agent_id, parent_task_id, name, description)
294
+ VALUES (?, ?, ?, ?, ?)
295
+ `).run(task.project_id, task.agent_id ?? null, task.parent_task_id ?? null, task.name, task.description ?? null);
296
+ return Number(result.lastInsertRowid);
297
+ }
298
+ updateTask(taskId, updates) {
299
+ const fields = ["updated_at = unixepoch()"];
300
+ const values = [];
301
+ if (updates.status !== undefined) {
302
+ fields.push("status = ?");
303
+ values.push(updates.status);
304
+ }
305
+ if (updates.progress !== undefined) {
306
+ fields.push("progress = ?");
307
+ values.push(updates.progress);
308
+ }
309
+ if (updates.result !== undefined) {
310
+ fields.push("result = ?");
311
+ values.push(updates.result);
312
+ }
313
+ if (updates.agent_id !== undefined) {
314
+ fields.push("agent_id = ?");
315
+ values.push(updates.agent_id);
316
+ }
317
+ values.push(taskId);
318
+ const res = this.db.query(`UPDATE tasks SET ${fields.join(", ")} WHERE id = ?`).run(...values);
319
+ return res.changes > 0;
320
+ }
321
+ getTasksByProject(projectId) {
322
+ return this.db.query("SELECT * FROM tasks WHERE project_id = ? ORDER BY id ASC").all(projectId);
323
+ }
324
+ getProjectWithTasks(projectId) {
325
+ const project = this.db.query("SELECT * FROM projects WHERE id = ?").get(projectId);
326
+ if (!project)
327
+ return null;
328
+ project.tasks = this.getTasksByProject(projectId);
329
+ return project;
330
+ }
331
+ recalcProjectProgress(projectId) {
332
+ const row = this.db.query("SELECT AVG(progress) as avg_progress FROM tasks WHERE project_id = ?").get(projectId);
333
+ const avg = Math.round(row?.avg_progress ?? 0);
334
+ this.db.query("UPDATE projects SET progress = ?, updated_at = unixepoch() WHERE id = ?").run(avg, projectId);
335
+ return avg;
336
+ }
337
+ saveMCPServer(server) {
338
+ try {
339
+ this.db.query(`
340
+ INSERT OR REPLACE INTO mcp_servers (id, name, transport, command, args, url, env_encrypted, env_iv, headers_encrypted, headers_iv, enabled, active, builtin, tools_count, status)
341
+ VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
342
+ `).run(server.id || server.name, server.name, server.transport, server.command || null, JSON.stringify(server.args || []), server.url || null, server.env_encrypted || null, server.env_iv || null, server.headers_encrypted || null, server.headers_iv || null, server.enabled ? 1 : 0, server.active ? 1 : 0, server.builtin ? 1 : 0, server.tools_count || 0, server.status || "disconnected");
343
+ }
344
+ catch (error) {
345
+ this.log.error(`Failed to save MCP server ${server.name}: ${error.message}`);
346
+ }
347
+ }
348
+ }
349
+ exports.DatabaseService = DatabaseService;
350
+ exports.dbService = new DatabaseService();
@@ -0,0 +1,84 @@
1
+ export type LogLevel = "debug" | "info" | "warn" | "error";
2
+ export interface LogEntry {
3
+ timestamp: string;
4
+ level: LogLevel;
5
+ source: string;
6
+ message: string;
7
+ meta?: Record<string, unknown>;
8
+ }
9
+ export type LogEntryListener = (entry: LogEntry) => void;
10
+ /** Subscribe to real-time log entries */
11
+ export declare function onLogEntry(cb: LogEntryListener): void;
12
+ /** Unsubscribe from real-time log entries */
13
+ export declare function removeLogListener(cb: LogEntryListener): void;
14
+ export interface LoggerConfig {
15
+ level: LogLevel;
16
+ dir: string;
17
+ maxSizeMB: number;
18
+ maxFiles: number;
19
+ redactSensitive: boolean;
20
+ console: boolean;
21
+ }
22
+ export interface LogMeta extends Record<string, unknown> {
23
+ correlationId?: string;
24
+ sessionId?: string;
25
+ userId?: string;
26
+ agentId?: string;
27
+ channel?: string;
28
+ toolName?: string;
29
+ duration?: number;
30
+ error?: string;
31
+ stack?: string;
32
+ }
33
+ export declare class Logger {
34
+ private config;
35
+ private logFile;
36
+ private currentSize;
37
+ private correlationContext;
38
+ constructor(config?: Partial<LoggerConfig>);
39
+ setCorrelationContext(context: Partial<LogMeta>): void;
40
+ clearCorrelationContext(): void;
41
+ getCorrelationId(): string | undefined;
42
+ withCorrelationId(id: string): this;
43
+ private initLogFile;
44
+ private shouldLog;
45
+ private writeToConsole;
46
+ private mergeMeta;
47
+ private writeToFile;
48
+ private rotateLogs;
49
+ debug(message: string, meta?: unknown): void;
50
+ info(message: string, meta?: unknown): void;
51
+ warn(message: string, meta?: unknown): void;
52
+ error(message: string, meta?: unknown): void;
53
+ child(context: string): ChildLogger;
54
+ setLevel(level: LogLevel): void;
55
+ }
56
+ export declare class ChildLogger {
57
+ private parent;
58
+ private context;
59
+ private correlationContext;
60
+ constructor(parent: Logger, context: string, correlationContext?: LogMeta);
61
+ private prefix;
62
+ withCorrelationId(id: string): this;
63
+ setContext(context: Partial<LogMeta>): void;
64
+ debug(message: string, meta?: unknown): void;
65
+ info(message: string, meta?: unknown): void;
66
+ warn(message: string, meta?: unknown): void;
67
+ error(message: string, meta?: unknown): void;
68
+ child(subContext: string): ChildLogger;
69
+ private mergeMeta;
70
+ }
71
+ export declare function getLogger(): Logger;
72
+ export declare const logger: {
73
+ child: (opts: any) => ChildLogger;
74
+ debug: (msg: string, meta?: unknown) => void;
75
+ info: (msg: string, meta?: unknown) => void;
76
+ warn: (msg: string, meta?: unknown) => void;
77
+ error: (msg: string, meta?: unknown) => void;
78
+ setCorrelationContext: (ctx: any) => void;
79
+ clearCorrelationContext: () => void;
80
+ getCorrelationId: () => string;
81
+ withCorrelationId: (id: string) => Logger;
82
+ setLevel: (level: any) => void;
83
+ setHandler: (handler: any) => void;
84
+ };