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,20 @@
1
+ import { readFileSync } from 'node:fs';
2
+ import { join, dirname } from 'node:path';
3
+ import { fileURLToPath } from 'node:url';
4
+ import Fastify from 'fastify';
5
+ const __dirname = dirname(fileURLToPath(import.meta.url));
6
+ export function startDashboard(port) {
7
+ const app = Fastify();
8
+ const html = readFileSync(join(__dirname, 'index.html'), 'utf-8');
9
+ app.get('/', (_, reply) => {
10
+ reply.type('text/html').send(html);
11
+ });
12
+ app.listen({ port, host: '0.0.0.0' }, (err) => {
13
+ if (err) {
14
+ console.error(`Dashboard failed to start: ${err.message}`);
15
+ return;
16
+ }
17
+ console.log(`Dashboard: http://localhost:${port}`);
18
+ });
19
+ }
20
+ //# sourceMappingURL=server.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server.js","sourceRoot":"","sources":["../../src/dashboard/server.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACvC,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAEzC,OAAO,OAAO,MAAM,SAAS,CAAC;AAE9B,MAAM,SAAS,GAAG,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;AAE1D,MAAM,UAAU,cAAc,CAAC,IAAY;IACzC,MAAM,GAAG,GAAG,OAAO,EAAE,CAAC;IACtB,MAAM,IAAI,GAAG,YAAY,CAAC,IAAI,CAAC,SAAS,EAAE,YAAY,CAAC,EAAE,OAAO,CAAC,CAAC;IAElE,GAAG,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,CAAC,EAAE,KAAK,EAAE,EAAE;QACxB,KAAK,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACrC,CAAC,CAAC,CAAC;IAEH,GAAG,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,SAAS,EAAE,EAAE,CAAC,GAAG,EAAE,EAAE;QAC5C,IAAI,GAAG,EAAE,CAAC;YACR,OAAO,CAAC,KAAK,CAAC,8BAA8B,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC;YAC3D,OAAO;QACT,CAAC;QACD,OAAO,CAAC,GAAG,CAAC,+BAA+B,IAAI,EAAE,CAAC,CAAC;IACrD,CAAC,CAAC,CAAC;AACL,CAAC"}
@@ -0,0 +1,5 @@
1
+ import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
2
+ import type { FastifyInstance } from 'fastify';
3
+ export declare function createMcpServer(app: FastifyInstance): McpServer;
4
+ export declare function mountMcp(app: FastifyInstance): void;
5
+ //# sourceMappingURL=server.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../src/mcp/server.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAEpE,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,SAAS,CAAC;AAO/C,wBAAgB,eAAe,CAAC,GAAG,EAAE,eAAe,aAicnD;AA0BD,wBAAgB,QAAQ,CAAC,GAAG,EAAE,eAAe,QAmC5C"}
@@ -0,0 +1,386 @@
1
+ import { randomBytes } from 'node:crypto';
2
+ import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
3
+ import { StreamableHTTPServerTransport } from '@modelcontextprotocol/sdk/server/streamableHttp.js';
4
+ import { z } from 'zod';
5
+ function genId(prefix) {
6
+ return `${prefix}_${randomBytes(12).toString('base64url')}`;
7
+ }
8
+ export function createMcpServer(app) {
9
+ const db = app.db;
10
+ const mcp = new McpServer({
11
+ name: 'dbrain',
12
+ version: '0.1.0',
13
+ });
14
+ // --- brain context: auto-loaded resource ---
15
+ mcp.registerResource('brain', 'dbrain://brain', {
16
+ title: 'dbrain',
17
+ description: 'Your connected AI brain — identity, user, and how to use memory tools',
18
+ mimeType: 'text/plain',
19
+ }, async () => {
20
+ const identity = db.prepare("SELECT content FROM documents WHERE key = 'identity'").get();
21
+ const user = db.prepare("SELECT content FROM documents WHERE key = 'user'").get();
22
+ const { entities } = db.prepare('SELECT COUNT(*) as entities FROM entities').get();
23
+ const { facts } = db.prepare('SELECT COUNT(*) as facts FROM facts').get();
24
+ const lines = [
25
+ 'You have an AI brain connected (dbrain).',
26
+ '',
27
+ identity?.content || '',
28
+ '',
29
+ user?.content || '',
30
+ '',
31
+ `Brain stats: ${entities} entities, ${facts} facts stored.`,
32
+ '',
33
+ 'IMPORTANT: Use the `recall` tool BEFORE answering any question about the user, their preferences, projects, or past conversations.',
34
+ 'Use `remember` to save new facts when the user shares something worth remembering.',
35
+ ];
36
+ return {
37
+ contents: [
38
+ {
39
+ uri: 'dbrain://brain',
40
+ text: lines.join('\n'),
41
+ },
42
+ ],
43
+ };
44
+ });
45
+ // --- wake_up: first thing an AI should call ---
46
+ mcp.registerTool('wake_up', {
47
+ description: `Call this ONCE at the start of every conversation. Returns your identity, the user profile, and behavioral rules. You are not ready to help until you've called this.`,
48
+ }, async () => {
49
+ const docs = db.prepare('SELECT key, title, content FROM documents ORDER BY key').all();
50
+ const { entities } = db.prepare('SELECT COUNT(*) as entities FROM entities').get();
51
+ const { facts } = db.prepare('SELECT COUNT(*) as facts FROM facts').get();
52
+ return {
53
+ content: [
54
+ {
55
+ type: 'text',
56
+ text: JSON.stringify({ documents: docs, stats: { entities, facts } }),
57
+ },
58
+ ],
59
+ };
60
+ });
61
+ // --- recall: search memory ---
62
+ mcp.registerTool('recall', {
63
+ description: `Search your memory. Use this BEFORE answering any question about the user, their projects, preferences, or past conversations. If you're not sure, search first.`,
64
+ inputSchema: {
65
+ query: z.string().describe('What to search for'),
66
+ limit: z.number().optional().default(10).describe('Max results'),
67
+ },
68
+ }, async ({ query, limit }) => {
69
+ const ftsQuery = query.split(/\s+/).filter(Boolean).join(' OR ');
70
+ const results = db
71
+ .prepare(`
72
+ SELECT f.*, e.name as entity_name, e.type as entity_type, rank
73
+ FROM facts_fts fts
74
+ JOIN facts f ON f.rowid = fts.rowid
75
+ JOIN entities e ON e.id = f.entity_id
76
+ WHERE facts_fts MATCH ?
77
+ ORDER BY rank LIMIT ?
78
+ `)
79
+ .all(ftsQuery, limit);
80
+ const now = new Date().toISOString().split('T')[0];
81
+ const bumpStmt = db.prepare('UPDATE facts SET last_accessed = ?, access_count = access_count + 1 WHERE id = ?');
82
+ for (const r of results)
83
+ bumpStmt.run(now, r.id);
84
+ const docs = db.prepare('SELECT key, content FROM documents ORDER BY key').all();
85
+ return {
86
+ content: [
87
+ {
88
+ type: 'text',
89
+ text: JSON.stringify({
90
+ identity: Object.fromEntries(docs.map((d) => [d.key, d.content])),
91
+ results: results.map((r) => ({
92
+ fact: r.fact,
93
+ entity: r.entity_name,
94
+ entityType: r.entity_type,
95
+ category: r.category,
96
+ tier: r.tier,
97
+ score: -r.rank,
98
+ })),
99
+ }),
100
+ },
101
+ ],
102
+ };
103
+ });
104
+ // --- remember: save a fact ---
105
+ mcp.registerTool('remember', {
106
+ description: `Save something important to memory. You MUST use this when:
107
+ - The user shares a preference, opinion, or personal detail
108
+ - A decision is made about a project
109
+ - Something happens that the user would want remembered later
110
+ - The user explicitly says "remember this"
111
+
112
+ Extract a clear, atomic fact. One fact per call.
113
+ Bad: "We talked about React and the user likes it"
114
+ Good: "User prefers React over Vue for new frontend projects"`,
115
+ inputSchema: {
116
+ entityId: z.string().describe('Entity to attach the fact to'),
117
+ fact: z.string().describe('The fact to remember — clear, atomic, one sentence'),
118
+ category: z
119
+ .string()
120
+ .optional()
121
+ .default('context')
122
+ .describe('Fact category: context, milestone, status, preference, relationship'),
123
+ },
124
+ }, async ({ entityId, fact, category }) => {
125
+ const entity = db.prepare('SELECT id FROM entities WHERE id = ?').get(entityId);
126
+ if (!entity) {
127
+ return {
128
+ content: [
129
+ {
130
+ type: 'text',
131
+ text: JSON.stringify({
132
+ error: `Entity '${entityId}' not found. Create it first or use list_entities to find the right one.`,
133
+ }),
134
+ },
135
+ ],
136
+ };
137
+ }
138
+ const id = genId('fact');
139
+ const now = new Date().toISOString().split('T')[0];
140
+ db.prepare("INSERT INTO facts (id, entity_id, fact, category, timestamp, last_accessed, access_count, tier, source, related_entities) VALUES (?, ?, ?, ?, ?, ?, 1, 'hot', 'mcp', '[]')").run(id, entityId, fact, category, now, now);
141
+ db.prepare('UPDATE entities SET updated_at = ? WHERE id = ?').run(now, entityId);
142
+ return {
143
+ content: [
144
+ { type: 'text', text: JSON.stringify({ saved: true, id, entityId, fact }) },
145
+ ],
146
+ };
147
+ });
148
+ // --- get_entity: read entity with facts ---
149
+ mcp.registerTool('get_entity', {
150
+ description: 'Read an entity and all its facts. Use this to get full context about a project, person, system, or event.',
151
+ inputSchema: {
152
+ id: z.string().describe('Entity ID'),
153
+ },
154
+ }, async ({ id }) => {
155
+ const entity = db.prepare('SELECT * FROM entities WHERE id = ?').get(id);
156
+ if (!entity) {
157
+ return {
158
+ content: [{ type: 'text', text: JSON.stringify({ error: 'Entity not found' }) }],
159
+ };
160
+ }
161
+ const facts = db
162
+ .prepare('SELECT id, fact, category, tier, access_count, last_accessed FROM facts WHERE entity_id = ? ORDER BY tier ASC, access_count DESC')
163
+ .all(id);
164
+ return {
165
+ content: [
166
+ {
167
+ type: 'text',
168
+ text: JSON.stringify({
169
+ ...entity,
170
+ metadata: entity.metadata ? JSON.parse(entity.metadata) : null,
171
+ facts,
172
+ }),
173
+ },
174
+ ],
175
+ };
176
+ });
177
+ // --- list_entities ---
178
+ mcp.registerTool('list_entities', {
179
+ description: 'List all known entities. Filter by PARA category or type.',
180
+ inputSchema: {
181
+ category: z
182
+ .string()
183
+ .optional()
184
+ .describe('PARA category: projects, areas, resources, archives'),
185
+ type: z
186
+ .string()
187
+ .optional()
188
+ .describe('Entity type: project, person, system, event, resource'),
189
+ },
190
+ }, async ({ category, type }) => {
191
+ let sql = "SELECT id, name, type, category, status FROM entities WHERE status = 'active'";
192
+ const params = [];
193
+ if (category) {
194
+ sql += ' AND category = ?';
195
+ params.push(category);
196
+ }
197
+ if (type) {
198
+ sql += ' AND type = ?';
199
+ params.push(type);
200
+ }
201
+ sql += ' ORDER BY updated_at DESC';
202
+ return {
203
+ content: [{ type: 'text', text: JSON.stringify(db.prepare(sql).all(...params)) }],
204
+ };
205
+ });
206
+ // --- create_entity ---
207
+ mcp.registerTool('create_entity', {
208
+ description: 'Create a new entity (project, person, system, event). Use this before remembering facts about something new.',
209
+ inputSchema: {
210
+ id: z.string().describe("Unique ID (lowercase, no spaces, e.g. 'my-project')"),
211
+ name: z.string().describe('Display name'),
212
+ type: z.enum(['project', 'person', 'system', 'event', 'resource']).describe('Entity type'),
213
+ category: z.enum(['projects', 'areas', 'resources', 'archives']).describe('PARA category'),
214
+ },
215
+ }, async ({ id, name, type, category }) => {
216
+ const existing = db.prepare('SELECT id FROM entities WHERE id = ?').get(id);
217
+ if (existing) {
218
+ return {
219
+ content: [
220
+ {
221
+ type: 'text',
222
+ text: JSON.stringify({ error: `Entity '${id}' already exists` }),
223
+ },
224
+ ],
225
+ };
226
+ }
227
+ const now = new Date().toISOString();
228
+ db.prepare('INSERT INTO entities (id, name, type, category, created_at, updated_at) VALUES (?, ?, ?, ?, ?, ?)').run(id, name, type, category, now, now);
229
+ return {
230
+ content: [
231
+ {
232
+ type: 'text',
233
+ text: JSON.stringify({ created: true, id, name, type, category }),
234
+ },
235
+ ],
236
+ };
237
+ });
238
+ // --- bump: keep a memory hot ---
239
+ mcp.registerTool('bump', {
240
+ description: 'Touch a memory to keep it alive. Call this when you use a fact to answer a question.',
241
+ inputSchema: {
242
+ factId: z.string().describe('Fact ID to bump'),
243
+ },
244
+ }, async ({ factId }) => {
245
+ const now = new Date().toISOString().split('T')[0];
246
+ const result = db
247
+ .prepare("UPDATE facts SET last_accessed = ?, access_count = access_count + 1, tier = 'hot' WHERE id = ?")
248
+ .run(now, factId);
249
+ if (result.changes === 0) {
250
+ return {
251
+ content: [{ type: 'text', text: JSON.stringify({ error: 'Fact not found' }) }],
252
+ };
253
+ }
254
+ return {
255
+ content: [{ type: 'text', text: JSON.stringify({ bumped: true, factId }) }],
256
+ };
257
+ });
258
+ // --- log: store conversation messages ---
259
+ mcp.registerTool('log', {
260
+ description: `Send conversation messages to the brain for storage. Call this periodically during the conversation to log what's happening. Send both user and assistant messages.`,
261
+ inputSchema: {
262
+ source: z
263
+ .string()
264
+ .describe("Where this conversation is from, e.g. 'claude-code-home', 'gemini-mobile'"),
265
+ conversationId: z
266
+ .string()
267
+ .optional()
268
+ .describe('Existing conversation ID. Omit to start a new one.'),
269
+ messages: z
270
+ .array(z.object({
271
+ role: z.enum(['user', 'assistant']),
272
+ content: z.string(),
273
+ }))
274
+ .describe('Messages to log'),
275
+ },
276
+ }, async ({ source, conversationId, messages }) => {
277
+ let convId = conversationId;
278
+ if (!convId) {
279
+ convId = genId('conv');
280
+ db.prepare('INSERT INTO conversations (id, source, started_at) VALUES (?, ?, ?)').run(convId, source, new Date().toISOString());
281
+ }
282
+ const insert = db.prepare('INSERT INTO messages (id, conversation_id, role, content, timestamp) VALUES (?, ?, ?, ?, ?)');
283
+ const now = new Date().toISOString();
284
+ for (const m of messages) {
285
+ insert.run(genId('msg'), convId, m.role, m.content, now);
286
+ }
287
+ db.prepare('UPDATE conversations SET ended_at = ? WHERE id = ?').run(now, convId);
288
+ return {
289
+ content: [
290
+ {
291
+ type: 'text',
292
+ text: JSON.stringify({ logged: true, conversationId: convId, count: messages.length }),
293
+ },
294
+ ],
295
+ };
296
+ });
297
+ // --- overview: brain stats ---
298
+ mcp.registerTool('overview', {
299
+ description: 'Get a summary of everything in the brain: entities, facts by tier, conversations.',
300
+ inputSchema: {},
301
+ }, async () => {
302
+ const entities = db
303
+ .prepare(`
304
+ SELECT e.id, e.name, e.type, e.category,
305
+ COUNT(CASE WHEN f.tier = 'hot' THEN 1 END) as hot,
306
+ COUNT(CASE WHEN f.tier = 'warm' THEN 1 END) as warm,
307
+ COUNT(CASE WHEN f.tier = 'cold' THEN 1 END) as cold,
308
+ COUNT(f.id) as total
309
+ FROM entities e LEFT JOIN facts f ON f.entity_id = e.id
310
+ WHERE e.status = 'active' GROUP BY e.id ORDER BY total DESC
311
+ `)
312
+ .all();
313
+ const { conversations } = db
314
+ .prepare('SELECT COUNT(*) as conversations FROM conversations')
315
+ .get();
316
+ const { messages } = db.prepare('SELECT COUNT(*) as messages FROM messages').get();
317
+ const { unprocessed } = db
318
+ .prepare('SELECT COUNT(*) as unprocessed FROM messages WHERE processed = 0')
319
+ .get();
320
+ return {
321
+ content: [
322
+ {
323
+ type: 'text',
324
+ text: JSON.stringify({ entities, conversations, messages, unprocessed }),
325
+ },
326
+ ],
327
+ };
328
+ });
329
+ return mcp;
330
+ }
331
+ function logMcpRequest(app, body) {
332
+ const msg = body;
333
+ if (!msg?.method)
334
+ return;
335
+ const method = msg.method;
336
+ const params = msg.params ?? {};
337
+ if (method === 'initialize') {
338
+ app.log.info({ mcp: method }, 'MCP client connected');
339
+ }
340
+ else if (method === 'notifications/initialized') {
341
+ // silent
342
+ }
343
+ else if (method === 'tools/call') {
344
+ const toolName = params.name ?? 'unknown';
345
+ const toolArgs = params.arguments ?? {};
346
+ app.log.info({ mcp: method, tool: toolName, args: toolArgs }, `MCP tool: ${toolName}`);
347
+ }
348
+ else if (method === 'tools/list' ||
349
+ method === 'resources/list' ||
350
+ method === 'resources/read') {
351
+ app.log.info({ mcp: method }, `MCP ${method}`);
352
+ }
353
+ }
354
+ export function mountMcp(app) {
355
+ app.all('/mcp', async (request, reply) => {
356
+ const raw = request.raw;
357
+ const res = reply.raw;
358
+ reply.hijack();
359
+ if (request.method === 'POST') {
360
+ logMcpRequest(app, request.body);
361
+ const server = createMcpServer(app);
362
+ const transport = new StreamableHTTPServerTransport({ sessionIdGenerator: undefined });
363
+ await server.connect(transport);
364
+ await transport.handleRequest(raw, res, request.body);
365
+ res.on('close', () => {
366
+ transport.close();
367
+ server.close();
368
+ });
369
+ }
370
+ else if (request.method === 'GET') {
371
+ res.writeHead(405).end(JSON.stringify({
372
+ jsonrpc: '2.0',
373
+ error: { code: -32000, message: 'Method not allowed.' },
374
+ id: null,
375
+ }));
376
+ }
377
+ else if (request.method === 'DELETE') {
378
+ res.writeHead(405).end(JSON.stringify({
379
+ jsonrpc: '2.0',
380
+ error: { code: -32000, message: 'Method not allowed.' },
381
+ id: null,
382
+ }));
383
+ }
384
+ });
385
+ }
386
+ //# sourceMappingURL=server.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server.js","sourceRoot":"","sources":["../../src/mcp/server.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ import type Database from 'better-sqlite3';
2
+ import Fastify from 'fastify';
3
+ import type { Config } from '../core/config.js';
4
+ export declare function createServer(config: Config, db: Database.Database): Fastify.FastifyInstance<import("node:http").Server<typeof import("node:http").IncomingMessage, typeof import("node:http").ServerResponse>, import("node:http").IncomingMessage, import("node:http").ServerResponse<import("node:http").IncomingMessage>, Fastify.FastifyBaseLogger, Fastify.FastifyTypeProviderDefault> & PromiseLike<Fastify.FastifyInstance<import("node:http").Server<typeof import("node:http").IncomingMessage, typeof import("node:http").ServerResponse>, import("node:http").IncomingMessage, import("node:http").ServerResponse<import("node:http").IncomingMessage>, Fastify.FastifyBaseLogger, Fastify.FastifyTypeProviderDefault>> & {
5
+ __linterBrands: "SafePromiseLike";
6
+ };
7
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/server/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,QAAQ,MAAM,gBAAgB,CAAC;AAC3C,OAAO,OAAO,MAAM,SAAS,CAAC;AAE9B,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAUhD,wBAAgB,YAAY,CAAC,MAAM,EAAE,MAAM,EAAE,EAAE,EAAE,QAAQ,CAAC,QAAQ;;EAoCjE"}
@@ -0,0 +1,41 @@
1
+ import Fastify from 'fastify';
2
+ import { mountMcp } from '../mcp/server.js';
3
+ import { conversationRoutes } from './routes/conversations.js';
4
+ import { entityRoutes } from './routes/entities.js';
5
+ import { factRoutes } from './routes/facts.js';
6
+ import { healthRoutes } from './routes/health.js';
7
+ import { searchRoutes } from './routes/search.js';
8
+ import { workspaceRoutes } from './routes/workspace.js';
9
+ export function createServer(config, db) {
10
+ const app = Fastify({ logger: true });
11
+ app.decorate('db', db);
12
+ app.decorate('config', config);
13
+ app.addHook('onSend', async (request, reply, payload) => {
14
+ reply.header('Access-Control-Allow-Origin', '*');
15
+ reply.header('Access-Control-Allow-Headers', 'Authorization, Content-Type, Accept');
16
+ reply.header('Access-Control-Allow-Methods', 'GET, POST, PUT, PATCH, DELETE, OPTIONS');
17
+ return payload;
18
+ });
19
+ app.options('/*', async (_, reply) => {
20
+ reply.status(204).send();
21
+ });
22
+ app.addHook('onRequest', async (request, reply) => {
23
+ if (request.method === 'OPTIONS')
24
+ return;
25
+ if (request.url === '/health')
26
+ return;
27
+ const auth = request.headers.authorization;
28
+ if (!auth || auth !== `Bearer ${config.token}`) {
29
+ reply.code(401).send({ error: 'Unauthorized' });
30
+ }
31
+ });
32
+ app.register(healthRoutes);
33
+ app.register(entityRoutes);
34
+ app.register(factRoutes);
35
+ app.register(searchRoutes);
36
+ app.register(workspaceRoutes);
37
+ app.register(conversationRoutes);
38
+ mountMcp(app);
39
+ return app;
40
+ }
41
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/server/index.ts"],"names":[],"mappings":"AACA,OAAO,OAAO,MAAM,SAAS,CAAC;AAG9B,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAE5C,OAAO,EAAE,kBAAkB,EAAE,MAAM,2BAA2B,CAAC;AAC/D,OAAO,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AACpD,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAC/C,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAExD,MAAM,UAAU,YAAY,CAAC,MAAc,EAAE,EAAqB;IAChE,MAAM,GAAG,GAAG,OAAO,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC;IAEtC,GAAG,CAAC,QAAQ,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;IACvB,GAAG,CAAC,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;IAE/B,GAAG,CAAC,OAAO,CAAC,QAAQ,EAAE,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE;QACtD,KAAK,CAAC,MAAM,CAAC,6BAA6B,EAAE,GAAG,CAAC,CAAC;QACjD,KAAK,CAAC,MAAM,CAAC,8BAA8B,EAAE,qCAAqC,CAAC,CAAC;QACpF,KAAK,CAAC,MAAM,CAAC,8BAA8B,EAAE,wCAAwC,CAAC,CAAC;QACvF,OAAO,OAAO,CAAC;IACjB,CAAC,CAAC,CAAC;IAEH,GAAG,CAAC,OAAO,CAAC,IAAI,EAAE,KAAK,EAAE,CAAC,EAAE,KAAK,EAAE,EAAE;QACnC,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC;IAC3B,CAAC,CAAC,CAAC;IAEH,GAAG,CAAC,OAAO,CAAC,WAAW,EAAE,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,EAAE;QAChD,IAAI,OAAO,CAAC,MAAM,KAAK,SAAS;YAAE,OAAO;QACzC,IAAI,OAAO,CAAC,GAAG,KAAK,SAAS;YAAE,OAAO;QACtC,MAAM,IAAI,GAAG,OAAO,CAAC,OAAO,CAAC,aAAa,CAAC;QAC3C,IAAI,CAAC,IAAI,IAAI,IAAI,KAAK,UAAU,MAAM,CAAC,KAAK,EAAE,EAAE,CAAC;YAC/C,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,cAAc,EAAE,CAAC,CAAC;QAClD,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,GAAG,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAC;IAC3B,GAAG,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAC;IAC3B,GAAG,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC;IACzB,GAAG,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAC;IAC3B,GAAG,CAAC,QAAQ,CAAC,eAAe,CAAC,CAAC;IAC9B,GAAG,CAAC,QAAQ,CAAC,kBAAkB,CAAC,CAAC;IAEjC,QAAQ,CAAC,GAAG,CAAC,CAAC;IAEd,OAAO,GAAG,CAAC;AACb,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { FastifyInstance } from 'fastify';
2
+ export declare function conversationRoutes(app: FastifyInstance): Promise<void>;
3
+ //# sourceMappingURL=conversations.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"conversations.d.ts","sourceRoot":"","sources":["../../../src/server/routes/conversations.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,SAAS,CAAC;AAM/C,wBAAsB,kBAAkB,CAAC,GAAG,EAAE,eAAe,iBA+G5D"}
@@ -0,0 +1,86 @@
1
+ import { randomBytes } from 'node:crypto';
2
+ function genId() {
3
+ return `msg_${randomBytes(12).toString('base64url')}`;
4
+ }
5
+ export async function conversationRoutes(app) {
6
+ const db = app.db;
7
+ app.get('/conversations', async (request) => {
8
+ const { source, limit = 50 } = request.query;
9
+ let sql = 'SELECT id, source, started_at, ended_at, summary FROM conversations';
10
+ const params = [];
11
+ if (source) {
12
+ sql += ' WHERE source = ?';
13
+ params.push(source);
14
+ }
15
+ sql += ' ORDER BY started_at DESC LIMIT ?';
16
+ params.push(limit);
17
+ return db.prepare(sql).all(...params);
18
+ });
19
+ app.get('/conversations/:id', async (request, reply) => {
20
+ const { id } = request.params;
21
+ const conv = db.prepare('SELECT * FROM conversations WHERE id = ?').get(id);
22
+ if (!conv)
23
+ return reply.code(404).send({ error: 'Conversation not found' });
24
+ const messages = db
25
+ .prepare('SELECT id, role, content, timestamp, processed FROM messages WHERE conversation_id = ? ORDER BY timestamp')
26
+ .all(id);
27
+ return { ...conv, messages };
28
+ });
29
+ app.post('/conversations', async (request, reply) => {
30
+ const { id, source } = request.body;
31
+ const convId = id || `conv_${randomBytes(12).toString('base64url')}`;
32
+ const now = new Date().toISOString();
33
+ db.prepare('INSERT INTO conversations (id, source, started_at) VALUES (?, ?, ?)').run(convId, source, now);
34
+ return reply.code(201).send({ id: convId, source, started_at: now });
35
+ });
36
+ app.post('/conversations/:id/messages', async (request, reply) => {
37
+ const { id } = request.params;
38
+ const conv = db.prepare('SELECT id FROM conversations WHERE id = ?').get(id);
39
+ if (!conv)
40
+ return reply.code(404).send({ error: 'Conversation not found' });
41
+ const body = request.body;
42
+ const msgs = Array.isArray(body) ? body : [body];
43
+ const now = new Date().toISOString();
44
+ const insert = db.prepare('INSERT INTO messages (id, conversation_id, role, content, timestamp) VALUES (?, ?, ?, ?, ?)');
45
+ const saved = msgs.map((m, i) => {
46
+ const msgId = genId();
47
+ const ts = i === 0 ? now : new Date(Date.now() + i).toISOString();
48
+ insert.run(msgId, id, m.role, m.content, ts);
49
+ return { id: msgId, role: m.role, timestamp: ts };
50
+ });
51
+ db.prepare('UPDATE conversations SET ended_at = ? WHERE id = ?').run(saved[saved.length - 1].timestamp, id);
52
+ return reply.code(201).send(saved);
53
+ });
54
+ app.get('/conversations/:id/messages', async (request, reply) => {
55
+ const { id } = request.params;
56
+ const conv = db.prepare('SELECT id FROM conversations WHERE id = ?').get(id);
57
+ if (!conv)
58
+ return reply.code(404).send({ error: 'Conversation not found' });
59
+ const { since, processed } = request.query;
60
+ let sql = 'SELECT id, role, content, timestamp, processed FROM messages WHERE conversation_id = ?';
61
+ const params = [id];
62
+ if (since) {
63
+ sql += ' AND timestamp > ?';
64
+ params.push(since);
65
+ }
66
+ if (processed !== undefined) {
67
+ sql += ' AND processed = ?';
68
+ params.push(processed === 'true' ? 1 : 0);
69
+ }
70
+ sql += ' ORDER BY timestamp';
71
+ return db.prepare(sql).all(...params);
72
+ });
73
+ app.get('/conversations/pending', async () => {
74
+ const row = db.prepare('SELECT COUNT(*) as count FROM messages WHERE processed = 0').get();
75
+ const conversations = db
76
+ .prepare(`
77
+ SELECT c.id, c.source, c.started_at, COUNT(m.id) as unprocessed
78
+ FROM conversations c
79
+ JOIN messages m ON m.conversation_id = c.id AND m.processed = 0
80
+ GROUP BY c.id ORDER BY c.started_at DESC
81
+ `)
82
+ .all();
83
+ return { total_unprocessed: row.count, conversations };
84
+ });
85
+ }
86
+ //# sourceMappingURL=conversations.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"conversations.js","sourceRoot":"","sources":["../../../src/server/routes/conversations.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import type { FastifyInstance } from 'fastify';
2
+ export declare function entityRoutes(app: FastifyInstance): Promise<void>;
3
+ //# sourceMappingURL=entities.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"entities.d.ts","sourceRoot":"","sources":["../../../src/server/routes/entities.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,SAAS,CAAC;AAY/C,wBAAsB,YAAY,CAAC,GAAG,EAAE,eAAe,iBA+DtD"}