@4da/mcp-server 3.2.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 (123) hide show
  1. package/README.md +135 -0
  2. package/dist/db.d.ts +64 -0
  3. package/dist/db.d.ts.map +1 -0
  4. package/dist/db.js +578 -0
  5. package/dist/db.js.map +1 -0
  6. package/dist/index.d.ts +37 -0
  7. package/dist/index.d.ts.map +1 -0
  8. package/dist/index.js +422 -0
  9. package/dist/index.js.map +1 -0
  10. package/dist/llm.d.ts +144 -0
  11. package/dist/llm.d.ts.map +1 -0
  12. package/dist/llm.js +447 -0
  13. package/dist/llm.js.map +1 -0
  14. package/dist/output-manager.d.ts +156 -0
  15. package/dist/output-manager.d.ts.map +1 -0
  16. package/dist/output-manager.js +156 -0
  17. package/dist/output-manager.js.map +1 -0
  18. package/dist/schema-registry.d.ts +46 -0
  19. package/dist/schema-registry.d.ts.map +1 -0
  20. package/dist/schema-registry.js +133 -0
  21. package/dist/schema-registry.js.map +1 -0
  22. package/dist/schemas/config-validator.json +18 -0
  23. package/dist/schemas/context-analysis.json +25 -0
  24. package/dist/schemas/daily-briefing.json +34 -0
  25. package/dist/schemas/explain-relevance.json +19 -0
  26. package/dist/schemas/get-actionable-signals.json +29 -0
  27. package/dist/schemas/get-context.json +17 -0
  28. package/dist/schemas/get-relevant-content.json +26 -0
  29. package/dist/schemas/llm-status.json +13 -0
  30. package/dist/schemas/record-feedback.json +24 -0
  31. package/dist/schemas/score-autopsy.json +30 -0
  32. package/dist/schemas/source-health.json +17 -0
  33. package/dist/schemas/topic-connections.json +34 -0
  34. package/dist/schemas/trend-analysis.json +29 -0
  35. package/dist/tools/attention-report.d.ts +39 -0
  36. package/dist/tools/attention-report.d.ts.map +1 -0
  37. package/dist/tools/attention-report.js +72 -0
  38. package/dist/tools/attention-report.js.map +1 -0
  39. package/dist/tools/config-validator.d.ts +59 -0
  40. package/dist/tools/config-validator.d.ts.map +1 -0
  41. package/dist/tools/config-validator.js +375 -0
  42. package/dist/tools/config-validator.js.map +1 -0
  43. package/dist/tools/context-analysis.d.ts +108 -0
  44. package/dist/tools/context-analysis.d.ts.map +1 -0
  45. package/dist/tools/context-analysis.js +300 -0
  46. package/dist/tools/context-analysis.js.map +1 -0
  47. package/dist/tools/daily-briefing.d.ts +103 -0
  48. package/dist/tools/daily-briefing.d.ts.map +1 -0
  49. package/dist/tools/daily-briefing.js +278 -0
  50. package/dist/tools/daily-briefing.js.map +1 -0
  51. package/dist/tools/explain-relevance.d.ts +36 -0
  52. package/dist/tools/explain-relevance.d.ts.map +1 -0
  53. package/dist/tools/explain-relevance.js +50 -0
  54. package/dist/tools/explain-relevance.js.map +1 -0
  55. package/dist/tools/export-context.d.ts +43 -0
  56. package/dist/tools/export-context.d.ts.map +1 -0
  57. package/dist/tools/export-context.js +104 -0
  58. package/dist/tools/export-context.js.map +1 -0
  59. package/dist/tools/get-actionable-signals.d.ts +65 -0
  60. package/dist/tools/get-actionable-signals.d.ts.map +1 -0
  61. package/dist/tools/get-actionable-signals.js +268 -0
  62. package/dist/tools/get-actionable-signals.js.map +1 -0
  63. package/dist/tools/get-context.d.ts +34 -0
  64. package/dist/tools/get-context.d.ts.map +1 -0
  65. package/dist/tools/get-context.js +43 -0
  66. package/dist/tools/get-context.js.map +1 -0
  67. package/dist/tools/get-relevant-content.d.ts +44 -0
  68. package/dist/tools/get-relevant-content.d.ts.map +1 -0
  69. package/dist/tools/get-relevant-content.js +56 -0
  70. package/dist/tools/get-relevant-content.js.map +1 -0
  71. package/dist/tools/index.d.ts +40 -0
  72. package/dist/tools/index.d.ts.map +1 -0
  73. package/dist/tools/index.js +44 -0
  74. package/dist/tools/index.js.map +1 -0
  75. package/dist/tools/knowledge-gaps.d.ts +36 -0
  76. package/dist/tools/knowledge-gaps.d.ts.map +1 -0
  77. package/dist/tools/knowledge-gaps.js +76 -0
  78. package/dist/tools/knowledge-gaps.js.map +1 -0
  79. package/dist/tools/llm-status.d.ts +45 -0
  80. package/dist/tools/llm-status.d.ts.map +1 -0
  81. package/dist/tools/llm-status.js +92 -0
  82. package/dist/tools/llm-status.js.map +1 -0
  83. package/dist/tools/project-health.d.ts +41 -0
  84. package/dist/tools/project-health.d.ts.map +1 -0
  85. package/dist/tools/project-health.js +71 -0
  86. package/dist/tools/project-health.js.map +1 -0
  87. package/dist/tools/record-feedback.d.ts +39 -0
  88. package/dist/tools/record-feedback.d.ts.map +1 -0
  89. package/dist/tools/record-feedback.js +60 -0
  90. package/dist/tools/record-feedback.js.map +1 -0
  91. package/dist/tools/reverse-mentions.d.ts +38 -0
  92. package/dist/tools/reverse-mentions.d.ts.map +1 -0
  93. package/dist/tools/reverse-mentions.js +57 -0
  94. package/dist/tools/reverse-mentions.js.map +1 -0
  95. package/dist/tools/score-autopsy.d.ts +93 -0
  96. package/dist/tools/score-autopsy.d.ts.map +1 -0
  97. package/dist/tools/score-autopsy.js +288 -0
  98. package/dist/tools/score-autopsy.js.map +1 -0
  99. package/dist/tools/semantic-shifts.d.ts +37 -0
  100. package/dist/tools/semantic-shifts.d.ts.map +1 -0
  101. package/dist/tools/semantic-shifts.js +73 -0
  102. package/dist/tools/semantic-shifts.js.map +1 -0
  103. package/dist/tools/signal-chains.d.ts +45 -0
  104. package/dist/tools/signal-chains.d.ts.map +1 -0
  105. package/dist/tools/signal-chains.js +60 -0
  106. package/dist/tools/signal-chains.js.map +1 -0
  107. package/dist/tools/source-health.d.ts +64 -0
  108. package/dist/tools/source-health.d.ts.map +1 -0
  109. package/dist/tools/source-health.js +176 -0
  110. package/dist/tools/source-health.js.map +1 -0
  111. package/dist/tools/topic-connections.d.ts +112 -0
  112. package/dist/tools/topic-connections.d.ts.map +1 -0
  113. package/dist/tools/topic-connections.js +318 -0
  114. package/dist/tools/topic-connections.js.map +1 -0
  115. package/dist/tools/trend-analysis.d.ts +105 -0
  116. package/dist/tools/trend-analysis.d.ts.map +1 -0
  117. package/dist/tools/trend-analysis.js +295 -0
  118. package/dist/tools/trend-analysis.js.map +1 -0
  119. package/dist/types.d.ts +163 -0
  120. package/dist/types.d.ts.map +1 -0
  121. package/dist/types.js +7 -0
  122. package/dist/types.js.map +1 -0
  123. package/package.json +61 -0
package/dist/db.js ADDED
@@ -0,0 +1,578 @@
1
+ /**
2
+ * Database module for 4DA MCP Server
3
+ *
4
+ * Read-only access to the 4DA SQLite database.
5
+ * Only the record_feedback function performs writes.
6
+ */
7
+ import Database from "better-sqlite3";
8
+ import path from "path";
9
+ import * as fs from "fs";
10
+ import * as os from "os";
11
+ import { fileURLToPath } from "node:url";
12
+ import { dirname } from "node:path";
13
+ const __filename = fileURLToPath(import.meta.url);
14
+ const __dirname = dirname(__filename);
15
+ /**
16
+ * Resolve the database path by checking multiple locations in priority order:
17
+ * 1. FOURDA_DB_PATH env var
18
+ * 2. data/4da.db relative to cwd (development)
19
+ * 3. data/4da.db relative to project root (mcp-4da-server is inside project root)
20
+ * 4. Platform-specific Tauri app data dirs (production)
21
+ * 5. Final fallback: data/4da.db relative to cwd
22
+ */
23
+ function getDefaultDbPath() {
24
+ // 1. Environment variable (highest priority)
25
+ if (process.env.FOURDA_DB_PATH) {
26
+ return process.env.FOURDA_DB_PATH;
27
+ }
28
+ // 2. Relative to cwd (development)
29
+ const cwdPath = path.resolve(process.cwd(), "data", "4da.db");
30
+ if (fs.existsSync(cwdPath)) {
31
+ return cwdPath;
32
+ }
33
+ // 3. Relative to project root (mcp-4da-server is inside project root)
34
+ const projectRootPath = path.resolve(__dirname, "..", "..", "data", "4da.db");
35
+ if (fs.existsSync(projectRootPath)) {
36
+ return projectRootPath;
37
+ }
38
+ // 4. Platform-specific Tauri app data dirs (production)
39
+ const platform = process.platform;
40
+ let appDataPath;
41
+ if (platform === "win32") {
42
+ appDataPath = path.join(process.env.APPDATA || path.join(os.homedir(), "AppData", "Roaming"), "com.4da.app", "data", "4da.db");
43
+ }
44
+ else if (platform === "darwin") {
45
+ appDataPath = path.join(os.homedir(), "Library", "Application Support", "com.4da.app", "data", "4da.db");
46
+ }
47
+ else {
48
+ appDataPath = path.join(os.homedir(), ".local", "share", "com.4da.app", "data", "4da.db");
49
+ }
50
+ if (fs.existsSync(appDataPath)) {
51
+ return appDataPath;
52
+ }
53
+ // 5. Final fallback
54
+ return path.resolve(process.cwd(), "data", "4da.db");
55
+ }
56
+ /**
57
+ * 4DA Database accessor
58
+ */
59
+ export class FourDADatabase {
60
+ db;
61
+ constructor(dbPath) {
62
+ const resolvedPath = dbPath || getDefaultDbPath();
63
+ // Resolve path - if relative, resolve from cwd
64
+ const absolutePath = path.isAbsolute(resolvedPath)
65
+ ? resolvedPath
66
+ : path.resolve(process.cwd(), resolvedPath);
67
+ try {
68
+ this.db = new Database(absolutePath, { readonly: false }); // Need write for feedback
69
+ this.db.pragma("journal_mode = WAL");
70
+ }
71
+ catch (error) {
72
+ throw new Error(`Failed to open 4DA database at ${absolutePath}: ${error instanceof Error ? error.message : String(error)}`);
73
+ }
74
+ }
75
+ /**
76
+ * Get the raw better-sqlite3 database instance for custom queries
77
+ */
78
+ getRawDb() {
79
+ return this.db;
80
+ }
81
+ /**
82
+ * Close the database connection
83
+ */
84
+ close() {
85
+ this.db.close();
86
+ }
87
+ // ===========================================================================
88
+ // Source Items
89
+ // ===========================================================================
90
+ /**
91
+ * Get relevant content items with computed relevance scores
92
+ */
93
+ getRelevantContent(minScore = 0.35, sourceType, limit = 20, sinceHours = 24) {
94
+ const sinceDate = new Date(Date.now() - sinceHours * 60 * 60 * 1000)
95
+ .toISOString()
96
+ .replace("T", " ")
97
+ .slice(0, 19);
98
+ // Get user context for scoring
99
+ const context = this.getUserContext(true, true);
100
+ // Build query - get recent items
101
+ let query = `
102
+ SELECT id, source_type, source_id, url, title, content, content_hash, created_at, last_seen
103
+ FROM source_items
104
+ WHERE datetime(created_at) >= datetime(?)
105
+ `;
106
+ const params = [sinceDate];
107
+ if (sourceType) {
108
+ query += ` AND source_type = ?`;
109
+ params.push(sourceType);
110
+ }
111
+ query += ` ORDER BY created_at DESC LIMIT ?`;
112
+ params.push(limit * 5); // Get more to filter
113
+ const stmt = this.db.prepare(query);
114
+ const items = stmt.all(...params);
115
+ // Compute relevance scores and filter
116
+ const scoredItems = [];
117
+ const now = Date.now();
118
+ for (const item of items) {
119
+ const score = this.computeRelevanceScore(item, context);
120
+ if (score >= minScore) {
121
+ const createdAt = new Date(item.created_at.replace(" ", "T") + "Z");
122
+ const hoursAgo = Math.round((now - createdAt.getTime()) / (1000 * 60 * 60));
123
+ const discoveredAgo = hoursAgo < 1
124
+ ? "< 1 hour ago"
125
+ : hoursAgo < 24
126
+ ? `${hoursAgo} hours ago`
127
+ : `${Math.round(hoursAgo / 24)} days ago`;
128
+ scoredItems.push({
129
+ id: item.id,
130
+ source_type: item.source_type,
131
+ source_id: item.source_id,
132
+ url: item.url,
133
+ title: item.title,
134
+ content: item.content.substring(0, 500), // Truncate for readability
135
+ relevance_score: Math.round(score * 100) / 100,
136
+ created_at: item.created_at,
137
+ discovered_ago: discoveredAgo,
138
+ });
139
+ }
140
+ }
141
+ // Sort by relevance and limit
142
+ return scoredItems
143
+ .sort((a, b) => b.relevance_score - a.relevance_score)
144
+ .slice(0, limit);
145
+ }
146
+ /**
147
+ * Get a single source item by ID and type
148
+ */
149
+ getSourceItem(itemId, sourceType) {
150
+ const stmt = this.db.prepare(`
151
+ SELECT id, source_type, source_id, url, title, content, content_hash, created_at, last_seen
152
+ FROM source_items
153
+ WHERE id = ? AND source_type = ?
154
+ `);
155
+ return stmt.get(itemId, sourceType) || null;
156
+ }
157
+ // ===========================================================================
158
+ // User Context
159
+ // ===========================================================================
160
+ /**
161
+ * Get the user's context (what 4DA knows about them)
162
+ */
163
+ getUserContext(includeAce = true, includeLearned = true) {
164
+ // Static identity
165
+ const roleStmt = this.db.prepare("SELECT role FROM user_identity WHERE id = 1");
166
+ const roleRow = roleStmt.get();
167
+ const techStmt = this.db.prepare("SELECT technology FROM tech_stack ORDER BY technology");
168
+ const tech = techStmt.all();
169
+ const domainsStmt = this.db.prepare("SELECT domain FROM domains ORDER BY domain");
170
+ const domains = domainsStmt.all();
171
+ const interestsStmt = this.db.prepare(`
172
+ SELECT id, topic, weight, source FROM explicit_interests ORDER BY weight DESC
173
+ `);
174
+ const interests = interestsStmt.all();
175
+ const exclusionsStmt = this.db.prepare("SELECT topic FROM exclusions ORDER BY topic");
176
+ const exclusions = exclusionsStmt.all();
177
+ const context = {
178
+ role: roleRow?.role || null,
179
+ tech_stack: tech.map((t) => t.technology),
180
+ domains: domains.map((d) => d.domain),
181
+ interests: interests,
182
+ exclusions: exclusions.map((e) => e.topic),
183
+ };
184
+ // ACE-detected context
185
+ if (includeAce) {
186
+ try {
187
+ const detectedTechStmt = this.db.prepare(`
188
+ SELECT name, category, confidence, source
189
+ FROM detected_tech
190
+ WHERE confidence > 0.3
191
+ ORDER BY confidence DESC
192
+ LIMIT 50
193
+ `);
194
+ const detectedTech = detectedTechStmt.all();
195
+ const activeTopicsStmt = this.db.prepare(`
196
+ SELECT topic, weight, confidence, source, last_seen
197
+ FROM active_topics
198
+ WHERE confidence > 0.3
199
+ ORDER BY weight DESC
200
+ LIMIT 50
201
+ `);
202
+ const activeTopics = activeTopicsStmt.all();
203
+ context.ace = {
204
+ detected_tech: detectedTech,
205
+ active_topics: activeTopics,
206
+ };
207
+ }
208
+ catch {
209
+ // ACE tables might not exist
210
+ context.ace = {
211
+ detected_tech: [],
212
+ active_topics: [],
213
+ };
214
+ }
215
+ }
216
+ // Learned preferences
217
+ if (includeLearned) {
218
+ try {
219
+ const affinitiesStmt = this.db.prepare(`
220
+ SELECT topic, affinity_score, confidence, positive_signals, negative_signals, total_exposures
221
+ FROM topic_affinities
222
+ WHERE confidence > 0.1
223
+ ORDER BY affinity_score DESC
224
+ LIMIT 50
225
+ `);
226
+ const affinities = affinitiesStmt.all();
227
+ const antiTopicsStmt = this.db.prepare(`
228
+ SELECT topic, rejection_count, confidence, auto_detected, user_confirmed
229
+ FROM anti_topics
230
+ WHERE confidence > 0.3
231
+ ORDER BY confidence DESC
232
+ LIMIT 50
233
+ `);
234
+ const antiTopics = antiTopicsStmt.all();
235
+ context.learned = {
236
+ topic_affinities: affinities,
237
+ anti_topics: antiTopics.map((at) => ({
238
+ ...at,
239
+ auto_detected: Boolean(at.auto_detected),
240
+ user_confirmed: Boolean(at.user_confirmed),
241
+ })),
242
+ };
243
+ }
244
+ catch {
245
+ // Learned tables might not exist
246
+ context.learned = {
247
+ topic_affinities: [],
248
+ anti_topics: [],
249
+ };
250
+ }
251
+ }
252
+ return context;
253
+ }
254
+ // ===========================================================================
255
+ // Relevance Explanation
256
+ // ===========================================================================
257
+ /**
258
+ * Explain why an item was considered relevant
259
+ */
260
+ explainRelevance(itemId, sourceType) {
261
+ const item = this.getSourceItem(itemId, sourceType);
262
+ if (!item) {
263
+ return null;
264
+ }
265
+ const context = this.getUserContext(true, true);
266
+ const itemTopics = this.extractTopics(item.title + " " + item.content);
267
+ // Compute matching elements
268
+ const matchingInterests = context.interests
269
+ .filter((i) => itemTopics.some((t) => this.topicMatches(t, i.topic)))
270
+ .map((i) => i.topic);
271
+ const matchingTech = context.tech_stack.filter((tech) => itemTopics.some((t) => this.topicMatches(t, tech)));
272
+ const matchingTopics = context.ace?.active_topics
273
+ .filter((at) => itemTopics.some((t) => this.topicMatches(t, at.topic)))
274
+ .map((at) => at.topic) || [];
275
+ const matchingAffinities = context.learned?.topic_affinities
276
+ .filter((ta) => ta.affinity_score > 0 && itemTopics.some((t) => this.topicMatches(t, ta.topic)))
277
+ .map((ta) => ta.topic) || [];
278
+ // Compute score breakdown
279
+ const staticScore = matchingInterests.length * 0.3 +
280
+ matchingTech.length * 0.2 +
281
+ (context.domains.some((d) => itemTopics.some((t) => this.topicMatches(t, d)))
282
+ ? 0.15
283
+ : 0);
284
+ const aceScore = context.ace
285
+ ? matchingTopics.length * 0.1 +
286
+ context.ace.detected_tech.filter((dt) => itemTopics.some((t) => this.topicMatches(t, dt.name))).length *
287
+ 0.05
288
+ : 0;
289
+ const learnedScore = context.learned
290
+ ? context.learned.topic_affinities
291
+ .filter((ta) => ta.affinity_score > 0 && itemTopics.some((t) => this.topicMatches(t, ta.topic)))
292
+ .reduce((sum, ta) => sum + ta.affinity_score * 0.1 * ta.confidence, 0)
293
+ : 0;
294
+ // Anti-penalty from exclusions and anti-topics
295
+ let antiPenalty = 0;
296
+ for (const exclusion of context.exclusions) {
297
+ if (itemTopics.some((t) => this.topicMatches(t, exclusion))) {
298
+ antiPenalty = 1.0; // Hard exclusion
299
+ break;
300
+ }
301
+ }
302
+ if (antiPenalty === 0 && context.learned) {
303
+ for (const antiTopic of context.learned.anti_topics) {
304
+ if (itemTopics.some((t) => this.topicMatches(t, antiTopic.topic))) {
305
+ antiPenalty = Math.max(antiPenalty, antiTopic.confidence * 0.5);
306
+ }
307
+ }
308
+ }
309
+ const finalScore = Math.max(0, Math.min(1, staticScore + aceScore + learnedScore - antiPenalty));
310
+ const scoreBreakdown = {
311
+ embedding_similarity: null, // Not computing embedding similarity in MCP server
312
+ static_match_score: Math.round(staticScore * 100) / 100,
313
+ ace_match_score: Math.round(aceScore * 100) / 100,
314
+ learned_affinity_score: Math.round(learnedScore * 100) / 100,
315
+ anti_penalty: Math.round(antiPenalty * 100) / 100,
316
+ final_score: Math.round(finalScore * 100) / 100,
317
+ };
318
+ const matchingContext = {
319
+ matching_interests: matchingInterests,
320
+ matching_tech: matchingTech,
321
+ matching_topics: matchingTopics,
322
+ matching_affinities: matchingAffinities,
323
+ };
324
+ // Generate human-readable explanation
325
+ const explanationParts = [];
326
+ if (matchingInterests.length > 0) {
327
+ explanationParts.push(`Matches your interests: ${matchingInterests.slice(0, 3).join(", ")}`);
328
+ }
329
+ if (matchingTech.length > 0) {
330
+ explanationParts.push(`Related to your tech stack: ${matchingTech.slice(0, 3).join(", ")}`);
331
+ }
332
+ if (matchingTopics.length > 0) {
333
+ explanationParts.push(`Relevant to recent work: ${matchingTopics.slice(0, 3).join(", ")}`);
334
+ }
335
+ if (matchingAffinities.length > 0) {
336
+ explanationParts.push(`You've shown interest in: ${matchingAffinities.slice(0, 3).join(", ")}`);
337
+ }
338
+ if (antiPenalty > 0) {
339
+ explanationParts.push(`Score reduced due to excluded topics`);
340
+ }
341
+ const explanation = explanationParts.length > 0
342
+ ? explanationParts.join(". ") + "."
343
+ : "No specific matches found - may be based on general relevance.";
344
+ return {
345
+ item_id: itemId,
346
+ source_type: sourceType,
347
+ title: item.title,
348
+ score_breakdown: scoreBreakdown,
349
+ matching_context: matchingContext,
350
+ explanation,
351
+ };
352
+ }
353
+ // ===========================================================================
354
+ // Feedback
355
+ // ===========================================================================
356
+ /**
357
+ * Record user feedback on an item
358
+ */
359
+ recordFeedback(itemId, sourceType, action) {
360
+ // Verify item exists
361
+ const item = this.getSourceItem(itemId, sourceType);
362
+ if (!item) {
363
+ return {
364
+ success: false,
365
+ message: `Item ${itemId} of type ${sourceType} not found`,
366
+ };
367
+ }
368
+ // Map action to signal strength
369
+ const signalStrength = {
370
+ click: 0.3,
371
+ save: 0.8,
372
+ dismiss: -0.2,
373
+ mark_irrelevant: -0.5,
374
+ };
375
+ try {
376
+ const stmt = this.db.prepare(`
377
+ INSERT INTO interactions (item_id, action_type, item_source, signal_strength, timestamp)
378
+ VALUES (?, ?, ?, ?, datetime('now'))
379
+ `);
380
+ const result = stmt.run(itemId, action, sourceType, signalStrength[action]);
381
+ return {
382
+ success: true,
383
+ message: `Recorded ${action} feedback for item ${itemId}`,
384
+ interaction_id: result.lastInsertRowid,
385
+ };
386
+ }
387
+ catch (error) {
388
+ return {
389
+ success: false,
390
+ message: `Failed to record feedback: ${error instanceof Error ? error.message : String(error)}`,
391
+ };
392
+ }
393
+ }
394
+ // ===========================================================================
395
+ // Helper Methods
396
+ // ===========================================================================
397
+ /**
398
+ * Compute relevance score for an item based on user context
399
+ */
400
+ computeRelevanceScore(item, context) {
401
+ const itemTopics = this.extractTopics(item.title + " " + item.content);
402
+ // Check hard exclusions first
403
+ for (const exclusion of context.exclusions) {
404
+ if (itemTopics.some((t) => this.topicMatches(t, exclusion))) {
405
+ return 0;
406
+ }
407
+ }
408
+ let score = 0;
409
+ // Static identity matching
410
+ for (const interest of context.interests) {
411
+ if (itemTopics.some((t) => this.topicMatches(t, interest.topic))) {
412
+ score += 0.3 * interest.weight;
413
+ }
414
+ }
415
+ for (const tech of context.tech_stack) {
416
+ if (itemTopics.some((t) => this.topicMatches(t, tech))) {
417
+ score += 0.2;
418
+ }
419
+ }
420
+ for (const domain of context.domains) {
421
+ if (itemTopics.some((t) => this.topicMatches(t, domain))) {
422
+ score += 0.15;
423
+ }
424
+ }
425
+ // ACE-detected context
426
+ if (context.ace) {
427
+ for (const topic of context.ace.active_topics) {
428
+ if (itemTopics.some((t) => this.topicMatches(t, topic.topic))) {
429
+ score += 0.1 * topic.weight * topic.confidence;
430
+ }
431
+ }
432
+ for (const tech of context.ace.detected_tech) {
433
+ if (itemTopics.some((t) => this.topicMatches(t, tech.name))) {
434
+ score += 0.05 * tech.confidence;
435
+ }
436
+ }
437
+ }
438
+ // Learned affinities
439
+ if (context.learned) {
440
+ for (const affinity of context.learned.topic_affinities) {
441
+ if (affinity.affinity_score > 0 &&
442
+ itemTopics.some((t) => this.topicMatches(t, affinity.topic))) {
443
+ score += affinity.affinity_score * 0.1 * affinity.confidence;
444
+ }
445
+ }
446
+ // Anti-topics penalty
447
+ for (const antiTopic of context.learned.anti_topics) {
448
+ if (itemTopics.some((t) => this.topicMatches(t, antiTopic.topic))) {
449
+ score -= antiTopic.confidence * 0.3;
450
+ }
451
+ }
452
+ }
453
+ return Math.max(0, Math.min(1, score));
454
+ }
455
+ /**
456
+ * Extract topics from text (simple keyword extraction)
457
+ */
458
+ extractTopics(text) {
459
+ // Simple topic extraction - split on word boundaries, filter meaningful words
460
+ return text
461
+ .toLowerCase()
462
+ .split(/[\s\-_.,;:!?'"()\[\]{}]+/)
463
+ .filter((word) => word.length > 2)
464
+ .filter((word) => !this.isStopWord(word));
465
+ }
466
+ /**
467
+ * Check if a topic matches a term (case-insensitive, partial match)
468
+ */
469
+ topicMatches(topic, term) {
470
+ const normalizedTopic = topic.toLowerCase();
471
+ const normalizedTerm = term.toLowerCase();
472
+ return (normalizedTopic.includes(normalizedTerm) || normalizedTerm.includes(normalizedTopic));
473
+ }
474
+ /**
475
+ * Check if a word is a stop word
476
+ */
477
+ isStopWord(word) {
478
+ const stopWords = new Set([
479
+ "the",
480
+ "a",
481
+ "an",
482
+ "and",
483
+ "or",
484
+ "but",
485
+ "in",
486
+ "on",
487
+ "at",
488
+ "to",
489
+ "for",
490
+ "of",
491
+ "with",
492
+ "by",
493
+ "from",
494
+ "as",
495
+ "is",
496
+ "was",
497
+ "are",
498
+ "were",
499
+ "been",
500
+ "be",
501
+ "have",
502
+ "has",
503
+ "had",
504
+ "do",
505
+ "does",
506
+ "did",
507
+ "will",
508
+ "would",
509
+ "could",
510
+ "should",
511
+ "may",
512
+ "might",
513
+ "can",
514
+ "this",
515
+ "that",
516
+ "these",
517
+ "those",
518
+ "it",
519
+ "its",
520
+ "they",
521
+ "them",
522
+ "their",
523
+ "we",
524
+ "us",
525
+ "our",
526
+ "you",
527
+ "your",
528
+ "he",
529
+ "she",
530
+ "him",
531
+ "her",
532
+ "his",
533
+ "hers",
534
+ "who",
535
+ "what",
536
+ "when",
537
+ "where",
538
+ "why",
539
+ "how",
540
+ "all",
541
+ "each",
542
+ "every",
543
+ "both",
544
+ "few",
545
+ "more",
546
+ "most",
547
+ "other",
548
+ "some",
549
+ "such",
550
+ "no",
551
+ "not",
552
+ "only",
553
+ "same",
554
+ "so",
555
+ "than",
556
+ "too",
557
+ "very",
558
+ "just",
559
+ "also",
560
+ "now",
561
+ "here",
562
+ "there",
563
+ "then",
564
+ "new",
565
+ "first",
566
+ "one",
567
+ "two",
568
+ ]);
569
+ return stopWords.has(word);
570
+ }
571
+ }
572
+ /**
573
+ * Create a database instance
574
+ */
575
+ export function createDatabase(dbPath) {
576
+ return new FourDADatabase(dbPath);
577
+ }
578
+ //# sourceMappingURL=db.js.map
package/dist/db.js.map ADDED
@@ -0,0 +1 @@
1
+ {"version":3,"file":"db.js","sourceRoot":"","sources":["../src/db.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,37 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * 4DA MCP Server - Internal Use Only
4
+ *
5
+ * This MCP server provides tool and resource access to 4DA's local database
6
+ * for use with Claude Desktop and other MCP-compatible hosts.
7
+ *
8
+ * IMPORTANT: This server is designed for LOCAL use only. It reads from the
9
+ * user's local 4DA SQLite database. It does NOT implement authentication
10
+ * or authorization - it trusts the local environment.
11
+ *
12
+ * Do NOT expose this server over a network without adding proper auth.
13
+ */
14
+ /**
15
+ * 4DA MCP Server v3.0 - AI Superpower Edition
16
+ *
17
+ * Exposes 4DA's personalized content filtering to AI agents via MCP.
18
+ * Now with local LLM support via Ollama for fully offline AI synthesis.
19
+ *
20
+ * Core Tools (4):
21
+ * - get_relevant_content: Get filtered relevant content from 4DA
22
+ * - get_context: Get the user's context (what 4DA knows about them)
23
+ * - explain_relevance: Explain why an item was considered relevant
24
+ * - record_feedback: Record user feedback for learning
25
+ *
26
+ * AI Superpower Tools (8):
27
+ * - score_autopsy: Deep forensic analysis of relevance scores (AI-powered)
28
+ * - trend_analysis: Statistical patterns and anomaly detection (AI-powered)
29
+ * - daily_briefing: Executive summaries of discoveries (AI-powered)
30
+ * - context_analysis: Optimize your context for better relevance (AI-powered)
31
+ * - source_health: Diagnose source pipeline issues
32
+ * - topic_connections: Build knowledge graphs from content (AI-powered)
33
+ * - config_validator: Validate configuration and detect issues
34
+ * - llm_status: Check LLM configuration and Ollama availability
35
+ */
36
+ export {};
37
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AACA;;;;;;;;;;;GAWG;AACH;;;;;;;;;;;;;;;;;;;;;GAqBG"}