feihong-code 7.6.0 → 8.0.0

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.
@@ -0,0 +1,512 @@
1
+ "use strict";
2
+ /**
3
+ * 飞虹 Code — SQLite 数据存储模块(v8.0)
4
+ * 晋江市飞虹智科技企业管理有限公司 · 飞扬企源研发中心 · 负责人:吴赐虹
5
+ *
6
+ * 基于 Node.js 内置 node:sqlite(DatabaseSync),零外部依赖。
7
+ * 统一替代文件/JSON 存储,提供:
8
+ * - 通用 KV 存储(models/config/memory 等)
9
+ * - 任务表(替代 task-queue 的 <id>.json 文件)
10
+ * - 记忆表(MEMORY.md / USER.md / 历史摘要)
11
+ * - 技能表(Skills)
12
+ * - 知识库表(Knowledge docs)
13
+ * - 会话/用户建模(Honcho 风格)
14
+ *
15
+ * 设计:
16
+ * - 单例连接,路径默认 $FH_HOME/feihong.db(可 FH_DB_PATH 覆盖)
17
+ * - 启动自动建表 + 迁移(SCHEMA_VERSION 版本号递增)
18
+ * - 所有写操作 try/catch + 回滚保护
19
+ * - 敏感字段按表声明加密(复用 secure-store 的 AES-256-GCM)
20
+ */
21
+ Object.defineProperty(exports, "__esModule", { value: true });
22
+ exports.SQLiteStore = exports.SCHEMA_VERSION = void 0;
23
+ exports.getStore = getStore;
24
+ exports.resetStore = resetStore;
25
+ const node_sqlite_1 = require("node:sqlite");
26
+ const fs_1 = require("fs");
27
+ const path_1 = require("path");
28
+ const secure_store_1 = require("./secure-store");
29
+ /** 当前 Schema 版本:每次变更结构需 +1 并补 migrate() 分支 */
30
+ exports.SCHEMA_VERSION = 1;
31
+ /** 需要加密的字段(key 表名:字段名) */
32
+ const ENCRYPTED_FIELDS = {
33
+ 'config': ['value'],
34
+ 'models': ['apiKey'],
35
+ };
36
+ function resolveDbPath() {
37
+ if (process.env.FH_DB_PATH)
38
+ return process.env.FH_DB_PATH;
39
+ const home = process.env.FH_HOME || (0, path_1.join)(process.env.HOME || process.env.USERPROFILE || '.', '.feihong-code');
40
+ return (0, path_1.join)(home, 'feihong.db');
41
+ }
42
+ class SQLiteStore {
43
+ db;
44
+ debugEnabled;
45
+ migrations;
46
+ constructor(options = {}) {
47
+ const dbPath = options.dbPath || resolveDbPath();
48
+ this.debugEnabled = options.debug || false;
49
+ // 确保目录存在
50
+ const dir = dbPath.substring(0, dbPath.lastIndexOf(/[\\/]/.exec(dbPath)?.[0] || '/'));
51
+ if (dir && !(0, fs_1.existsSync)(dir))
52
+ (0, fs_1.mkdirSync)(dir, { recursive: true });
53
+ this.db = new node_sqlite_1.DatabaseSync(dbPath);
54
+ this.db.exec('PRAGMA journal_mode = WAL;');
55
+ this.db.exec('PRAGMA foreign_keys = ON;');
56
+ // 迁移定义:key = schema 版本
57
+ this.migrations = {
58
+ 1: (db) => this.migrateToV1(db),
59
+ };
60
+ this.ensureSchema();
61
+ }
62
+ /* ========== 私有方法 ========== */
63
+ debug(...args) {
64
+ if (this.debugEnabled)
65
+ console.log('[SQLiteStore]', ...args);
66
+ }
67
+ encrypt(table, field, value) {
68
+ if (!value)
69
+ return value;
70
+ const encFields = ENCRYPTED_FIELDS[table];
71
+ if (!encFields || !encFields.includes(field))
72
+ return value;
73
+ try {
74
+ const key = (0, secure_store_1.getMasterKey)(process.env.FH_HOME || (0, path_1.join)(process.env.HOME || '.', '.feihong-code'));
75
+ return (0, secure_store_1.encryptText)(value, key);
76
+ }
77
+ catch {
78
+ return value;
79
+ }
80
+ }
81
+ decrypt(table, field, value) {
82
+ if (!value)
83
+ return value;
84
+ const encFields = ENCRYPTED_FIELDS[table];
85
+ if (!encFields || !encFields.includes(field))
86
+ return value;
87
+ if (!value.startsWith('v1:'))
88
+ return value; // 未加密的旧数据
89
+ try {
90
+ const key = (0, secure_store_1.getMasterKey)(process.env.FH_HOME || (0, path_1.join)(process.env.HOME || '.', '.feihong-code'));
91
+ return (0, secure_store_1.decryptText)(value, key);
92
+ }
93
+ catch {
94
+ return value;
95
+ }
96
+ }
97
+ /* ========== Schema 管理 ========== */
98
+ migrateToV1(db) {
99
+ // 元数据表
100
+ db.exec(`
101
+ CREATE TABLE IF NOT EXISTS meta (
102
+ key TEXT PRIMARY KEY,
103
+ value TEXT
104
+ );
105
+
106
+ -- 通用 KV 存储(models/config/settings 等)
107
+ CREATE TABLE IF NOT EXISTS kv (
108
+ namespace TEXT NOT NULL,
109
+ key TEXT NOT NULL,
110
+ value TEXT NOT NULL,
111
+ updated_at INTEGER NOT NULL DEFAULT (unixepoch()),
112
+ PRIMARY KEY (namespace, key)
113
+ );
114
+
115
+ -- 任务表
116
+ CREATE TABLE IF NOT EXISTS tasks (
117
+ id TEXT PRIMARY KEY,
118
+ type TEXT NOT NULL,
119
+ status TEXT NOT NULL DEFAULT 'pending',
120
+ progress INTEGER NOT NULL DEFAULT 0,
121
+ input TEXT,
122
+ result TEXT,
123
+ error TEXT,
124
+ model TEXT,
125
+ created_at INTEGER NOT NULL DEFAULT (unixepoch()),
126
+ started_at INTEGER,
127
+ completed_at INTEGER
128
+ );
129
+ CREATE INDEX IF NOT EXISTS idx_tasks_status ON tasks(status);
130
+ CREATE INDEX IF NOT EXISTS idx_tasks_created ON tasks(created_at);
131
+
132
+ -- 模型表
133
+ CREATE TABLE IF NOT EXISTS models (
134
+ id TEXT PRIMARY KEY,
135
+ name TEXT NOT NULL,
136
+ provider TEXT NOT NULL DEFAULT 'openai-compatible',
137
+ api_base TEXT,
138
+ api_key TEXT,
139
+ context_window INTEGER,
140
+ max_output INTEGER,
141
+ supports_streaming INTEGER NOT NULL DEFAULT 1,
142
+ supports_vision INTEGER NOT NULL DEFAULT 0,
143
+ created_at INTEGER NOT NULL DEFAULT (unixepoch())
144
+ );
145
+
146
+ -- Agent 表
147
+ CREATE TABLE IF NOT EXISTS agents (
148
+ id TEXT PRIMARY KEY,
149
+ name TEXT NOT NULL,
150
+ type TEXT NOT NULL DEFAULT 'solo',
151
+ status TEXT NOT NULL DEFAULT 'idle',
152
+ system_prompt TEXT,
153
+ model TEXT,
154
+ created_at INTEGER NOT NULL DEFAULT (unixepoch()),
155
+ last_active INTEGER
156
+ );
157
+
158
+ -- 技能表
159
+ CREATE TABLE IF NOT EXISTS skills (
160
+ id TEXT PRIMARY KEY,
161
+ name TEXT NOT NULL,
162
+ description TEXT,
163
+ trigger TEXT,
164
+ prompt TEXT,
165
+ tags TEXT,
166
+ version TEXT DEFAULT '1.0.0',
167
+ use_count INTEGER NOT NULL DEFAULT 0,
168
+ builtin INTEGER NOT NULL DEFAULT 0,
169
+ created_at INTEGER NOT NULL DEFAULT (unixepoch())
170
+ );
171
+ CREATE INDEX IF NOT EXISTS idx_skills_name ON skills(name);
172
+
173
+ -- 记忆表(MEMORY.md / USER.md / 摘要)
174
+ CREATE TABLE IF NOT EXISTS memory (
175
+ key TEXT PRIMARY KEY,
176
+ content TEXT NOT NULL,
177
+ kind TEXT NOT NULL DEFAULT 'note',
178
+ updated_at INTEGER NOT NULL DEFAULT (unixepoch())
179
+ );
180
+
181
+ -- 记忆摘要/历史(Honcho 风格)
182
+ CREATE TABLE IF NOT EXISTS memory_history (
183
+ id INTEGER PRIMARY KEY AUTOINCREMENT,
184
+ session_id TEXT,
185
+ summary TEXT NOT NULL,
186
+ type TEXT,
187
+ created_at INTEGER NOT NULL DEFAULT (unixepoch())
188
+ );
189
+ CREATE INDEX IF NOT EXISTS idx_memory_history_created ON memory_history(created_at);
190
+
191
+ -- 用户建模(Honcho 风格)
192
+ CREATE TABLE IF NOT EXISTS users (
193
+ id TEXT PRIMARY KEY,
194
+ name TEXT,
195
+ preferences TEXT,
196
+ traits TEXT,
197
+ created_at INTEGER NOT NULL DEFAULT (unixepoch()),
198
+ updated_at INTEGER NOT NULL DEFAULT (unixepoch())
199
+ );
200
+
201
+ -- 用户记忆条目
202
+ CREATE TABLE IF NOT EXISTS user_memory (
203
+ id INTEGER PRIMARY KEY AUTOINCREMENT,
204
+ user_id TEXT NOT NULL,
205
+ content TEXT NOT NULL,
206
+ category TEXT NOT NULL DEFAULT 'fact',
207
+ importance REAL NOT NULL DEFAULT 0.5,
208
+ created_at INTEGER NOT NULL DEFAULT (unixepoch()),
209
+ FOREIGN KEY (user_id) REFERENCES users(id)
210
+ );
211
+ CREATE INDEX IF NOT EXISTS idx_user_memory_user ON user_memory(user_id);
212
+
213
+ -- 知识库文档表
214
+ CREATE TABLE IF NOT EXISTS knowledge (
215
+ id TEXT PRIMARY KEY,
216
+ title TEXT NOT NULL,
217
+ content TEXT,
218
+ type TEXT DEFAULT 'markdown',
219
+ tags TEXT,
220
+ size INTEGER,
221
+ created_at INTEGER NOT NULL DEFAULT (unixepoch())
222
+ );
223
+ CREATE INDEX IF NOT EXISTS idx_knowledge_title ON knowledge(title);
224
+ `);
225
+ db.prepare('INSERT OR REPLACE INTO meta(key, value) VALUES(?, ?)').run('schema_version', String(exports.SCHEMA_VERSION));
226
+ }
227
+ ensureSchema() {
228
+ // 先检查 meta 表是否存在,判断是否全新库
229
+ try {
230
+ const metaTable = this.db.prepare("SELECT name FROM sqlite_master WHERE type='table' AND name='meta'").get();
231
+ if (!metaTable) {
232
+ // 全新库:直接建 V1(migrateToV1 内部会建 meta 表并写入版本)
233
+ this.migrateToV1(this.db);
234
+ this.debug('全新数据库初始化到 schema v1');
235
+ return;
236
+ }
237
+ // 已有库:读取版本号,按版本递增迁移
238
+ const row = this.db.prepare("SELECT value FROM meta WHERE key = 'schema_version'").get();
239
+ const currentVersion = row ? parseInt(String(row.value), 10) : 0;
240
+ for (let v = currentVersion + 1; v <= exports.SCHEMA_VERSION; v++) {
241
+ if (this.migrations[v]) {
242
+ this.migrations[v](this.db);
243
+ this.db.prepare('INSERT OR REPLACE INTO meta(key, value) VALUES(?, ?)').run('schema_version', String(v));
244
+ this.debug(`迁移到 schema v${v}`);
245
+ }
246
+ }
247
+ }
248
+ catch (e) {
249
+ console.error('[SQLiteStore] schema 初始化失败:', e);
250
+ throw e;
251
+ }
252
+ }
253
+ /* ========== 通用 KV 存储 ========== */
254
+ kvSet(namespace, key, value) {
255
+ const v = typeof value === 'string' ? value : JSON.stringify(value);
256
+ this.db.prepare('INSERT INTO kv(namespace, key, value, updated_at) VALUES(?, ?, ?, unixepoch()) ' +
257
+ 'ON CONFLICT(namespace, key) DO UPDATE SET value = excluded.value, updated_at = unixepoch()').run(namespace, key, this.encrypt('config', 'value', v));
258
+ }
259
+ kvGet(namespace, key, defaultValue) {
260
+ const row = this.db.prepare('SELECT value FROM kv WHERE namespace = ? AND key = ?').get(namespace, key);
261
+ if (!row)
262
+ return defaultValue;
263
+ const raw = this.decrypt('config', 'value', String(row.value));
264
+ try {
265
+ return JSON.parse(raw);
266
+ }
267
+ catch {
268
+ return raw;
269
+ }
270
+ }
271
+ kvDelete(namespace, key) {
272
+ this.db.prepare('DELETE FROM kv WHERE namespace = ? AND key = ?').run(namespace, key);
273
+ }
274
+ kvList(namespace) {
275
+ const rows = this.db.prepare('SELECT key, value FROM kv WHERE namespace = ? ORDER BY updated_at DESC').all(namespace);
276
+ return rows.map((r) => {
277
+ const raw = this.decrypt('config', 'value', String(r.value));
278
+ let value;
279
+ try {
280
+ value = JSON.parse(raw);
281
+ }
282
+ catch {
283
+ value = raw;
284
+ }
285
+ return { key: String(r.key), value };
286
+ });
287
+ }
288
+ /* ========== 任务 CRUD ========== */
289
+ taskUpsert(task) {
290
+ this.db.prepare(`INSERT INTO tasks(id, type, status, progress, input, result, error, model, created_at, started_at, completed_at)
291
+ VALUES(?, ?, ?, ?, ?, ?, ?, ?, unixepoch(), ?, ?)
292
+ ON CONFLICT(id) DO UPDATE SET
293
+ status = excluded.status,
294
+ progress = excluded.progress,
295
+ input = excluded.input,
296
+ result = excluded.result,
297
+ error = excluded.error,
298
+ model = excluded.model,
299
+ started_at = COALESCE(excluded.started_at, tasks.started_at),
300
+ completed_at = excluded.completed_at`).run(task.id, task.type, task.status, task.progress ?? 0, task.input !== undefined ? JSON.stringify(task.input) : null, task.result !== undefined ? JSON.stringify(task.result) : null, task.error ?? null, task.model ?? null, task.status === 'running' ? Date.now() : null, task.status === 'completed' || task.status === 'failed' ? Date.now() : null);
301
+ }
302
+ taskGet(id) {
303
+ const row = this.db.prepare('SELECT * FROM tasks WHERE id = ?').get(id);
304
+ if (row) {
305
+ if (row.input)
306
+ row.input = JSON.parse(String(row.input));
307
+ if (row.result)
308
+ row.result = JSON.parse(String(row.result));
309
+ }
310
+ return row;
311
+ }
312
+ taskList(options = {}) {
313
+ const limit = options.limit || 20;
314
+ const offset = options.offset || 0;
315
+ if (options.status) {
316
+ return this.db.prepare('SELECT * FROM tasks WHERE status = ? ORDER BY created_at DESC LIMIT ? OFFSET ?').all(options.status, limit, offset);
317
+ }
318
+ return this.db.prepare('SELECT * FROM tasks ORDER BY created_at DESC LIMIT ? OFFSET ?').all(limit, offset);
319
+ }
320
+ taskCount() {
321
+ const total = this.db.prepare('SELECT COUNT(*) as c FROM tasks').get().c;
322
+ const pending = this.db.prepare("SELECT COUNT(*) as c FROM tasks WHERE status = 'pending'").get().c;
323
+ const running = this.db.prepare("SELECT COUNT(*) as c FROM tasks WHERE status = 'running'").get().c;
324
+ return { total, pending, running };
325
+ }
326
+ taskDelete(id) {
327
+ this.db.prepare('DELETE FROM tasks WHERE id = ?').run(id);
328
+ }
329
+ /* ========== 模型 CRUD ========== */
330
+ modelUpsert(model) {
331
+ this.db.prepare(`INSERT INTO models(id, name, provider, api_base, api_key, context_window, max_output, supports_streaming, supports_vision)
332
+ VALUES(?, ?, ?, ?, ?, ?, ?, ?, ?)
333
+ ON CONFLICT(id) DO UPDATE SET
334
+ name = excluded.name, provider = excluded.provider, api_base = excluded.api_base,
335
+ api_key = excluded.api_key, context_window = excluded.context_window,
336
+ max_output = excluded.max_output, supports_streaming = excluded.supports_streaming,
337
+ supports_vision = excluded.supports_vision`).run(model.id, model.name, model.provider || 'openai-compatible', model.apiBase || null, this.encrypt('models', 'apiKey', model.apiKey || ''), model.contextWindow ?? null, model.maxOutput ?? null, model.supportsStreaming !== false ? 1 : 0, model.supportsVision ? 1 : 0);
338
+ }
339
+ modelList() {
340
+ const rows = this.db.prepare('SELECT * FROM models ORDER BY created_at').all();
341
+ return rows.map((r) => ({
342
+ ...r,
343
+ apiKey: this.decrypt('models', 'apiKey', String(r.api_key || '')),
344
+ }));
345
+ }
346
+ modelGet(id) {
347
+ const row = this.db.prepare('SELECT * FROM models WHERE id = ?').get(id);
348
+ if (row)
349
+ row.apiKey = this.decrypt('models', 'apiKey', String(row.api_key || ''));
350
+ return row;
351
+ }
352
+ /** 返回数据库原始行(api_key 保持加密态),供安全审计/验证使用 */
353
+ modelGetRaw(id) {
354
+ return this.db.prepare('SELECT * FROM models WHERE id = ?').get(id);
355
+ }
356
+ modelDelete(id) {
357
+ this.db.prepare('DELETE FROM models WHERE id = ?').run(id);
358
+ }
359
+ /* ========== 技能 CRUD ========== */
360
+ skillUpsert(skill) {
361
+ this.db.prepare(`INSERT INTO skills(id, name, description, trigger, prompt, tags, version, use_count, builtin)
362
+ VALUES(?, ?, ?, ?, ?, ?, ?, ?, ?)
363
+ ON CONFLICT(id) DO UPDATE SET
364
+ name = excluded.name, description = excluded.description, trigger = excluded.trigger,
365
+ prompt = excluded.prompt, tags = excluded.tags, version = excluded.version,
366
+ use_count = excluded.use_count, builtin = excluded.builtin`).run(skill.id, skill.name, skill.description || null, skill.trigger || null, skill.prompt || null, skill.tags ? JSON.stringify(skill.tags) : null, skill.version || '1.0.0', skill.useCount || 0, skill.builtin ? 1 : 0);
367
+ }
368
+ skillList() {
369
+ const rows = this.db.prepare('SELECT * FROM skills ORDER BY created_at').all();
370
+ return rows.map((r) => ({ ...r, tags: r.tags ? JSON.parse(String(r.tags)) : [] }));
371
+ }
372
+ skillSearch(query) {
373
+ const q = `%${query}%`;
374
+ return this.db.prepare('SELECT * FROM skills WHERE name LIKE ? OR description LIKE ? OR trigger LIKE ? ORDER BY use_count DESC').all(q, q, q);
375
+ }
376
+ skillDelete(id) {
377
+ this.db.prepare('DELETE FROM skills WHERE id = ?').run(id);
378
+ }
379
+ /* ========== 记忆 CRUD ========== */
380
+ memorySet(key, content, kind = 'note') {
381
+ this.db.prepare('INSERT INTO memory(key, content, kind, updated_at) VALUES(?, ?, ?, unixepoch()) ' +
382
+ 'ON CONFLICT(key) DO UPDATE SET content = excluded.content, kind = excluded.kind, updated_at = unixepoch()').run(key, content, kind);
383
+ }
384
+ memoryGet(key) {
385
+ const row = this.db.prepare('SELECT content FROM memory WHERE key = ?').get(key);
386
+ return row ? String(row.content) : undefined;
387
+ }
388
+ memoryList(kind) {
389
+ if (kind)
390
+ return this.db.prepare('SELECT * FROM memory WHERE kind = ? ORDER BY updated_at DESC').all(kind);
391
+ return this.db.prepare('SELECT * FROM memory ORDER BY updated_at DESC').all();
392
+ }
393
+ memoryAddHistory(sessionId, summary, type) {
394
+ this.db.prepare('INSERT INTO memory_history(session_id, summary, type) VALUES(?, ?, ?)').run(sessionId, summary, type || null);
395
+ }
396
+ memoryRecall(keyword, limit = 5) {
397
+ const q = `%${keyword}%`;
398
+ return this.db.prepare('SELECT * FROM memory_history WHERE summary LIKE ? ORDER BY created_at DESC LIMIT ?').all(q, limit);
399
+ }
400
+ /* ========== 用户建模(Honcho 风格) ========== */
401
+ userUpsert(user) {
402
+ this.db.prepare(`INSERT INTO users(id, name, preferences, traits, created_at, updated_at)
403
+ VALUES(?, ?, ?, ?, unixepoch(), unixepoch())
404
+ ON CONFLICT(id) DO UPDATE SET
405
+ name = excluded.name, preferences = excluded.preferences,
406
+ traits = excluded.traits, updated_at = unixepoch()`).run(user.id, user.name || null, user.preferences !== undefined ? JSON.stringify(user.preferences) : null, user.traits !== undefined ? JSON.stringify(user.traits) : null);
407
+ }
408
+ userGet(id) {
409
+ const row = this.db.prepare('SELECT * FROM users WHERE id = ?').get(id);
410
+ if (row) {
411
+ if (row.preferences)
412
+ row.preferences = JSON.parse(String(row.preferences));
413
+ if (row.traits)
414
+ row.traits = JSON.parse(String(row.traits));
415
+ }
416
+ return row;
417
+ }
418
+ userAddMemory(userId, content, category = 'fact', importance = 0.5) {
419
+ this.db.prepare('INSERT INTO user_memory(user_id, content, category, importance) VALUES(?, ?, ?, ?)')
420
+ .run(userId, content, category, importance);
421
+ }
422
+ userListMemory(userId, limit = 20) {
423
+ return this.db.prepare('SELECT * FROM user_memory WHERE user_id = ? ORDER BY importance DESC, created_at DESC LIMIT ?').all(userId, limit);
424
+ }
425
+ userSearchMemory(userId, keyword, limit = 10) {
426
+ const q = `%${keyword}%`;
427
+ return this.db.prepare('SELECT * FROM user_memory WHERE user_id = ? AND content LIKE ? ORDER BY importance DESC LIMIT ?').all(userId, q, limit);
428
+ }
429
+ /* ========== 知识库 CRUD ========== */
430
+ knowledgeUpsert(doc) {
431
+ this.db.prepare(`INSERT INTO knowledge(id, title, content, type, tags, size, created_at)
432
+ VALUES(?, ?, ?, ?, ?, ?, unixepoch())
433
+ ON CONFLICT(id) DO UPDATE SET
434
+ title = excluded.title, content = excluded.content, type = excluded.type,
435
+ tags = excluded.tags, size = excluded.size`).run(doc.id, doc.title, doc.content || null, doc.type || 'markdown', doc.tags ? JSON.stringify(doc.tags) : null, doc.size ?? (doc.content?.length || 0));
436
+ }
437
+ knowledgeList() {
438
+ const rows = this.db.prepare('SELECT id, title, type, tags, size, created_at FROM knowledge ORDER BY created_at').all();
439
+ return rows.map((r) => ({ ...r, tags: r.tags ? JSON.parse(String(r.tags)) : [] }));
440
+ }
441
+ knowledgeSearch(query) {
442
+ const q = `%${query}%`;
443
+ return this.db.prepare('SELECT * FROM knowledge WHERE title LIKE ? OR content LIKE ? ORDER BY created_at DESC').all(q, q);
444
+ }
445
+ knowledgeDelete(id) {
446
+ this.db.prepare('DELETE FROM knowledge WHERE id = ?').run(id);
447
+ }
448
+ /* ========== 统计与健康 ========== */
449
+ stats() {
450
+ const count = (table) => {
451
+ try {
452
+ return this.db.prepare(`SELECT COUNT(*) as c FROM ${table}`).get().c;
453
+ }
454
+ catch {
455
+ return 0;
456
+ }
457
+ };
458
+ return {
459
+ tasks: count('tasks'),
460
+ models: count('models'),
461
+ agents: count('agents'),
462
+ skills: count('skills'),
463
+ memory: count('memory'),
464
+ memoryHistory: count('memory_history'),
465
+ users: count('users'),
466
+ userMemory: count('user_memory'),
467
+ knowledge: count('knowledge'),
468
+ schemaVersion: exports.SCHEMA_VERSION,
469
+ };
470
+ }
471
+ /** 健康检查:执行简单查询验证数据库可访问 */
472
+ health() {
473
+ try {
474
+ const row = this.db.prepare("SELECT value FROM meta WHERE key = 'schema_version'").get();
475
+ return {
476
+ ok: true,
477
+ backend: 'sqlite',
478
+ version: parseInt(String(row.value), 10),
479
+ dbFile: this.dbFile(),
480
+ };
481
+ }
482
+ catch (e) {
483
+ return { ok: false, backend: 'error', version: 0, dbFile: this.dbFile() };
484
+ }
485
+ }
486
+ dbFile() {
487
+ // DatabaseSync 不直接暴露路径,通过环境变量或默认推断
488
+ return process.env.FH_DB_PATH || (0, path_1.join)(process.env.FH_HOME || (0, path_1.join)(process.env.HOME || '.', '.feihong-code'), 'feihong.db');
489
+ }
490
+ /** 关闭数据库连接 */
491
+ close() {
492
+ try {
493
+ this.db.close();
494
+ }
495
+ catch { /* 已关闭 */ }
496
+ }
497
+ }
498
+ exports.SQLiteStore = SQLiteStore;
499
+ /** 全局单例 */
500
+ let storeInstance = null;
501
+ function getStore(options) {
502
+ if (!storeInstance)
503
+ storeInstance = new SQLiteStore(options);
504
+ return storeInstance;
505
+ }
506
+ function resetStore() {
507
+ if (storeInstance) {
508
+ storeInstance.close();
509
+ storeInstance = null;
510
+ }
511
+ }
512
+ //# sourceMappingURL=sqlite-store.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sqlite-store.js","sourceRoot":"","sources":["../../src/shared/sqlite-store.ts"],"names":[],"mappings":"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"}