dbrain 0.1.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.
Files changed (76) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +205 -0
  3. package/dist/cli/connect.d.ts +2 -0
  4. package/dist/cli/connect.d.ts.map +1 -0
  5. package/dist/cli/connect.js +108 -0
  6. package/dist/cli/connect.js.map +1 -0
  7. package/dist/cli/index.d.ts +3 -0
  8. package/dist/cli/index.d.ts.map +1 -0
  9. package/dist/cli/index.js +46 -0
  10. package/dist/cli/index.js.map +1 -0
  11. package/dist/cli/init.d.ts +4 -0
  12. package/dist/cli/init.d.ts.map +1 -0
  13. package/dist/cli/init.js +177 -0
  14. package/dist/cli/init.js.map +1 -0
  15. package/dist/cli/start.d.ts +2 -0
  16. package/dist/cli/start.d.ts.map +1 -0
  17. package/dist/cli/start.js +33 -0
  18. package/dist/cli/start.js.map +1 -0
  19. package/dist/cli/status.d.ts +2 -0
  20. package/dist/cli/status.d.ts.map +1 -0
  21. package/dist/cli/status.js +30 -0
  22. package/dist/cli/status.js.map +1 -0
  23. package/dist/core/config.d.ts +15 -0
  24. package/dist/core/config.d.ts.map +1 -0
  25. package/dist/core/config.js +24 -0
  26. package/dist/core/config.js.map +1 -0
  27. package/dist/core/db.d.ts +4 -0
  28. package/dist/core/db.d.ts.map +1 -0
  29. package/dist/core/db.js +90 -0
  30. package/dist/core/db.js.map +1 -0
  31. package/dist/core/memory.d.ts +4 -0
  32. package/dist/core/memory.d.ts.map +1 -0
  33. package/dist/core/memory.js +9 -0
  34. package/dist/core/memory.js.map +1 -0
  35. package/dist/core/models.d.ts +67 -0
  36. package/dist/core/models.d.ts.map +1 -0
  37. package/dist/core/models.js +29 -0
  38. package/dist/core/models.js.map +1 -0
  39. package/dist/dashboard/index.html +676 -0
  40. package/dist/dashboard/server.d.ts +2 -0
  41. package/dist/dashboard/server.d.ts.map +1 -0
  42. package/dist/dashboard/server.js +20 -0
  43. package/dist/dashboard/server.js.map +1 -0
  44. package/dist/mcp/server.d.ts +5 -0
  45. package/dist/mcp/server.d.ts.map +1 -0
  46. package/dist/mcp/server.js +386 -0
  47. package/dist/mcp/server.js.map +1 -0
  48. package/dist/server/index.d.ts +7 -0
  49. package/dist/server/index.d.ts.map +1 -0
  50. package/dist/server/index.js +41 -0
  51. package/dist/server/index.js.map +1 -0
  52. package/dist/server/routes/conversations.d.ts +3 -0
  53. package/dist/server/routes/conversations.d.ts.map +1 -0
  54. package/dist/server/routes/conversations.js +86 -0
  55. package/dist/server/routes/conversations.js.map +1 -0
  56. package/dist/server/routes/entities.d.ts +3 -0
  57. package/dist/server/routes/entities.d.ts.map +1 -0
  58. package/dist/server/routes/entities.js +51 -0
  59. package/dist/server/routes/entities.js.map +1 -0
  60. package/dist/server/routes/facts.d.ts +3 -0
  61. package/dist/server/routes/facts.d.ts.map +1 -0
  62. package/dist/server/routes/facts.js +41 -0
  63. package/dist/server/routes/facts.js.map +1 -0
  64. package/dist/server/routes/health.d.ts +3 -0
  65. package/dist/server/routes/health.d.ts.map +1 -0
  66. package/dist/server/routes/health.js +72 -0
  67. package/dist/server/routes/health.js.map +1 -0
  68. package/dist/server/routes/search.d.ts +3 -0
  69. package/dist/server/routes/search.d.ts.map +1 -0
  70. package/dist/server/routes/search.js +60 -0
  71. package/dist/server/routes/search.js.map +1 -0
  72. package/dist/server/routes/workspace.d.ts +3 -0
  73. package/dist/server/routes/workspace.d.ts.map +1 -0
  74. package/dist/server/routes/workspace.js +34 -0
  75. package/dist/server/routes/workspace.js.map +1 -0
  76. package/package.json +82 -0
@@ -0,0 +1,33 @@
1
+ import { homedir } from 'node:os';
2
+ import { resolve } from 'node:path';
3
+ import pc from 'picocolors';
4
+ import { loadConfig } from '../core/config.js';
5
+ import { createDatabase } from '../core/db.js';
6
+ import { startDashboard } from '../dashboard/server.js';
7
+ import { createServer } from '../server/index.js';
8
+ function resolveDataPath(pathArg) {
9
+ if (pathArg)
10
+ return resolve(pathArg.replace('~', homedir()));
11
+ return resolve(homedir(), '.dbrain');
12
+ }
13
+ export async function start(pathArg) {
14
+ const dataPath = resolveDataPath(pathArg);
15
+ const config = { ...loadConfig(dataPath), dataPath };
16
+ const db = createDatabase(config);
17
+ const app = createServer(config, db);
18
+ const address = await app.listen({ port: config.port, host: config.host });
19
+ const dashboardPort = config.port + 1;
20
+ startDashboard(dashboardPort);
21
+ const identity = db.prepare("SELECT content FROM documents WHERE key = 'identity'").get();
22
+ const name = identity?.content?.match(/\*\*Name:\*\* (.+)/)?.[1] || 'dbrain';
23
+ console.log(`
24
+ ${pc.cyan(name)} is awake
25
+
26
+ ${pc.green('API')}: ${address}
27
+ ${pc.green('MCP')}: ${address}/mcp
28
+ ${pc.green('Dashboard')}: http://localhost:${dashboardPort}
29
+ ${pc.green('Brain')}: ${config.dataPath}
30
+ ${pc.green('Token')}: ${config.token.slice(0, 16)}...
31
+ `);
32
+ }
33
+ //# sourceMappingURL=start.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"start.js","sourceRoot":"","sources":["../../src/cli/start.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEpC,OAAO,EAAE,MAAM,YAAY,CAAC;AAE5B,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAC/C,OAAO,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAC/C,OAAO,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AACxD,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAElD,SAAS,eAAe,CAAC,OAAgB;IACvC,IAAI,OAAO;QAAE,OAAO,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC;IAC7D,OAAO,OAAO,CAAC,OAAO,EAAE,EAAE,SAAS,CAAC,CAAC;AACvC,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,KAAK,CAAC,OAAgB;IAC1C,MAAM,QAAQ,GAAG,eAAe,CAAC,OAAO,CAAC,CAAC;IAC1C,MAAM,MAAM,GAAG,EAAE,GAAG,UAAU,CAAC,QAAQ,CAAC,EAAE,QAAQ,EAAE,CAAC;IACrD,MAAM,EAAE,GAAG,cAAc,CAAC,MAAM,CAAC,CAAC;IAClC,MAAM,GAAG,GAAG,YAAY,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;IAErC,MAAM,OAAO,GAAG,MAAM,GAAG,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC;IAE3E,MAAM,aAAa,GAAG,MAAM,CAAC,IAAI,GAAG,CAAC,CAAC;IACtC,cAAc,CAAC,aAAa,CAAC,CAAC;IAE9B,MAAM,QAAQ,GAAG,EAAE,CAAC,OAAO,CAAC,sDAAsD,CAAC,CAAC,GAAG,EAE1E,CAAC;IACd,MAAM,IAAI,GAAG,QAAQ,EAAE,OAAO,EAAE,KAAK,CAAC,oBAAoB,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,QAAQ,CAAC;IAE7E,OAAO,CAAC,GAAG,CAAC;EACZ,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC;;IAEX,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC,WAAW,OAAO;IACjC,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC,WAAW,OAAO;IACjC,EAAE,CAAC,KAAK,CAAC,WAAW,CAAC,sBAAsB,aAAa;IACxD,EAAE,CAAC,KAAK,CAAC,OAAO,CAAC,SAAS,MAAM,CAAC,QAAQ;IACzC,EAAE,CAAC,KAAK,CAAC,OAAO,CAAC,SAAS,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC;CACtD,CAAC,CAAC;AACH,CAAC"}
@@ -0,0 +1,2 @@
1
+ export declare function status(pathArg?: string): Promise<void>;
2
+ //# sourceMappingURL=status.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"status.d.ts","sourceRoot":"","sources":["../../src/cli/status.ts"],"names":[],"mappings":"AAaA,wBAAsB,MAAM,CAAC,OAAO,CAAC,EAAE,MAAM,iBAqB5C"}
@@ -0,0 +1,30 @@
1
+ import { existsSync, statSync } from 'node:fs';
2
+ import { homedir } from 'node:os';
3
+ import { resolve, join } from 'node:path';
4
+ import pc from 'picocolors';
5
+ import { loadConfig } from '../core/config.js';
6
+ function resolveDataPath(pathArg) {
7
+ if (pathArg)
8
+ return resolve(pathArg.replace('~', homedir()));
9
+ return resolve(homedir(), '.dbrain');
10
+ }
11
+ export async function status(pathArg) {
12
+ const dataPath = resolveDataPath(pathArg);
13
+ if (!existsSync(join(dataPath, 'config.json'))) {
14
+ console.log(`${pc.red('Not initialized.')} Run: dbrain init`);
15
+ return;
16
+ }
17
+ const config = loadConfig(dataPath);
18
+ const dbPath = join(dataPath, 'dbrain.db');
19
+ const dbExists = existsSync(dbPath);
20
+ const dbSize = dbExists ? statSync(dbPath).size : 0;
21
+ console.log(`
22
+ ${pc.cyan('dbrain')} status
23
+
24
+ ${pc.green('Data')}: ${config.dataPath}
25
+ ${pc.green('Port')}: ${config.port}
26
+ ${pc.green('Host')}: ${config.host}
27
+ ${pc.green('Database')}: ${dbExists ? `${(dbSize / 1024).toFixed(1)} KB` : 'not created'}
28
+ `);
29
+ }
30
+ //# sourceMappingURL=status.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"status.js","sourceRoot":"","sources":["../../src/cli/status.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAC/C,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAE1C,OAAO,EAAE,MAAM,YAAY,CAAC;AAE5B,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAE/C,SAAS,eAAe,CAAC,OAAgB;IACvC,IAAI,OAAO;QAAE,OAAO,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC;IAC7D,OAAO,OAAO,CAAC,OAAO,EAAE,EAAE,SAAS,CAAC,CAAC;AACvC,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,MAAM,CAAC,OAAgB;IAC3C,MAAM,QAAQ,GAAG,eAAe,CAAC,OAAO,CAAC,CAAC;IAE1C,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,QAAQ,EAAE,aAAa,CAAC,CAAC,EAAE,CAAC;QAC/C,OAAO,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,kBAAkB,CAAC,mBAAmB,CAAC,CAAC;QAC9D,OAAO;IACT,CAAC;IAED,MAAM,MAAM,GAAG,UAAU,CAAC,QAAQ,CAAC,CAAC;IACpC,MAAM,MAAM,GAAG,IAAI,CAAC,QAAQ,EAAE,WAAW,CAAC,CAAC;IAC3C,MAAM,QAAQ,GAAG,UAAU,CAAC,MAAM,CAAC,CAAC;IACpC,MAAM,MAAM,GAAG,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;IAEpD,OAAO,CAAC,GAAG,CAAC;EACZ,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC;;IAEf,EAAE,CAAC,KAAK,CAAC,MAAM,CAAC,SAAS,MAAM,CAAC,QAAQ;IACxC,EAAE,CAAC,KAAK,CAAC,MAAM,CAAC,SAAS,MAAM,CAAC,IAAI;IACpC,EAAE,CAAC,KAAK,CAAC,MAAM,CAAC,SAAS,MAAM,CAAC,IAAI;IACpC,EAAE,CAAC,KAAK,CAAC,UAAU,CAAC,KAAK,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,aAAa;CACzF,CAAC,CAAC;AACH,CAAC"}
@@ -0,0 +1,15 @@
1
+ import { z } from 'zod';
2
+ export declare const ConfigSchema: z.ZodObject<{
3
+ dataPath: z.ZodString;
4
+ port: z.ZodDefault<z.ZodNumber>;
5
+ host: z.ZodDefault<z.ZodString>;
6
+ token: z.ZodString;
7
+ tiers: z.ZodDefault<z.ZodObject<{
8
+ hotDays: z.ZodDefault<z.ZodNumber>;
9
+ hotMinAccess: z.ZodDefault<z.ZodNumber>;
10
+ warmDays: z.ZodDefault<z.ZodNumber>;
11
+ }, z.core.$strip>>;
12
+ }, z.core.$strip>;
13
+ export type Config = z.infer<typeof ConfigSchema>;
14
+ export declare function loadConfig(dataPath: string): Config;
15
+ //# sourceMappingURL=config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/core/config.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,eAAO,MAAM,YAAY;;;;;;;;;;iBAYvB,CAAC;AAEH,MAAM,MAAM,MAAM,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,YAAY,CAAC,CAAC;AAElD,wBAAgB,UAAU,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAMnD"}
@@ -0,0 +1,24 @@
1
+ import { readFileSync, existsSync } from 'node:fs';
2
+ import { join } from 'node:path';
3
+ import { z } from 'zod';
4
+ export const ConfigSchema = z.object({
5
+ dataPath: z.string(),
6
+ port: z.number().default(7878),
7
+ host: z.string().default('0.0.0.0'),
8
+ token: z.string(),
9
+ tiers: z
10
+ .object({
11
+ hotDays: z.number().default(7),
12
+ hotMinAccess: z.number().default(10),
13
+ warmDays: z.number().default(30),
14
+ })
15
+ .default({ hotDays: 7, hotMinAccess: 10, warmDays: 30 }),
16
+ });
17
+ export function loadConfig(dataPath) {
18
+ const configPath = join(dataPath, 'config.json');
19
+ if (!existsSync(configPath)) {
20
+ throw new Error(`Config not found at ${configPath}. Run 'dbrain init' first.`);
21
+ }
22
+ return ConfigSchema.parse(JSON.parse(readFileSync(configPath, 'utf-8')));
23
+ }
24
+ //# sourceMappingURL=config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/core/config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACnD,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAEjC,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,MAAM,CAAC,MAAM,YAAY,GAAG,CAAC,CAAC,MAAM,CAAC;IACnC,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE;IACpB,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC;IAC9B,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,OAAO,CAAC,SAAS,CAAC;IACnC,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE;IACjB,KAAK,EAAE,CAAC;SACL,MAAM,CAAC;QACN,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC;QAC9B,YAAY,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,OAAO,CAAC,EAAE,CAAC;QACpC,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,OAAO,CAAC,EAAE,CAAC;KACjC,CAAC;SACD,OAAO,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,YAAY,EAAE,EAAE,EAAE,QAAQ,EAAE,EAAE,EAAE,CAAC;CAC3D,CAAC,CAAC;AAIH,MAAM,UAAU,UAAU,CAAC,QAAgB;IACzC,MAAM,UAAU,GAAG,IAAI,CAAC,QAAQ,EAAE,aAAa,CAAC,CAAC;IACjD,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;QAC5B,MAAM,IAAI,KAAK,CAAC,uBAAuB,UAAU,4BAA4B,CAAC,CAAC;IACjF,CAAC;IACD,OAAO,YAAY,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC;AAC3E,CAAC"}
@@ -0,0 +1,4 @@
1
+ import Database from 'better-sqlite3';
2
+ import type { Config } from './config.js';
3
+ export declare function createDatabase(config: Config): Database.Database;
4
+ //# sourceMappingURL=db.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"db.d.ts","sourceRoot":"","sources":["../../src/core/db.ts"],"names":[],"mappings":"AAEA,OAAO,QAAQ,MAAM,gBAAgB,CAAC;AAEtC,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAkF1C,wBAAgB,cAAc,CAAC,MAAM,EAAE,MAAM,GAAG,QAAQ,CAAC,QAAQ,CAOhE"}
@@ -0,0 +1,90 @@
1
+ import { join } from 'node:path';
2
+ import Database from 'better-sqlite3';
3
+ const SCHEMA = `
4
+ CREATE TABLE IF NOT EXISTS entities (
5
+ id TEXT PRIMARY KEY,
6
+ name TEXT NOT NULL,
7
+ type TEXT NOT NULL,
8
+ category TEXT NOT NULL,
9
+ status TEXT DEFAULT 'active',
10
+ created_at TEXT NOT NULL,
11
+ updated_at TEXT NOT NULL,
12
+ metadata TEXT
13
+ );
14
+
15
+ CREATE TABLE IF NOT EXISTS facts (
16
+ id TEXT PRIMARY KEY,
17
+ entity_id TEXT NOT NULL REFERENCES entities(id) ON DELETE CASCADE,
18
+ fact TEXT NOT NULL,
19
+ category TEXT NOT NULL,
20
+ timestamp TEXT NOT NULL,
21
+ status TEXT DEFAULT 'active',
22
+ superseded_by TEXT,
23
+ related_entities TEXT DEFAULT '[]',
24
+ last_accessed TEXT NOT NULL,
25
+ access_count INTEGER DEFAULT 0,
26
+ tier TEXT DEFAULT 'warm',
27
+ source TEXT
28
+ );
29
+
30
+ CREATE VIRTUAL TABLE IF NOT EXISTS facts_fts USING fts5(
31
+ fact, entity_id, category,
32
+ content='facts', content_rowid='rowid'
33
+ );
34
+
35
+ CREATE TABLE IF NOT EXISTS documents (
36
+ key TEXT PRIMARY KEY,
37
+ title TEXT NOT NULL,
38
+ content TEXT NOT NULL,
39
+ updated_at TEXT NOT NULL
40
+ );
41
+
42
+ CREATE TABLE IF NOT EXISTS conversations (
43
+ id TEXT PRIMARY KEY,
44
+ source TEXT NOT NULL,
45
+ started_at TEXT NOT NULL,
46
+ ended_at TEXT,
47
+ summary TEXT
48
+ );
49
+
50
+ CREATE TABLE IF NOT EXISTS messages (
51
+ id TEXT PRIMARY KEY,
52
+ conversation_id TEXT NOT NULL REFERENCES conversations(id) ON DELETE CASCADE,
53
+ role TEXT NOT NULL,
54
+ content TEXT NOT NULL,
55
+ timestamp TEXT NOT NULL,
56
+ processed INTEGER DEFAULT 0
57
+ );
58
+
59
+ CREATE INDEX IF NOT EXISTS idx_messages_conversation ON messages(conversation_id, timestamp);
60
+ CREATE INDEX IF NOT EXISTS idx_messages_unprocessed ON messages(processed) WHERE processed = 0;
61
+
62
+ CREATE INDEX IF NOT EXISTS idx_facts_entity ON facts(entity_id);
63
+ CREATE INDEX IF NOT EXISTS idx_facts_tier ON facts(tier, last_accessed DESC);
64
+
65
+ CREATE TRIGGER IF NOT EXISTS facts_ai AFTER INSERT ON facts BEGIN
66
+ INSERT INTO facts_fts(rowid, fact, entity_id, category)
67
+ VALUES (new.rowid, new.fact, new.entity_id, new.category);
68
+ END;
69
+
70
+ CREATE TRIGGER IF NOT EXISTS facts_ad AFTER DELETE ON facts BEGIN
71
+ INSERT INTO facts_fts(facts_fts, rowid, fact, entity_id, category)
72
+ VALUES('delete', old.rowid, old.fact, old.entity_id, old.category);
73
+ END;
74
+
75
+ CREATE TRIGGER IF NOT EXISTS facts_au AFTER UPDATE ON facts BEGIN
76
+ INSERT INTO facts_fts(facts_fts, rowid, fact, entity_id, category)
77
+ VALUES('delete', old.rowid, old.fact, old.entity_id, old.category);
78
+ INSERT INTO facts_fts(rowid, fact, entity_id, category)
79
+ VALUES (new.rowid, new.fact, new.entity_id, new.category);
80
+ END;
81
+ `;
82
+ export function createDatabase(config) {
83
+ const dbPath = join(config.dataPath, 'dbrain.db');
84
+ const db = new Database(dbPath);
85
+ db.pragma('journal_mode = WAL');
86
+ db.pragma('foreign_keys = ON');
87
+ db.exec(SCHEMA);
88
+ return db;
89
+ }
90
+ //# sourceMappingURL=db.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"db.js","sourceRoot":"","sources":["../../src/core/db.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAEjC,OAAO,QAAQ,MAAM,gBAAgB,CAAC;AAItC,MAAM,MAAM,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA8Ed,CAAC;AAEF,MAAM,UAAU,cAAc,CAAC,MAAc;IAC3C,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,QAAQ,EAAE,WAAW,CAAC,CAAC;IAClD,MAAM,EAAE,GAAG,IAAI,QAAQ,CAAC,MAAM,CAAC,CAAC;IAChC,EAAE,CAAC,MAAM,CAAC,oBAAoB,CAAC,CAAC;IAChC,EAAE,CAAC,MAAM,CAAC,mBAAmB,CAAC,CAAC;IAC/B,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IAChB,OAAO,EAAE,CAAC;AACZ,CAAC"}
@@ -0,0 +1,4 @@
1
+ import type { Config } from './config.js';
2
+ import type { Tier } from './models.js';
3
+ export declare function computeTier(lastAccessed: string, accessCount: number, tiers: Config['tiers']): Tier;
4
+ //# sourceMappingURL=memory.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"memory.d.ts","sourceRoot":"","sources":["../../src/core/memory.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAC1C,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,aAAa,CAAC;AAExC,wBAAgB,WAAW,CACzB,YAAY,EAAE,MAAM,EACpB,WAAW,EAAE,MAAM,EACnB,KAAK,EAAE,MAAM,CAAC,OAAO,CAAC,GACrB,IAAI,CAMN"}
@@ -0,0 +1,9 @@
1
+ export function computeTier(lastAccessed, accessCount, tiers) {
2
+ const daysSince = Math.floor((Date.now() - new Date(lastAccessed).getTime()) / 86_400_000);
3
+ if (daysSince <= tiers.hotDays || accessCount >= tiers.hotMinAccess)
4
+ return 'hot';
5
+ if (daysSince <= tiers.warmDays)
6
+ return 'warm';
7
+ return 'cold';
8
+ }
9
+ //# sourceMappingURL=memory.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"memory.js","sourceRoot":"","sources":["../../src/core/memory.ts"],"names":[],"mappings":"AAGA,MAAM,UAAU,WAAW,CACzB,YAAoB,EACpB,WAAmB,EACnB,KAAsB;IAEtB,MAAM,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,IAAI,CAAC,YAAY,CAAC,CAAC,OAAO,EAAE,CAAC,GAAG,UAAU,CAAC,CAAC;IAE3F,IAAI,SAAS,IAAI,KAAK,CAAC,OAAO,IAAI,WAAW,IAAI,KAAK,CAAC,YAAY;QAAE,OAAO,KAAK,CAAC;IAClF,IAAI,SAAS,IAAI,KAAK,CAAC,QAAQ;QAAE,OAAO,MAAM,CAAC;IAC/C,OAAO,MAAM,CAAC;AAChB,CAAC"}
@@ -0,0 +1,67 @@
1
+ import { z } from 'zod';
2
+ export declare const EntityType: z.ZodEnum<{
3
+ person: "person";
4
+ system: "system";
5
+ resource: "resource";
6
+ project: "project";
7
+ event: "event";
8
+ }>;
9
+ export type EntityType = z.infer<typeof EntityType>;
10
+ export declare const ParaCategory: z.ZodEnum<{
11
+ areas: "areas";
12
+ projects: "projects";
13
+ resources: "resources";
14
+ archives: "archives";
15
+ }>;
16
+ export type ParaCategory = z.infer<typeof ParaCategory>;
17
+ export declare const Tier: z.ZodEnum<{
18
+ hot: "hot";
19
+ warm: "warm";
20
+ cold: "cold";
21
+ }>;
22
+ export type Tier = z.infer<typeof Tier>;
23
+ export declare const FactSchema: z.ZodObject<{
24
+ id: z.ZodString;
25
+ entityId: z.ZodString;
26
+ fact: z.ZodString;
27
+ category: z.ZodString;
28
+ timestamp: z.ZodString;
29
+ status: z.ZodDefault<z.ZodEnum<{
30
+ active: "active";
31
+ superseded: "superseded";
32
+ }>>;
33
+ supersededBy: z.ZodDefault<z.ZodNullable<z.ZodString>>;
34
+ relatedEntities: z.ZodDefault<z.ZodArray<z.ZodString>>;
35
+ lastAccessed: z.ZodString;
36
+ accessCount: z.ZodDefault<z.ZodNumber>;
37
+ tier: z.ZodDefault<z.ZodEnum<{
38
+ hot: "hot";
39
+ warm: "warm";
40
+ cold: "cold";
41
+ }>>;
42
+ source: z.ZodDefault<z.ZodNullable<z.ZodString>>;
43
+ }, z.core.$strip>;
44
+ export type Fact = z.infer<typeof FactSchema>;
45
+ export declare const EntitySchema: z.ZodObject<{
46
+ id: z.ZodString;
47
+ name: z.ZodString;
48
+ type: z.ZodEnum<{
49
+ person: "person";
50
+ system: "system";
51
+ resource: "resource";
52
+ project: "project";
53
+ event: "event";
54
+ }>;
55
+ category: z.ZodEnum<{
56
+ areas: "areas";
57
+ projects: "projects";
58
+ resources: "resources";
59
+ archives: "archives";
60
+ }>;
61
+ status: z.ZodDefault<z.ZodString>;
62
+ createdAt: z.ZodString;
63
+ updatedAt: z.ZodString;
64
+ metadata: z.ZodDefault<z.ZodNullable<z.ZodRecord<z.ZodString, z.ZodUnknown>>>;
65
+ }, z.core.$strip>;
66
+ export type Entity = z.infer<typeof EntitySchema>;
67
+ //# sourceMappingURL=models.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"models.d.ts","sourceRoot":"","sources":["../../src/core/models.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,eAAO,MAAM,UAAU;;;;;;EAA+D,CAAC;AACvF,MAAM,MAAM,UAAU,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,UAAU,CAAC,CAAC;AAEpD,eAAO,MAAM,YAAY;;;;;EAAyD,CAAC;AACnF,MAAM,MAAM,YAAY,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,YAAY,CAAC,CAAC;AAExD,eAAO,MAAM,IAAI;;;;EAAkC,CAAC;AACpD,MAAM,MAAM,IAAI,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,IAAI,CAAC,CAAC;AAExC,eAAO,MAAM,UAAU;;;;;;;;;;;;;;;;;;;;iBAarB,CAAC;AAEH,MAAM,MAAM,IAAI,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,UAAU,CAAC,CAAC;AAE9C,eAAO,MAAM,YAAY;;;;;;;;;;;;;;;;;;;;iBASvB,CAAC;AAEH,MAAM,MAAM,MAAM,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,YAAY,CAAC,CAAC"}
@@ -0,0 +1,29 @@
1
+ import { z } from 'zod';
2
+ export const EntityType = z.enum(['project', 'person', 'system', 'event', 'resource']);
3
+ export const ParaCategory = z.enum(['projects', 'areas', 'resources', 'archives']);
4
+ export const Tier = z.enum(['hot', 'warm', 'cold']);
5
+ export const FactSchema = z.object({
6
+ id: z.string(),
7
+ entityId: z.string(),
8
+ fact: z.string(),
9
+ category: z.string(),
10
+ timestamp: z.string(),
11
+ status: z.enum(['active', 'superseded']).default('active'),
12
+ supersededBy: z.string().nullable().default(null),
13
+ relatedEntities: z.array(z.string()).default([]),
14
+ lastAccessed: z.string(),
15
+ accessCount: z.number().default(0),
16
+ tier: Tier.default('warm'),
17
+ source: z.string().nullable().default(null),
18
+ });
19
+ export const EntitySchema = z.object({
20
+ id: z.string(),
21
+ name: z.string(),
22
+ type: EntityType,
23
+ category: ParaCategory,
24
+ status: z.string().default('active'),
25
+ createdAt: z.string(),
26
+ updatedAt: z.string(),
27
+ metadata: z.record(z.string(), z.unknown()).nullable().default(null),
28
+ });
29
+ //# sourceMappingURL=models.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"models.js","sourceRoot":"","sources":["../../src/core/models.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,MAAM,CAAC,MAAM,UAAU,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,SAAS,EAAE,QAAQ,EAAE,QAAQ,EAAE,OAAO,EAAE,UAAU,CAAC,CAAC,CAAC;AAGvF,MAAM,CAAC,MAAM,YAAY,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,UAAU,EAAE,OAAO,EAAE,WAAW,EAAE,UAAU,CAAC,CAAC,CAAC;AAGnF,MAAM,CAAC,MAAM,IAAI,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;AAGpD,MAAM,CAAC,MAAM,UAAU,GAAG,CAAC,CAAC,MAAM,CAAC;IACjC,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE;IACd,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE;IACpB,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE;IAChB,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE;IACpB,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE;IACrB,MAAM,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,QAAQ,EAAE,YAAY,CAAC,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAC;IAC1D,YAAY,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC;IACjD,eAAe,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC;IAChD,YAAY,EAAE,CAAC,CAAC,MAAM,EAAE;IACxB,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC;IAClC,IAAI,EAAE,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC;IAC1B,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC;CAC5C,CAAC,CAAC;AAIH,MAAM,CAAC,MAAM,YAAY,GAAG,CAAC,CAAC,MAAM,CAAC;IACnC,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE;IACd,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE;IAChB,IAAI,EAAE,UAAU;IAChB,QAAQ,EAAE,YAAY;IACtB,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,OAAO,CAAC,QAAQ,CAAC;IACpC,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE;IACrB,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE;IACrB,QAAQ,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,QAAQ,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC;CACrE,CAAC,CAAC"}