@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
@@ -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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"}