@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
|
@@ -0,0 +1,176 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Source Health Tool
|
|
3
|
+
*
|
|
4
|
+
* Diagnose source fetching, parsing, and data flow issues.
|
|
5
|
+
* This is a SUPERPOWER - it reveals pipeline problems before they become mysteries.
|
|
6
|
+
*/
|
|
7
|
+
export const sourceHealthTool = {
|
|
8
|
+
name: "source_health",
|
|
9
|
+
description: `Diagnose the health of 4DA's content sources.
|
|
10
|
+
Returns:
|
|
11
|
+
- Per-source status (healthy/degraded/failing)
|
|
12
|
+
- Recent fetch statistics
|
|
13
|
+
- Data quality metrics
|
|
14
|
+
- Error patterns detected
|
|
15
|
+
- Recommendations for fixes
|
|
16
|
+
|
|
17
|
+
Use this when content seems stale or sources aren't working.`,
|
|
18
|
+
inputSchema: {
|
|
19
|
+
type: "object",
|
|
20
|
+
properties: {
|
|
21
|
+
source: {
|
|
22
|
+
type: "string",
|
|
23
|
+
description: "Specific source to analyze (optional, all if not specified)",
|
|
24
|
+
},
|
|
25
|
+
hours: {
|
|
26
|
+
type: "number",
|
|
27
|
+
description: "Hours to analyze (default: 24)",
|
|
28
|
+
},
|
|
29
|
+
},
|
|
30
|
+
},
|
|
31
|
+
};
|
|
32
|
+
export function executeSourceHealth(db, params) {
|
|
33
|
+
const { source, hours = 24 } = params;
|
|
34
|
+
const dbInstance = db.db;
|
|
35
|
+
const endDate = new Date();
|
|
36
|
+
const startDate = new Date(endDate.getTime() - hours * 60 * 60 * 1000);
|
|
37
|
+
// Get all sources or specific one
|
|
38
|
+
const sourcesStmt = dbInstance.prepare(`
|
|
39
|
+
SELECT DISTINCT source_type FROM source_items
|
|
40
|
+
`);
|
|
41
|
+
const allSources = sourcesStmt.all().map(s => s.source_type);
|
|
42
|
+
const sourcesToAnalyze = source ? [source] : allSources;
|
|
43
|
+
const sourceStatuses = [];
|
|
44
|
+
for (const src of sourcesToAnalyze) {
|
|
45
|
+
const status = analyzeSource(dbInstance, src, hours);
|
|
46
|
+
sourceStatuses.push(status);
|
|
47
|
+
}
|
|
48
|
+
// Calculate summary
|
|
49
|
+
const healthy = sourceStatuses.filter(s => s.status === "healthy").length;
|
|
50
|
+
const degraded = sourceStatuses.filter(s => s.status === "degraded").length;
|
|
51
|
+
const failing = sourceStatuses.filter(s => s.status === "failing").length;
|
|
52
|
+
const totalItems24h = sourceStatuses.reduce((sum, s) => sum + s.items_24h, 0);
|
|
53
|
+
// Determine overall status
|
|
54
|
+
const overallStatus = failing > 0 ? "critical" :
|
|
55
|
+
degraded > 0 ? "degraded" : "healthy";
|
|
56
|
+
// Global recommendations
|
|
57
|
+
const globalRecs = [];
|
|
58
|
+
if (failing > 0) {
|
|
59
|
+
globalRecs.push(`${failing} source(s) failing - check network connectivity and API status`);
|
|
60
|
+
}
|
|
61
|
+
if (totalItems24h === 0) {
|
|
62
|
+
globalRecs.push("No items in last 24h - verify background jobs are running");
|
|
63
|
+
}
|
|
64
|
+
if (degraded > healthy) {
|
|
65
|
+
globalRecs.push("Most sources degraded - consider reviewing fetch intervals");
|
|
66
|
+
}
|
|
67
|
+
return {
|
|
68
|
+
analysis_period: {
|
|
69
|
+
start: startDate.toISOString(),
|
|
70
|
+
end: endDate.toISOString(),
|
|
71
|
+
hours,
|
|
72
|
+
},
|
|
73
|
+
overall_status: overallStatus,
|
|
74
|
+
sources: sourceStatuses,
|
|
75
|
+
summary: {
|
|
76
|
+
total_sources: sourceStatuses.length,
|
|
77
|
+
healthy,
|
|
78
|
+
degraded,
|
|
79
|
+
failing,
|
|
80
|
+
total_items_24h: totalItems24h,
|
|
81
|
+
},
|
|
82
|
+
global_recommendations: globalRecs,
|
|
83
|
+
};
|
|
84
|
+
}
|
|
85
|
+
function analyzeSource(db, source, hours) {
|
|
86
|
+
// Last item
|
|
87
|
+
const lastItemStmt = db.prepare(`
|
|
88
|
+
SELECT created_at FROM source_items
|
|
89
|
+
WHERE source_type = ?
|
|
90
|
+
ORDER BY created_at DESC
|
|
91
|
+
LIMIT 1
|
|
92
|
+
`);
|
|
93
|
+
const lastItem = lastItemStmt.get(source);
|
|
94
|
+
const lastItemAt = lastItem?.created_at || null;
|
|
95
|
+
const hoursSinceLast = lastItemAt
|
|
96
|
+
? (Date.now() - new Date(lastItemAt.replace(" ", "T") + "Z").getTime()) / (1000 * 60 * 60)
|
|
97
|
+
: null;
|
|
98
|
+
// Items in last 24h
|
|
99
|
+
const items24hStmt = db.prepare(`
|
|
100
|
+
SELECT COUNT(*) as count FROM source_items
|
|
101
|
+
WHERE source_type = ?
|
|
102
|
+
AND datetime(created_at) >= datetime('now', '-24 hours')
|
|
103
|
+
`);
|
|
104
|
+
const items24h = items24hStmt.get(source)?.count || 0;
|
|
105
|
+
// Items in last 7d
|
|
106
|
+
const items7dStmt = db.prepare(`
|
|
107
|
+
SELECT COUNT(*) as count FROM source_items
|
|
108
|
+
WHERE source_type = ?
|
|
109
|
+
AND datetime(created_at) >= datetime('now', '-7 days')
|
|
110
|
+
`);
|
|
111
|
+
const items7d = items7dStmt.get(source)?.count || 0;
|
|
112
|
+
// Quality metrics
|
|
113
|
+
const qualityStmt = db.prepare(`
|
|
114
|
+
SELECT
|
|
115
|
+
AVG(CASE WHEN url IS NOT NULL AND url != '' THEN 1.0 ELSE 0.0 END) as has_url_rate,
|
|
116
|
+
AVG(CASE WHEN content IS NOT NULL AND content != '' THEN 1.0 ELSE 0.0 END) as has_content_rate,
|
|
117
|
+
AVG(LENGTH(COALESCE(content, ''))) as avg_content_length
|
|
118
|
+
FROM source_items
|
|
119
|
+
WHERE source_type = ?
|
|
120
|
+
AND datetime(created_at) >= datetime('now', '-7 days')
|
|
121
|
+
`);
|
|
122
|
+
const quality = qualityStmt.get(source);
|
|
123
|
+
// Determine issues
|
|
124
|
+
const issues = [];
|
|
125
|
+
const recommendations = [];
|
|
126
|
+
// Check for staleness
|
|
127
|
+
if (hoursSinceLast !== null && hoursSinceLast > 24) {
|
|
128
|
+
issues.push(`No new items in ${Math.round(hoursSinceLast)} hours`);
|
|
129
|
+
recommendations.push("Check if source is enabled and API is accessible");
|
|
130
|
+
}
|
|
131
|
+
// Check for low volume
|
|
132
|
+
const avgPerDay = items7d / 7;
|
|
133
|
+
if (avgPerDay < 1 && items7d > 0) {
|
|
134
|
+
issues.push(`Very low volume: ${avgPerDay.toFixed(1)} items/day average`);
|
|
135
|
+
recommendations.push("Source may have fetch issues or very restrictive filters");
|
|
136
|
+
}
|
|
137
|
+
// Check quality
|
|
138
|
+
if (quality && quality.has_url_rate < 0.8) {
|
|
139
|
+
issues.push(`${Math.round((1 - quality.has_url_rate) * 100)}% of items missing URLs`);
|
|
140
|
+
}
|
|
141
|
+
if (quality && quality.has_content_rate < 0.5) {
|
|
142
|
+
issues.push(`${Math.round((1 - quality.has_content_rate) * 100)}% of items missing content`);
|
|
143
|
+
recommendations.push("Content extraction may be failing - check parser");
|
|
144
|
+
}
|
|
145
|
+
// Determine status
|
|
146
|
+
let status;
|
|
147
|
+
if (items7d === 0) {
|
|
148
|
+
status = "unknown";
|
|
149
|
+
}
|
|
150
|
+
else if (hoursSinceLast !== null && hoursSinceLast > 48) {
|
|
151
|
+
status = "failing";
|
|
152
|
+
}
|
|
153
|
+
else if (issues.length > 2 || (hoursSinceLast !== null && hoursSinceLast > 24)) {
|
|
154
|
+
status = "degraded";
|
|
155
|
+
}
|
|
156
|
+
else {
|
|
157
|
+
status = "healthy";
|
|
158
|
+
}
|
|
159
|
+
return {
|
|
160
|
+
source,
|
|
161
|
+
status,
|
|
162
|
+
last_item_at: lastItemAt,
|
|
163
|
+
hours_since_last: hoursSinceLast ? Math.round(hoursSinceLast * 10) / 10 : null,
|
|
164
|
+
items_24h: items24h,
|
|
165
|
+
items_7d: items7d,
|
|
166
|
+
avg_items_per_day: Math.round(avgPerDay * 10) / 10,
|
|
167
|
+
quality_metrics: {
|
|
168
|
+
has_url_rate: Math.round((quality?.has_url_rate || 0) * 100) / 100,
|
|
169
|
+
has_content_rate: Math.round((quality?.has_content_rate || 0) * 100) / 100,
|
|
170
|
+
avg_content_length: Math.round(quality?.avg_content_length || 0),
|
|
171
|
+
},
|
|
172
|
+
issues,
|
|
173
|
+
recommendations,
|
|
174
|
+
};
|
|
175
|
+
}
|
|
176
|
+
//# sourceMappingURL=source-health.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"source-health.js","sourceRoot":"","sources":["../../src/tools/source-health.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,112 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Topic Connections Tool
|
|
3
|
+
*
|
|
4
|
+
* Build and explore knowledge graphs from discovered content.
|
|
5
|
+
* This is a SUPERPOWER - it reveals hidden connections between topics.
|
|
6
|
+
*
|
|
7
|
+
* With synthesize=true, uses LLM to explain the significance of connections.
|
|
8
|
+
*/
|
|
9
|
+
import type { FourDADatabase } from "../db.js";
|
|
10
|
+
import { type CompactResult, type TopicConnectionsKeyData } from "../output-manager.js";
|
|
11
|
+
export declare const topicConnectionsTool: {
|
|
12
|
+
name: string;
|
|
13
|
+
description: string;
|
|
14
|
+
inputSchema: {
|
|
15
|
+
type: string;
|
|
16
|
+
properties: {
|
|
17
|
+
topics: {
|
|
18
|
+
type: string;
|
|
19
|
+
items: {
|
|
20
|
+
type: string;
|
|
21
|
+
};
|
|
22
|
+
description: string;
|
|
23
|
+
};
|
|
24
|
+
find_path: {
|
|
25
|
+
type: string;
|
|
26
|
+
properties: {
|
|
27
|
+
from: {
|
|
28
|
+
type: string;
|
|
29
|
+
};
|
|
30
|
+
to: {
|
|
31
|
+
type: string;
|
|
32
|
+
};
|
|
33
|
+
};
|
|
34
|
+
description: string;
|
|
35
|
+
};
|
|
36
|
+
days: {
|
|
37
|
+
type: string;
|
|
38
|
+
description: string;
|
|
39
|
+
};
|
|
40
|
+
synthesize: {
|
|
41
|
+
type: string;
|
|
42
|
+
description: string;
|
|
43
|
+
};
|
|
44
|
+
compact: {
|
|
45
|
+
type: string;
|
|
46
|
+
description: string;
|
|
47
|
+
};
|
|
48
|
+
};
|
|
49
|
+
};
|
|
50
|
+
};
|
|
51
|
+
export interface TopicConnectionsParams {
|
|
52
|
+
topics?: string[];
|
|
53
|
+
find_path?: {
|
|
54
|
+
from: string;
|
|
55
|
+
to: string;
|
|
56
|
+
};
|
|
57
|
+
days?: number;
|
|
58
|
+
synthesize?: boolean;
|
|
59
|
+
compact?: boolean;
|
|
60
|
+
}
|
|
61
|
+
interface TopicNode {
|
|
62
|
+
topic: string;
|
|
63
|
+
mention_count: number;
|
|
64
|
+
avg_relevance: number;
|
|
65
|
+
centrality: number;
|
|
66
|
+
connections: number;
|
|
67
|
+
}
|
|
68
|
+
interface TopicEdge {
|
|
69
|
+
from: string;
|
|
70
|
+
to: string;
|
|
71
|
+
co_occurrences: number;
|
|
72
|
+
strength: "strong" | "medium" | "weak";
|
|
73
|
+
}
|
|
74
|
+
interface TopicPath {
|
|
75
|
+
from: string;
|
|
76
|
+
to: string;
|
|
77
|
+
path: string[];
|
|
78
|
+
direct_connection: boolean;
|
|
79
|
+
connecting_items: {
|
|
80
|
+
title: string;
|
|
81
|
+
score: number;
|
|
82
|
+
}[];
|
|
83
|
+
}
|
|
84
|
+
interface TopicCluster {
|
|
85
|
+
name: string;
|
|
86
|
+
topics: string[];
|
|
87
|
+
item_count: number;
|
|
88
|
+
coherence: number;
|
|
89
|
+
}
|
|
90
|
+
interface TopicConnectionsResult {
|
|
91
|
+
analysis_period: {
|
|
92
|
+
days: number;
|
|
93
|
+
items_analyzed: number;
|
|
94
|
+
};
|
|
95
|
+
nodes: TopicNode[];
|
|
96
|
+
edges: TopicEdge[];
|
|
97
|
+
path?: TopicPath;
|
|
98
|
+
clusters: TopicCluster[];
|
|
99
|
+
central_topics: string[];
|
|
100
|
+
isolated_topics: string[];
|
|
101
|
+
insights: string[];
|
|
102
|
+
ai_insights?: {
|
|
103
|
+
graph_narrative: string;
|
|
104
|
+
surprising_connection: string;
|
|
105
|
+
exploration_suggestion: string;
|
|
106
|
+
hidden_pattern: string;
|
|
107
|
+
model_used: string;
|
|
108
|
+
};
|
|
109
|
+
}
|
|
110
|
+
export declare function executeTopicConnections(db: FourDADatabase, params: TopicConnectionsParams): Promise<TopicConnectionsResult | CompactResult<TopicConnectionsKeyData>>;
|
|
111
|
+
export {};
|
|
112
|
+
//# sourceMappingURL=topic-connections.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"topic-connections.d.ts","sourceRoot":"","sources":["../../src/tools/topic-connections.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,UAAU,CAAC;AAE/C,OAAO,EAAiC,KAAK,aAAa,EAAE,KAAK,uBAAuB,EAAE,MAAM,sBAAsB,CAAC;AAEvH,eAAO,MAAM,oBAAoB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA4ChC,CAAC;AAEF,MAAM,WAAW,sBAAsB;IACrC,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;IAClB,SAAS,CAAC,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,EAAE,EAAE,MAAM,CAAA;KAAE,CAAC;IACzC,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAED,UAAU,SAAS;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,aAAa,EAAE,MAAM,CAAC;IACtB,aAAa,EAAE,MAAM,CAAC;IACtB,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,UAAU,SAAS;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,EAAE,EAAE,MAAM,CAAC;IACX,cAAc,EAAE,MAAM,CAAC;IACvB,QAAQ,EAAE,QAAQ,GAAG,QAAQ,GAAG,MAAM,CAAC;CACxC;AAED,UAAU,SAAS;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,iBAAiB,EAAE,OAAO,CAAC;IAC3B,gBAAgB,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC;CACtD;AAED,UAAU,YAAY;IACpB,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,UAAU,sBAAsB;IAC9B,eAAe,EAAE;QACf,IAAI,EAAE,MAAM,CAAC;QACb,cAAc,EAAE,MAAM,CAAC;KACxB,CAAC;IACF,KAAK,EAAE,SAAS,EAAE,CAAC;IACnB,KAAK,EAAE,SAAS,EAAE,CAAC;IACnB,IAAI,CAAC,EAAE,SAAS,CAAC;IACjB,QAAQ,EAAE,YAAY,EAAE,CAAC;IACzB,cAAc,EAAE,MAAM,EAAE,CAAC;IACzB,eAAe,EAAE,MAAM,EAAE,CAAC;IAC1B,QAAQ,EAAE,MAAM,EAAE,CAAC;IAEnB,WAAW,CAAC,EAAE;QACZ,eAAe,EAAE,MAAM,CAAC;QACxB,qBAAqB,EAAE,MAAM,CAAC;QAC9B,sBAAsB,EAAE,MAAM,CAAC;QAC/B,cAAc,EAAE,MAAM,CAAC;QACvB,UAAU,EAAE,MAAM,CAAC;KACpB,CAAC;CACH;AAED,wBAAsB,uBAAuB,CAC3C,EAAE,EAAE,cAAc,EAClB,MAAM,EAAE,sBAAsB,GAC7B,OAAO,CAAC,sBAAsB,GAAG,aAAa,CAAC,uBAAuB,CAAC,CAAC,CAqL1E"}
|
|
@@ -0,0 +1,318 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Topic Connections Tool
|
|
3
|
+
*
|
|
4
|
+
* Build and explore knowledge graphs from discovered content.
|
|
5
|
+
* This is a SUPERPOWER - it reveals hidden connections between topics.
|
|
6
|
+
*
|
|
7
|
+
* With synthesize=true, uses LLM to explain the significance of connections.
|
|
8
|
+
*/
|
|
9
|
+
import { getLLMConfig, canSynthesize, synthesize, SYNTHESIS_PROMPTS } from "../llm.js";
|
|
10
|
+
import { createTopicConnectionsCompact } from "../output-manager.js";
|
|
11
|
+
export const topicConnectionsTool = {
|
|
12
|
+
name: "topic_connections",
|
|
13
|
+
description: `Discover connections between topics in your content.
|
|
14
|
+
|
|
15
|
+
With synthesize=true (recommended), uses AI to explain the significance of connections.
|
|
16
|
+
|
|
17
|
+
Returns:
|
|
18
|
+
- Topic co-occurrence graph
|
|
19
|
+
- Strongest topic relationships
|
|
20
|
+
- Central/hub topics
|
|
21
|
+
- Path finding between topics
|
|
22
|
+
- AI insights about connections (when enabled)
|
|
23
|
+
|
|
24
|
+
Use this to understand how your interests connect.`,
|
|
25
|
+
inputSchema: {
|
|
26
|
+
type: "object",
|
|
27
|
+
properties: {
|
|
28
|
+
topics: {
|
|
29
|
+
type: "array",
|
|
30
|
+
items: { type: "string" },
|
|
31
|
+
description: "Specific topics to analyze (optional, auto-detect if not specified)",
|
|
32
|
+
},
|
|
33
|
+
find_path: {
|
|
34
|
+
type: "object",
|
|
35
|
+
properties: {
|
|
36
|
+
from: { type: "string" },
|
|
37
|
+
to: { type: "string" },
|
|
38
|
+
},
|
|
39
|
+
description: "Find connection path between two topics",
|
|
40
|
+
},
|
|
41
|
+
days: {
|
|
42
|
+
type: "number",
|
|
43
|
+
description: "Days of content to analyze (default: 30)",
|
|
44
|
+
},
|
|
45
|
+
synthesize: {
|
|
46
|
+
type: "boolean",
|
|
47
|
+
description: "Use AI to explain connection significance (default: true if LLM configured)",
|
|
48
|
+
},
|
|
49
|
+
compact: {
|
|
50
|
+
type: "boolean",
|
|
51
|
+
description: "Return compact result with file reference (default: true for ~80% token reduction)",
|
|
52
|
+
},
|
|
53
|
+
},
|
|
54
|
+
},
|
|
55
|
+
};
|
|
56
|
+
export async function executeTopicConnections(db, params) {
|
|
57
|
+
const { topics: customTopics, find_path, days = 30 } = params;
|
|
58
|
+
const useCompact = params.compact !== false; // Default to compact=true
|
|
59
|
+
const dbInstance = db.db;
|
|
60
|
+
// Check LLM availability
|
|
61
|
+
const llmConfig = getLLMConfig(dbInstance);
|
|
62
|
+
const shouldSynthesize = params.synthesize ?? canSynthesize(llmConfig);
|
|
63
|
+
// Default topics to analyze
|
|
64
|
+
const topics = customTopics || [
|
|
65
|
+
"rust", "typescript", "python", "go", "javascript",
|
|
66
|
+
"ai", "llm", "embedding", "database", "sql", "sqlite",
|
|
67
|
+
"react", "async", "wasm", "security", "api", "performance"
|
|
68
|
+
];
|
|
69
|
+
// Get items for analysis
|
|
70
|
+
const items = db.getRelevantContent(0, undefined, 500, days * 24);
|
|
71
|
+
// Build nodes
|
|
72
|
+
const nodes = [];
|
|
73
|
+
const topicItems = new Map();
|
|
74
|
+
for (const topic of topics) {
|
|
75
|
+
const matching = items.filter(i => {
|
|
76
|
+
const text = (i.title + " " + i.content).toLowerCase();
|
|
77
|
+
return text.includes(topic.toLowerCase());
|
|
78
|
+
});
|
|
79
|
+
if (matching.length > 0) {
|
|
80
|
+
topicItems.set(topic, matching);
|
|
81
|
+
const avgRelevance = matching.reduce((sum, i) => sum + i.relevance_score, 0) / matching.length;
|
|
82
|
+
nodes.push({
|
|
83
|
+
topic,
|
|
84
|
+
mention_count: matching.length,
|
|
85
|
+
avg_relevance: Math.round(avgRelevance * 100) / 100,
|
|
86
|
+
centrality: 0, // Calculated later
|
|
87
|
+
connections: 0, // Calculated later
|
|
88
|
+
});
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
// Build edges (co-occurrence)
|
|
92
|
+
const edges = [];
|
|
93
|
+
const nodeTopics = nodes.map(n => n.topic);
|
|
94
|
+
for (let i = 0; i < nodeTopics.length; i++) {
|
|
95
|
+
for (let j = i + 1; j < nodeTopics.length; j++) {
|
|
96
|
+
const topicA = nodeTopics[i];
|
|
97
|
+
const topicB = nodeTopics[j];
|
|
98
|
+
// Count co-occurrences
|
|
99
|
+
const coOccur = items.filter(item => {
|
|
100
|
+
const text = (item.title + " " + item.content).toLowerCase();
|
|
101
|
+
return text.includes(topicA.toLowerCase()) && text.includes(topicB.toLowerCase());
|
|
102
|
+
}).length;
|
|
103
|
+
if (coOccur > 0) {
|
|
104
|
+
edges.push({
|
|
105
|
+
from: topicA,
|
|
106
|
+
to: topicB,
|
|
107
|
+
co_occurrences: coOccur,
|
|
108
|
+
strength: coOccur >= 10 ? "strong" : coOccur >= 3 ? "medium" : "weak",
|
|
109
|
+
});
|
|
110
|
+
// Update connection counts
|
|
111
|
+
const nodeA = nodes.find(n => n.topic === topicA);
|
|
112
|
+
const nodeB = nodes.find(n => n.topic === topicB);
|
|
113
|
+
if (nodeA)
|
|
114
|
+
nodeA.connections++;
|
|
115
|
+
if (nodeB)
|
|
116
|
+
nodeB.connections++;
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
// Calculate centrality (simplified: connection count weighted by strength)
|
|
121
|
+
const maxConnections = Math.max(...nodes.map(n => n.connections), 1);
|
|
122
|
+
for (const node of nodes) {
|
|
123
|
+
node.centrality = Math.round((node.connections / maxConnections) * 100) / 100;
|
|
124
|
+
}
|
|
125
|
+
// Find path if requested
|
|
126
|
+
let path;
|
|
127
|
+
if (find_path) {
|
|
128
|
+
path = findTopicPath(find_path.from, find_path.to, edges, items);
|
|
129
|
+
}
|
|
130
|
+
// Identify clusters
|
|
131
|
+
const clusters = identifyClusters(nodes, edges);
|
|
132
|
+
// Central and isolated topics
|
|
133
|
+
const centralTopics = nodes
|
|
134
|
+
.filter(n => n.centrality >= 0.5)
|
|
135
|
+
.sort((a, b) => b.centrality - a.centrality)
|
|
136
|
+
.slice(0, 5)
|
|
137
|
+
.map(n => n.topic);
|
|
138
|
+
const isolatedTopics = nodes
|
|
139
|
+
.filter(n => n.connections === 0)
|
|
140
|
+
.map(n => n.topic);
|
|
141
|
+
// Generate insights
|
|
142
|
+
const insights = generateGraphInsights(nodes, edges, clusters);
|
|
143
|
+
const result = {
|
|
144
|
+
analysis_period: {
|
|
145
|
+
days,
|
|
146
|
+
items_analyzed: items.length,
|
|
147
|
+
},
|
|
148
|
+
nodes: nodes.sort((a, b) => b.mention_count - a.mention_count),
|
|
149
|
+
edges: edges.sort((a, b) => b.co_occurrences - a.co_occurrences),
|
|
150
|
+
path,
|
|
151
|
+
clusters,
|
|
152
|
+
central_topics: centralTopics,
|
|
153
|
+
isolated_topics: isolatedTopics,
|
|
154
|
+
insights,
|
|
155
|
+
};
|
|
156
|
+
// AI Graph Insights - the actual superpower
|
|
157
|
+
if (shouldSynthesize && canSynthesize(llmConfig)) {
|
|
158
|
+
try {
|
|
159
|
+
const context = db.getUserContext(true, true);
|
|
160
|
+
const graphData = {
|
|
161
|
+
nodes: result.nodes.slice(0, 15),
|
|
162
|
+
edges: result.edges.slice(0, 20),
|
|
163
|
+
clusters: result.clusters,
|
|
164
|
+
central_topics: result.central_topics,
|
|
165
|
+
isolated_topics: result.isolated_topics,
|
|
166
|
+
path: result.path,
|
|
167
|
+
};
|
|
168
|
+
const contextData = {
|
|
169
|
+
interests: context.interests.slice(0, 10),
|
|
170
|
+
tech_stack: context.tech_stack,
|
|
171
|
+
role: context.role,
|
|
172
|
+
};
|
|
173
|
+
const synthesis = await synthesize(llmConfig, {
|
|
174
|
+
system: SYNTHESIS_PROMPTS.topicConnections.system,
|
|
175
|
+
prompt: SYNTHESIS_PROMPTS.topicConnections.buildPrompt(graphData, contextData),
|
|
176
|
+
max_tokens: 400,
|
|
177
|
+
complexity: SYNTHESIS_PROMPTS.topicConnections.complexity,
|
|
178
|
+
});
|
|
179
|
+
// Parse the synthesis
|
|
180
|
+
const lines = synthesis.synthesis.split("\n").filter(l => l.trim());
|
|
181
|
+
const surprisingConnection = lines.find(l => l.toLowerCase().includes("surprising") ||
|
|
182
|
+
l.toLowerCase().includes("interesting") ||
|
|
183
|
+
l.toLowerCase().includes("unexpected")) || lines[0] || "";
|
|
184
|
+
const exploration = lines.find(l => l.toLowerCase().includes("explore") ||
|
|
185
|
+
l.toLowerCase().includes("investigate") ||
|
|
186
|
+
l.toLowerCase().includes("look into")) || "";
|
|
187
|
+
const hiddenPattern = lines.find(l => l.toLowerCase().includes("pattern") ||
|
|
188
|
+
l.toLowerCase().includes("reveals") ||
|
|
189
|
+
l.toLowerCase().includes("suggests")) || "";
|
|
190
|
+
result.ai_insights = {
|
|
191
|
+
graph_narrative: synthesis.synthesis,
|
|
192
|
+
surprising_connection: surprisingConnection,
|
|
193
|
+
exploration_suggestion: exploration || "Explore connections between central topics",
|
|
194
|
+
hidden_pattern: hiddenPattern || "No hidden patterns detected",
|
|
195
|
+
model_used: synthesis.model_used,
|
|
196
|
+
};
|
|
197
|
+
}
|
|
198
|
+
catch (error) {
|
|
199
|
+
console.error("AI graph insights failed:", error);
|
|
200
|
+
}
|
|
201
|
+
}
|
|
202
|
+
// Return compact or full result based on parameter
|
|
203
|
+
if (useCompact) {
|
|
204
|
+
return createTopicConnectionsCompact(result);
|
|
205
|
+
}
|
|
206
|
+
return result;
|
|
207
|
+
}
|
|
208
|
+
function findTopicPath(from, to, edges, items) {
|
|
209
|
+
// Direct connection
|
|
210
|
+
const directEdge = edges.find(e => (e.from === from && e.to === to) || (e.from === to && e.to === from));
|
|
211
|
+
if (directEdge) {
|
|
212
|
+
// Get connecting items
|
|
213
|
+
const connectingItems = items
|
|
214
|
+
.filter(i => {
|
|
215
|
+
const text = (i.title + " " + i.content).toLowerCase();
|
|
216
|
+
return text.includes(from.toLowerCase()) && text.includes(to.toLowerCase());
|
|
217
|
+
})
|
|
218
|
+
.slice(0, 3)
|
|
219
|
+
.map(i => ({ title: i.title, score: i.relevance_score }));
|
|
220
|
+
return {
|
|
221
|
+
from,
|
|
222
|
+
to,
|
|
223
|
+
path: [from, to],
|
|
224
|
+
direct_connection: true,
|
|
225
|
+
connecting_items: connectingItems,
|
|
226
|
+
};
|
|
227
|
+
}
|
|
228
|
+
// Two-hop path (simplified BFS)
|
|
229
|
+
for (const edge of edges) {
|
|
230
|
+
const intermediate = edge.from === from ? edge.to :
|
|
231
|
+
edge.to === from ? edge.from : null;
|
|
232
|
+
if (intermediate) {
|
|
233
|
+
const secondEdge = edges.find(e => (e.from === intermediate && e.to === to) ||
|
|
234
|
+
(e.to === intermediate && e.from === to));
|
|
235
|
+
if (secondEdge) {
|
|
236
|
+
const connectingItems = items
|
|
237
|
+
.filter(i => {
|
|
238
|
+
const text = (i.title + " " + i.content).toLowerCase();
|
|
239
|
+
return text.includes(intermediate.toLowerCase());
|
|
240
|
+
})
|
|
241
|
+
.slice(0, 3)
|
|
242
|
+
.map(i => ({ title: i.title, score: i.relevance_score }));
|
|
243
|
+
return {
|
|
244
|
+
from,
|
|
245
|
+
to,
|
|
246
|
+
path: [from, intermediate, to],
|
|
247
|
+
direct_connection: false,
|
|
248
|
+
connecting_items: connectingItems,
|
|
249
|
+
};
|
|
250
|
+
}
|
|
251
|
+
}
|
|
252
|
+
}
|
|
253
|
+
// No path found
|
|
254
|
+
return {
|
|
255
|
+
from,
|
|
256
|
+
to,
|
|
257
|
+
path: [],
|
|
258
|
+
direct_connection: false,
|
|
259
|
+
connecting_items: [],
|
|
260
|
+
};
|
|
261
|
+
}
|
|
262
|
+
function identifyClusters(nodes, edges) {
|
|
263
|
+
// Predefined cluster patterns
|
|
264
|
+
const clusterPatterns = [
|
|
265
|
+
{ name: "Systems Programming", keywords: ["rust", "go", "async", "wasm", "performance"] },
|
|
266
|
+
{ name: "AI & ML", keywords: ["ai", "llm", "embedding", "python", "ml"] },
|
|
267
|
+
{ name: "Web Development", keywords: ["typescript", "javascript", "react", "frontend", "api"] },
|
|
268
|
+
{ name: "Data & Storage", keywords: ["database", "sql", "sqlite", "redis", "postgres"] },
|
|
269
|
+
];
|
|
270
|
+
const clusters = [];
|
|
271
|
+
for (const pattern of clusterPatterns) {
|
|
272
|
+
const matchingNodes = nodes.filter(n => pattern.keywords.includes(n.topic.toLowerCase()));
|
|
273
|
+
if (matchingNodes.length >= 2) {
|
|
274
|
+
// Calculate internal edge count for coherence
|
|
275
|
+
let internalEdges = 0;
|
|
276
|
+
const topics = matchingNodes.map(n => n.topic);
|
|
277
|
+
for (const edge of edges) {
|
|
278
|
+
if (topics.includes(edge.from) && topics.includes(edge.to)) {
|
|
279
|
+
internalEdges++;
|
|
280
|
+
}
|
|
281
|
+
}
|
|
282
|
+
const maxEdges = (topics.length * (topics.length - 1)) / 2;
|
|
283
|
+
const coherence = maxEdges > 0 ? internalEdges / maxEdges : 0;
|
|
284
|
+
clusters.push({
|
|
285
|
+
name: pattern.name,
|
|
286
|
+
topics: matchingNodes.map(n => n.topic),
|
|
287
|
+
item_count: matchingNodes.reduce((sum, n) => sum + n.mention_count, 0),
|
|
288
|
+
coherence: Math.round(coherence * 100) / 100,
|
|
289
|
+
});
|
|
290
|
+
}
|
|
291
|
+
}
|
|
292
|
+
return clusters.sort((a, b) => b.item_count - a.item_count);
|
|
293
|
+
}
|
|
294
|
+
function generateGraphInsights(nodes, edges, clusters) {
|
|
295
|
+
const insights = [];
|
|
296
|
+
// Most central topic
|
|
297
|
+
const mostCentral = nodes.sort((a, b) => b.centrality - a.centrality)[0];
|
|
298
|
+
if (mostCentral) {
|
|
299
|
+
insights.push(`"${mostCentral.topic}" is your most connected topic (${mostCentral.connections} connections)`);
|
|
300
|
+
}
|
|
301
|
+
// Strongest connection
|
|
302
|
+
const strongestEdge = edges[0];
|
|
303
|
+
if (strongestEdge) {
|
|
304
|
+
insights.push(`Strongest connection: "${strongestEdge.from}" ↔ "${strongestEdge.to}" (${strongestEdge.co_occurrences} co-occurrences)`);
|
|
305
|
+
}
|
|
306
|
+
// Isolated topics
|
|
307
|
+
const isolated = nodes.filter(n => n.connections === 0);
|
|
308
|
+
if (isolated.length > 0) {
|
|
309
|
+
insights.push(`${isolated.length} isolated topic(s): ${isolated.map(n => n.topic).join(", ")} - consider exploring connections`);
|
|
310
|
+
}
|
|
311
|
+
// Cluster insight
|
|
312
|
+
const topCluster = clusters[0];
|
|
313
|
+
if (topCluster) {
|
|
314
|
+
insights.push(`"${topCluster.name}" is your strongest cluster with ${topCluster.topics.length} related topics`);
|
|
315
|
+
}
|
|
316
|
+
return insights;
|
|
317
|
+
}
|
|
318
|
+
//# sourceMappingURL=topic-connections.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"topic-connections.js","sourceRoot":"","sources":["../../src/tools/topic-connections.ts"],"names":[],"mappings":"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"}
|