@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.
- package/README.md +135 -0
- package/dist/db.d.ts +64 -0
- package/dist/db.d.ts.map +1 -0
- package/dist/db.js +578 -0
- package/dist/db.js.map +1 -0
- package/dist/index.d.ts +37 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +422 -0
- package/dist/index.js.map +1 -0
- package/dist/llm.d.ts +144 -0
- package/dist/llm.d.ts.map +1 -0
- package/dist/llm.js +447 -0
- package/dist/llm.js.map +1 -0
- package/dist/output-manager.d.ts +156 -0
- package/dist/output-manager.d.ts.map +1 -0
- package/dist/output-manager.js +156 -0
- package/dist/output-manager.js.map +1 -0
- package/dist/schema-registry.d.ts +46 -0
- package/dist/schema-registry.d.ts.map +1 -0
- package/dist/schema-registry.js +133 -0
- package/dist/schema-registry.js.map +1 -0
- package/dist/schemas/config-validator.json +18 -0
- package/dist/schemas/context-analysis.json +25 -0
- package/dist/schemas/daily-briefing.json +34 -0
- package/dist/schemas/explain-relevance.json +19 -0
- package/dist/schemas/get-actionable-signals.json +29 -0
- package/dist/schemas/get-context.json +17 -0
- package/dist/schemas/get-relevant-content.json +26 -0
- package/dist/schemas/llm-status.json +13 -0
- package/dist/schemas/record-feedback.json +24 -0
- package/dist/schemas/score-autopsy.json +30 -0
- package/dist/schemas/source-health.json +17 -0
- package/dist/schemas/topic-connections.json +34 -0
- package/dist/schemas/trend-analysis.json +29 -0
- package/dist/tools/attention-report.d.ts +39 -0
- package/dist/tools/attention-report.d.ts.map +1 -0
- package/dist/tools/attention-report.js +72 -0
- package/dist/tools/attention-report.js.map +1 -0
- package/dist/tools/config-validator.d.ts +59 -0
- package/dist/tools/config-validator.d.ts.map +1 -0
- package/dist/tools/config-validator.js +375 -0
- package/dist/tools/config-validator.js.map +1 -0
- package/dist/tools/context-analysis.d.ts +108 -0
- package/dist/tools/context-analysis.d.ts.map +1 -0
- package/dist/tools/context-analysis.js +300 -0
- package/dist/tools/context-analysis.js.map +1 -0
- package/dist/tools/daily-briefing.d.ts +103 -0
- package/dist/tools/daily-briefing.d.ts.map +1 -0
- package/dist/tools/daily-briefing.js +278 -0
- package/dist/tools/daily-briefing.js.map +1 -0
- package/dist/tools/explain-relevance.d.ts +36 -0
- package/dist/tools/explain-relevance.d.ts.map +1 -0
- package/dist/tools/explain-relevance.js +50 -0
- package/dist/tools/explain-relevance.js.map +1 -0
- package/dist/tools/export-context.d.ts +43 -0
- package/dist/tools/export-context.d.ts.map +1 -0
- package/dist/tools/export-context.js +104 -0
- package/dist/tools/export-context.js.map +1 -0
- package/dist/tools/get-actionable-signals.d.ts +65 -0
- package/dist/tools/get-actionable-signals.d.ts.map +1 -0
- package/dist/tools/get-actionable-signals.js +268 -0
- package/dist/tools/get-actionable-signals.js.map +1 -0
- package/dist/tools/get-context.d.ts +34 -0
- package/dist/tools/get-context.d.ts.map +1 -0
- package/dist/tools/get-context.js +43 -0
- package/dist/tools/get-context.js.map +1 -0
- package/dist/tools/get-relevant-content.d.ts +44 -0
- package/dist/tools/get-relevant-content.d.ts.map +1 -0
- package/dist/tools/get-relevant-content.js +56 -0
- package/dist/tools/get-relevant-content.js.map +1 -0
- package/dist/tools/index.d.ts +40 -0
- package/dist/tools/index.d.ts.map +1 -0
- package/dist/tools/index.js +44 -0
- package/dist/tools/index.js.map +1 -0
- package/dist/tools/knowledge-gaps.d.ts +36 -0
- package/dist/tools/knowledge-gaps.d.ts.map +1 -0
- package/dist/tools/knowledge-gaps.js +76 -0
- package/dist/tools/knowledge-gaps.js.map +1 -0
- package/dist/tools/llm-status.d.ts +45 -0
- package/dist/tools/llm-status.d.ts.map +1 -0
- package/dist/tools/llm-status.js +92 -0
- package/dist/tools/llm-status.js.map +1 -0
- package/dist/tools/project-health.d.ts +41 -0
- package/dist/tools/project-health.d.ts.map +1 -0
- package/dist/tools/project-health.js +71 -0
- package/dist/tools/project-health.js.map +1 -0
- package/dist/tools/record-feedback.d.ts +39 -0
- package/dist/tools/record-feedback.d.ts.map +1 -0
- package/dist/tools/record-feedback.js +60 -0
- package/dist/tools/record-feedback.js.map +1 -0
- package/dist/tools/reverse-mentions.d.ts +38 -0
- package/dist/tools/reverse-mentions.d.ts.map +1 -0
- package/dist/tools/reverse-mentions.js +57 -0
- package/dist/tools/reverse-mentions.js.map +1 -0
- package/dist/tools/score-autopsy.d.ts +93 -0
- package/dist/tools/score-autopsy.d.ts.map +1 -0
- package/dist/tools/score-autopsy.js +288 -0
- package/dist/tools/score-autopsy.js.map +1 -0
- package/dist/tools/semantic-shifts.d.ts +37 -0
- package/dist/tools/semantic-shifts.d.ts.map +1 -0
- package/dist/tools/semantic-shifts.js +73 -0
- package/dist/tools/semantic-shifts.js.map +1 -0
- package/dist/tools/signal-chains.d.ts +45 -0
- package/dist/tools/signal-chains.d.ts.map +1 -0
- package/dist/tools/signal-chains.js +60 -0
- package/dist/tools/signal-chains.js.map +1 -0
- package/dist/tools/source-health.d.ts +64 -0
- package/dist/tools/source-health.d.ts.map +1 -0
- package/dist/tools/source-health.js +176 -0
- package/dist/tools/source-health.js.map +1 -0
- package/dist/tools/topic-connections.d.ts +112 -0
- package/dist/tools/topic-connections.d.ts.map +1 -0
- package/dist/tools/topic-connections.js +318 -0
- package/dist/tools/topic-connections.js.map +1 -0
- package/dist/tools/trend-analysis.d.ts +105 -0
- package/dist/tools/trend-analysis.d.ts.map +1 -0
- package/dist/tools/trend-analysis.js +295 -0
- package/dist/tools/trend-analysis.js.map +1 -0
- package/dist/types.d.ts +163 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +7 -0
- package/dist/types.js.map +1 -0
- 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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"}
|
package/dist/index.d.ts
ADDED
|
@@ -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"}
|