@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,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
|
+
};
|