@4da/mcp-server 4.5.0 → 4.6.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 +61 -81
- package/dist/db.d.ts +12 -1
- package/dist/db.d.ts.map +1 -1
- package/dist/db.js +71 -8
- package/dist/db.js.map +1 -1
- package/dist/index.d.ts +9 -14
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +12 -17
- package/dist/index.js.map +1 -1
- package/dist/schema-registry.d.ts +4 -2
- package/dist/schema-registry.d.ts.map +1 -1
- package/dist/schema-registry.js +55 -235
- package/dist/schema-registry.js.map +1 -1
- package/dist/tool-dispatch.d.ts +1 -7
- package/dist/tool-dispatch.d.ts.map +1 -1
- package/dist/tool-dispatch.js +14 -48
- package/dist/tool-dispatch.js.map +1 -1
- package/dist/tools/index.d.ts +13 -42
- package/dist/tools/index.d.ts.map +1 -1
- package/dist/tools/index.js +18 -54
- package/dist/tools/index.js.map +1 -1
- package/dist/tools/what-should-i-know.d.ts +4 -12
- package/dist/tools/what-should-i-know.d.ts.map +1 -1
- package/dist/tools/what-should-i-know.js +11 -102
- package/dist/tools/what-should-i-know.js.map +1 -1
- package/package.json +2 -2
- package/dist/schemas/agent-feedback-stats.json +0 -14
- package/dist/schemas/agent-session-brief.json +0 -25
- package/dist/schemas/attention-report.json +0 -13
- package/dist/schemas/autophagy-status.json +0 -13
- package/dist/schemas/compound-advantage.json +0 -14
- package/dist/schemas/config-validator.json +0 -18
- package/dist/schemas/context-analysis.json +0 -25
- package/dist/schemas/daily-briefing.json +0 -34
- package/dist/schemas/decision-windows.json +0 -22
- package/dist/schemas/delegation-score.json +0 -18
- package/dist/schemas/explain-relevance.json +0 -19
- package/dist/schemas/export-context.json +0 -17
- package/dist/schemas/llm-status.json +0 -13
- package/dist/schemas/preemption-feed.json +0 -18
- package/dist/schemas/project-health.json +0 -13
- package/dist/schemas/record-agent-feedback.json +0 -28
- package/dist/schemas/reverse-mentions.json +0 -13
- package/dist/schemas/score-autopsy.json +0 -30
- package/dist/schemas/semantic-shifts.json +0 -17
- package/dist/schemas/signal-chains.json +0 -19
- package/dist/schemas/source-health.json +0 -17
- package/dist/schemas/tech-radar.json +0 -23
- package/dist/schemas/topic-connections.json +0 -34
- package/dist/schemas/trend-analysis.json +0 -29
- package/dist/schemas/trust-summary.json +0 -13
- package/dist/tools/agent-feedback-stats.d.ts +0 -30
- package/dist/tools/agent-feedback-stats.d.ts.map +0 -1
- package/dist/tools/agent-feedback-stats.js +0 -41
- package/dist/tools/agent-feedback-stats.js.map +0 -1
- package/dist/tools/agent-session-brief.d.ts +0 -44
- package/dist/tools/agent-session-brief.d.ts.map +0 -1
- package/dist/tools/agent-session-brief.js +0 -179
- package/dist/tools/agent-session-brief.js.map +0 -1
- package/dist/tools/attention-report.d.ts +0 -40
- package/dist/tools/attention-report.d.ts.map +0 -1
- package/dist/tools/attention-report.js +0 -73
- package/dist/tools/attention-report.js.map +0 -1
- package/dist/tools/autophagy-status.d.ts +0 -25
- package/dist/tools/autophagy-status.d.ts.map +0 -1
- package/dist/tools/autophagy-status.js +0 -56
- package/dist/tools/autophagy-status.js.map +0 -1
- package/dist/tools/compound-advantage.d.ts +0 -30
- package/dist/tools/compound-advantage.d.ts.map +0 -1
- package/dist/tools/compound-advantage.js +0 -133
- package/dist/tools/compound-advantage.js.map +0 -1
- package/dist/tools/config-validator.d.ts +0 -59
- package/dist/tools/config-validator.d.ts.map +0 -1
- package/dist/tools/config-validator.js +0 -417
- package/dist/tools/config-validator.js.map +0 -1
- package/dist/tools/context-analysis.d.ts +0 -108
- package/dist/tools/context-analysis.d.ts.map +0 -1
- package/dist/tools/context-analysis.js +0 -301
- package/dist/tools/context-analysis.js.map +0 -1
- package/dist/tools/daily-briefing.d.ts +0 -103
- package/dist/tools/daily-briefing.d.ts.map +0 -1
- package/dist/tools/daily-briefing.js +0 -294
- package/dist/tools/daily-briefing.js.map +0 -1
- package/dist/tools/decision-windows.d.ts +0 -37
- package/dist/tools/decision-windows.d.ts.map +0 -1
- package/dist/tools/decision-windows.js +0 -67
- package/dist/tools/decision-windows.js.map +0 -1
- package/dist/tools/delegation-score.d.ts +0 -34
- package/dist/tools/delegation-score.d.ts.map +0 -1
- package/dist/tools/delegation-score.js +0 -260
- package/dist/tools/delegation-score.js.map +0 -1
- package/dist/tools/explain-relevance.d.ts +0 -36
- package/dist/tools/explain-relevance.d.ts.map +0 -1
- package/dist/tools/explain-relevance.js +0 -51
- package/dist/tools/explain-relevance.js.map +0 -1
- package/dist/tools/export-context.d.ts +0 -60
- package/dist/tools/export-context.d.ts.map +0 -1
- package/dist/tools/export-context.js +0 -179
- package/dist/tools/export-context.js.map +0 -1
- package/dist/tools/llm-status.d.ts +0 -45
- package/dist/tools/llm-status.d.ts.map +0 -1
- package/dist/tools/llm-status.js +0 -93
- package/dist/tools/llm-status.js.map +0 -1
- package/dist/tools/muse-context.d.ts +0 -195
- package/dist/tools/muse-context.d.ts.map +0 -1
- package/dist/tools/muse-context.js +0 -284
- package/dist/tools/muse-context.js.map +0 -1
- package/dist/tools/preemption-feed.d.ts +0 -55
- package/dist/tools/preemption-feed.d.ts.map +0 -1
- package/dist/tools/preemption-feed.js +0 -124
- package/dist/tools/preemption-feed.js.map +0 -1
- package/dist/tools/project-health.d.ts +0 -53
- package/dist/tools/project-health.d.ts.map +0 -1
- package/dist/tools/project-health.js +0 -122
- package/dist/tools/project-health.js.map +0 -1
- package/dist/tools/record-agent-feedback.d.ts +0 -46
- package/dist/tools/record-agent-feedback.d.ts.map +0 -1
- package/dist/tools/record-agent-feedback.js +0 -71
- package/dist/tools/record-agent-feedback.js.map +0 -1
- package/dist/tools/reverse-mentions.d.ts +0 -38
- package/dist/tools/reverse-mentions.d.ts.map +0 -1
- package/dist/tools/reverse-mentions.js +0 -75
- package/dist/tools/reverse-mentions.js.map +0 -1
- package/dist/tools/score-autopsy.d.ts +0 -93
- package/dist/tools/score-autopsy.d.ts.map +0 -1
- package/dist/tools/score-autopsy.js +0 -295
- package/dist/tools/score-autopsy.js.map +0 -1
- package/dist/tools/semantic-shifts.d.ts +0 -53
- package/dist/tools/semantic-shifts.d.ts.map +0 -1
- package/dist/tools/semantic-shifts.js +0 -74
- package/dist/tools/semantic-shifts.js.map +0 -1
- package/dist/tools/signal-chains.d.ts +0 -52
- package/dist/tools/signal-chains.d.ts.map +0 -1
- package/dist/tools/signal-chains.js +0 -63
- package/dist/tools/signal-chains.js.map +0 -1
- package/dist/tools/source-health.d.ts +0 -64
- package/dist/tools/source-health.d.ts.map +0 -1
- package/dist/tools/source-health.js +0 -205
- package/dist/tools/source-health.js.map +0 -1
- package/dist/tools/tech-radar.d.ts +0 -38
- package/dist/tools/tech-radar.d.ts.map +0 -1
- package/dist/tools/tech-radar.js +0 -249
- package/dist/tools/tech-radar.js.map +0 -1
- package/dist/tools/topic-connections.d.ts +0 -112
- package/dist/tools/topic-connections.d.ts.map +0 -1
- package/dist/tools/topic-connections.js +0 -319
- package/dist/tools/topic-connections.js.map +0 -1
- package/dist/tools/trend-analysis.d.ts +0 -105
- package/dist/tools/trend-analysis.d.ts.map +0 -1
- package/dist/tools/trend-analysis.js +0 -296
- package/dist/tools/trend-analysis.js.map +0 -1
- package/dist/tools/trust-summary.d.ts +0 -38
- package/dist/tools/trust-summary.d.ts.map +0 -1
- package/dist/tools/trust-summary.js +0 -89
- package/dist/tools/trust-summary.js.map +0 -1
|
@@ -1,205 +0,0 @@
|
|
|
1
|
-
// SPDX-License-Identifier: FSL-1.1-Apache-2.0
|
|
2
|
-
/**
|
|
3
|
-
* Source Health Tool
|
|
4
|
-
*
|
|
5
|
-
* Diagnose source fetching, parsing, and data flow issues.
|
|
6
|
-
* This is a SUPERPOWER - it reveals pipeline problems before they become mysteries.
|
|
7
|
-
*/
|
|
8
|
-
export const sourceHealthTool = {
|
|
9
|
-
name: "source_health",
|
|
10
|
-
description: `Diagnose the health of 4DA's content sources.
|
|
11
|
-
Returns:
|
|
12
|
-
- Per-source status (healthy/degraded/failing)
|
|
13
|
-
- Recent fetch statistics
|
|
14
|
-
- Data quality metrics
|
|
15
|
-
- Error patterns detected
|
|
16
|
-
- Recommendations for fixes
|
|
17
|
-
|
|
18
|
-
Use this when content seems stale or sources aren't working.`,
|
|
19
|
-
inputSchema: {
|
|
20
|
-
type: "object",
|
|
21
|
-
properties: {
|
|
22
|
-
source: {
|
|
23
|
-
type: "string",
|
|
24
|
-
description: "Specific source to analyze (optional, all if not specified)",
|
|
25
|
-
},
|
|
26
|
-
hours: {
|
|
27
|
-
type: "number",
|
|
28
|
-
description: "Hours to analyze (default: 24)",
|
|
29
|
-
},
|
|
30
|
-
},
|
|
31
|
-
},
|
|
32
|
-
};
|
|
33
|
-
export function executeSourceHealth(db, params) {
|
|
34
|
-
const { source, hours = 24 } = params;
|
|
35
|
-
const dbInstance = db.db;
|
|
36
|
-
const endDate = new Date();
|
|
37
|
-
const startDate = new Date(endDate.getTime() - hours * 60 * 60 * 1000);
|
|
38
|
-
// Get all sources or specific one
|
|
39
|
-
let allSources = [];
|
|
40
|
-
try {
|
|
41
|
-
const sourcesStmt = dbInstance.prepare(`
|
|
42
|
-
SELECT DISTINCT source_type FROM source_items
|
|
43
|
-
`);
|
|
44
|
-
allSources = sourcesStmt.all().map(s => s.source_type);
|
|
45
|
-
}
|
|
46
|
-
catch {
|
|
47
|
-
// source_items table may not exist in standalone mode
|
|
48
|
-
}
|
|
49
|
-
if (allSources.length === 0 && !source) {
|
|
50
|
-
return {
|
|
51
|
-
analysis_period: {
|
|
52
|
-
start: startDate.toISOString(),
|
|
53
|
-
end: endDate.toISOString(),
|
|
54
|
-
hours,
|
|
55
|
-
},
|
|
56
|
-
overall_status: "healthy",
|
|
57
|
-
sources: [],
|
|
58
|
-
summary: {
|
|
59
|
-
total_sources: 0,
|
|
60
|
-
healthy: 0,
|
|
61
|
-
degraded: 0,
|
|
62
|
-
failing: 0,
|
|
63
|
-
total_items_24h: 0,
|
|
64
|
-
},
|
|
65
|
-
global_recommendations: [
|
|
66
|
-
"No content sources found. Install the 4DA desktop app to ingest content from Hacker News, GitHub, arXiv, and more.",
|
|
67
|
-
"Vulnerability scanning works independently — try the vulnerability_scan tool.",
|
|
68
|
-
],
|
|
69
|
-
};
|
|
70
|
-
}
|
|
71
|
-
const sourcesToAnalyze = source ? [source] : allSources;
|
|
72
|
-
const sourceStatuses = [];
|
|
73
|
-
for (const src of sourcesToAnalyze) {
|
|
74
|
-
const status = analyzeSource(dbInstance, src, hours);
|
|
75
|
-
sourceStatuses.push(status);
|
|
76
|
-
}
|
|
77
|
-
// Calculate summary
|
|
78
|
-
const healthy = sourceStatuses.filter(s => s.status === "healthy").length;
|
|
79
|
-
const degraded = sourceStatuses.filter(s => s.status === "degraded").length;
|
|
80
|
-
const failing = sourceStatuses.filter(s => s.status === "failing").length;
|
|
81
|
-
const totalItems24h = sourceStatuses.reduce((sum, s) => sum + s.items_24h, 0);
|
|
82
|
-
// Determine overall status
|
|
83
|
-
const overallStatus = failing > 0 ? "critical" :
|
|
84
|
-
degraded > 0 ? "degraded" : "healthy";
|
|
85
|
-
// Global recommendations
|
|
86
|
-
const globalRecs = [];
|
|
87
|
-
if (failing > 0) {
|
|
88
|
-
globalRecs.push(`${failing} source(s) failing - check network connectivity and API status`);
|
|
89
|
-
}
|
|
90
|
-
if (totalItems24h === 0) {
|
|
91
|
-
globalRecs.push("No items in last 24h - verify background jobs are running");
|
|
92
|
-
}
|
|
93
|
-
if (degraded > healthy) {
|
|
94
|
-
globalRecs.push("Most sources degraded - consider reviewing fetch intervals");
|
|
95
|
-
}
|
|
96
|
-
return {
|
|
97
|
-
analysis_period: {
|
|
98
|
-
start: startDate.toISOString(),
|
|
99
|
-
end: endDate.toISOString(),
|
|
100
|
-
hours,
|
|
101
|
-
},
|
|
102
|
-
overall_status: overallStatus,
|
|
103
|
-
sources: sourceStatuses,
|
|
104
|
-
summary: {
|
|
105
|
-
total_sources: sourceStatuses.length,
|
|
106
|
-
healthy,
|
|
107
|
-
degraded,
|
|
108
|
-
failing,
|
|
109
|
-
total_items_24h: totalItems24h,
|
|
110
|
-
},
|
|
111
|
-
global_recommendations: globalRecs,
|
|
112
|
-
};
|
|
113
|
-
}
|
|
114
|
-
function analyzeSource(db, source, hours) {
|
|
115
|
-
// Last item
|
|
116
|
-
const lastItemStmt = db.prepare(`
|
|
117
|
-
SELECT created_at FROM source_items
|
|
118
|
-
WHERE source_type = ?
|
|
119
|
-
ORDER BY created_at DESC
|
|
120
|
-
LIMIT 1
|
|
121
|
-
`);
|
|
122
|
-
const lastItem = lastItemStmt.get(source);
|
|
123
|
-
const lastItemAt = lastItem?.created_at || null;
|
|
124
|
-
const hoursSinceLast = lastItemAt
|
|
125
|
-
? (Date.now() - new Date(lastItemAt.replace(" ", "T") + "Z").getTime()) / (1000 * 60 * 60)
|
|
126
|
-
: null;
|
|
127
|
-
// Items in last 24h
|
|
128
|
-
const items24hStmt = db.prepare(`
|
|
129
|
-
SELECT COUNT(*) as count FROM source_items
|
|
130
|
-
WHERE source_type = ?
|
|
131
|
-
AND datetime(created_at) >= datetime('now', '-24 hours')
|
|
132
|
-
`);
|
|
133
|
-
const items24h = items24hStmt.get(source)?.count || 0;
|
|
134
|
-
// Items in last 7d
|
|
135
|
-
const items7dStmt = db.prepare(`
|
|
136
|
-
SELECT COUNT(*) as count FROM source_items
|
|
137
|
-
WHERE source_type = ?
|
|
138
|
-
AND datetime(created_at) >= datetime('now', '-7 days')
|
|
139
|
-
`);
|
|
140
|
-
const items7d = items7dStmt.get(source)?.count || 0;
|
|
141
|
-
// Quality metrics
|
|
142
|
-
const qualityStmt = db.prepare(`
|
|
143
|
-
SELECT
|
|
144
|
-
AVG(CASE WHEN url IS NOT NULL AND url != '' THEN 1.0 ELSE 0.0 END) as has_url_rate,
|
|
145
|
-
AVG(CASE WHEN content IS NOT NULL AND content != '' THEN 1.0 ELSE 0.0 END) as has_content_rate,
|
|
146
|
-
AVG(LENGTH(COALESCE(content, ''))) as avg_content_length
|
|
147
|
-
FROM source_items
|
|
148
|
-
WHERE source_type = ?
|
|
149
|
-
AND datetime(created_at) >= datetime('now', '-7 days')
|
|
150
|
-
`);
|
|
151
|
-
const quality = qualityStmt.get(source);
|
|
152
|
-
// Determine issues
|
|
153
|
-
const issues = [];
|
|
154
|
-
const recommendations = [];
|
|
155
|
-
// Check for staleness
|
|
156
|
-
if (hoursSinceLast !== null && hoursSinceLast > 24) {
|
|
157
|
-
issues.push(`No new items in ${Math.round(hoursSinceLast)} hours`);
|
|
158
|
-
recommendations.push("Check if source is enabled and API is accessible");
|
|
159
|
-
}
|
|
160
|
-
// Check for low volume
|
|
161
|
-
const avgPerDay = items7d / 7;
|
|
162
|
-
if (avgPerDay < 1 && items7d > 0) {
|
|
163
|
-
issues.push(`Very low volume: ${avgPerDay.toFixed(1)} items/day average`);
|
|
164
|
-
recommendations.push("Source may have fetch issues or very restrictive filters");
|
|
165
|
-
}
|
|
166
|
-
// Check quality
|
|
167
|
-
if (quality && quality.has_url_rate < 0.8) {
|
|
168
|
-
issues.push(`${Math.round((1 - quality.has_url_rate) * 100)}% of items missing URLs`);
|
|
169
|
-
}
|
|
170
|
-
if (quality && quality.has_content_rate < 0.5) {
|
|
171
|
-
issues.push(`${Math.round((1 - quality.has_content_rate) * 100)}% of items missing content`);
|
|
172
|
-
recommendations.push("Content extraction may be failing - check parser");
|
|
173
|
-
}
|
|
174
|
-
// Determine status
|
|
175
|
-
let status;
|
|
176
|
-
if (items7d === 0) {
|
|
177
|
-
status = "unknown";
|
|
178
|
-
}
|
|
179
|
-
else if (hoursSinceLast !== null && hoursSinceLast > 48) {
|
|
180
|
-
status = "failing";
|
|
181
|
-
}
|
|
182
|
-
else if (issues.length > 2 || (hoursSinceLast !== null && hoursSinceLast > 24)) {
|
|
183
|
-
status = "degraded";
|
|
184
|
-
}
|
|
185
|
-
else {
|
|
186
|
-
status = "healthy";
|
|
187
|
-
}
|
|
188
|
-
return {
|
|
189
|
-
source,
|
|
190
|
-
status,
|
|
191
|
-
last_item_at: lastItemAt,
|
|
192
|
-
hours_since_last: hoursSinceLast ? Math.round(hoursSinceLast * 10) / 10 : null,
|
|
193
|
-
items_24h: items24h,
|
|
194
|
-
items_7d: items7d,
|
|
195
|
-
avg_items_per_day: Math.round(avgPerDay * 10) / 10,
|
|
196
|
-
quality_metrics: {
|
|
197
|
-
has_url_rate: Math.round((quality?.has_url_rate || 0) * 100) / 100,
|
|
198
|
-
has_content_rate: Math.round((quality?.has_content_rate || 0) * 100) / 100,
|
|
199
|
-
avg_content_length: Math.round(quality?.avg_content_length || 0),
|
|
200
|
-
},
|
|
201
|
-
issues,
|
|
202
|
-
recommendations,
|
|
203
|
-
};
|
|
204
|
-
}
|
|
205
|
-
//# sourceMappingURL=source-health.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"source-health.js","sourceRoot":"","sources":["../../src/tools/source-health.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,38 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* tech_radar tool
|
|
3
|
-
*
|
|
4
|
-
* Query the user's personal technology radar. Synthesizes data from
|
|
5
|
-
* tech stack, detected technologies, dependencies, decisions, and engagement.
|
|
6
|
-
* Mirrors the Rust tech_radar.rs module using the same tables.
|
|
7
|
-
*/
|
|
8
|
-
import type { FourDADatabase } from "../db.js";
|
|
9
|
-
export interface TechRadarParams {
|
|
10
|
-
quadrant?: "languages" | "frameworks" | "tools" | "platforms";
|
|
11
|
-
ring?: "adopt" | "trial" | "assess" | "hold";
|
|
12
|
-
search?: string;
|
|
13
|
-
}
|
|
14
|
-
export declare const techRadarTool: {
|
|
15
|
-
name: string;
|
|
16
|
-
description: string;
|
|
17
|
-
inputSchema: {
|
|
18
|
-
type: "object";
|
|
19
|
-
properties: {
|
|
20
|
-
quadrant: {
|
|
21
|
-
type: string;
|
|
22
|
-
enum: string[];
|
|
23
|
-
description: string;
|
|
24
|
-
};
|
|
25
|
-
ring: {
|
|
26
|
-
type: string;
|
|
27
|
-
enum: string[];
|
|
28
|
-
description: string;
|
|
29
|
-
};
|
|
30
|
-
search: {
|
|
31
|
-
type: string;
|
|
32
|
-
description: string;
|
|
33
|
-
};
|
|
34
|
-
};
|
|
35
|
-
};
|
|
36
|
-
};
|
|
37
|
-
export declare function executeTechRadar(db: FourDADatabase, params: TechRadarParams): object;
|
|
38
|
-
//# sourceMappingURL=tech-radar.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"tech-radar.d.ts","sourceRoot":"","sources":["../../src/tools/tech-radar.ts"],"names":[],"mappings":"AACA;;;;;;GAMG;AAEH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,UAAU,CAAC;AAM/C,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,EAAE,WAAW,GAAG,YAAY,GAAG,OAAO,GAAG,WAAW,CAAC;IAC9D,IAAI,CAAC,EAAE,OAAO,GAAG,OAAO,GAAG,QAAQ,GAAG,MAAM,CAAC;IAC7C,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AA+DD,eAAO,MAAM,aAAa;;;;;;;;;;;;;;;;;;;;;;CAgCzB,CAAC;AAMF,wBAAgB,gBAAgB,CAC9B,EAAE,EAAE,cAAc,EAClB,MAAM,EAAE,eAAe,GACtB,MAAM,CA6JR"}
|
package/dist/tools/tech-radar.js
DELETED
|
@@ -1,249 +0,0 @@
|
|
|
1
|
-
// SPDX-License-Identifier: FSL-1.1-Apache-2.0
|
|
2
|
-
/**
|
|
3
|
-
* tech_radar tool
|
|
4
|
-
*
|
|
5
|
-
* Query the user's personal technology radar. Synthesizes data from
|
|
6
|
-
* tech stack, detected technologies, dependencies, decisions, and engagement.
|
|
7
|
-
* Mirrors the Rust tech_radar.rs module using the same tables.
|
|
8
|
-
*/
|
|
9
|
-
// ============================================================================
|
|
10
|
-
// Quadrant Classification
|
|
11
|
-
// ============================================================================
|
|
12
|
-
const LANGUAGES = new Set([
|
|
13
|
-
"rust", "typescript", "javascript", "python", "go", "java", "kotlin",
|
|
14
|
-
"swift", "c++", "c#", "ruby", "php", "scala", "elixir", "haskell",
|
|
15
|
-
"zig", "lua", "dart", "r", "julia",
|
|
16
|
-
]);
|
|
17
|
-
const FRAMEWORKS = new Set([
|
|
18
|
-
"react", "vue", "angular", "svelte", "nextjs", "next.js", "nuxt",
|
|
19
|
-
"remix", "astro", "tauri", "electron", "django", "flask", "fastapi",
|
|
20
|
-
"express", "fastify", "rails", "spring", "actix", "axum", "gin",
|
|
21
|
-
"flutter", "react-native", "sveltekit",
|
|
22
|
-
]);
|
|
23
|
-
const PLATFORMS = new Set([
|
|
24
|
-
"aws", "gcp", "azure", "vercel", "netlify", "cloudflare", "heroku",
|
|
25
|
-
"docker", "kubernetes", "k8s", "linux", "windows", "macos", "ios",
|
|
26
|
-
"android",
|
|
27
|
-
]);
|
|
28
|
-
function classifyQuadrant(name) {
|
|
29
|
-
const n = name.toLowerCase();
|
|
30
|
-
if (LANGUAGES.has(n))
|
|
31
|
-
return "languages";
|
|
32
|
-
if (FRAMEWORKS.has(n))
|
|
33
|
-
return "frameworks";
|
|
34
|
-
if (PLATFORMS.has(n))
|
|
35
|
-
return "platforms";
|
|
36
|
-
return "tools";
|
|
37
|
-
}
|
|
38
|
-
// ============================================================================
|
|
39
|
-
// Dependency Filtering
|
|
40
|
-
// ============================================================================
|
|
41
|
-
const SKIP_DEPS = new Set([
|
|
42
|
-
"proc-macro2", "quote", "unicode-ident", "cfg-if", "memchr", "libc",
|
|
43
|
-
"autocfg", "version_check", "pkg-config", "itoa", "ryu", "bitflags",
|
|
44
|
-
"bytes", "pin-project-lite", "fnv", "percent-encoding", "tinyvec",
|
|
45
|
-
"smallvec", "indexmap", "hashbrown", "equivalent", "either", "anyhow",
|
|
46
|
-
"thiserror",
|
|
47
|
-
]);
|
|
48
|
-
function isNotableDependency(name) {
|
|
49
|
-
if (name.length < 4)
|
|
50
|
-
return false;
|
|
51
|
-
return !SKIP_DEPS.has(name);
|
|
52
|
-
}
|
|
53
|
-
// ============================================================================
|
|
54
|
-
// Tool Definition
|
|
55
|
-
// ============================================================================
|
|
56
|
-
export const techRadarTool = {
|
|
57
|
-
name: "tech_radar",
|
|
58
|
-
description: `Query the user's personal technology radar. Synthesizes a ThoughtWorks-style radar from tech stack, dependencies, detected technologies, and developer decisions.
|
|
59
|
-
|
|
60
|
-
Each entry is placed in a ring:
|
|
61
|
-
- adopt: Primary tech stack — actively used daily
|
|
62
|
-
- trial: Notable dependencies — in use but not core identity
|
|
63
|
-
- assess: Auto-detected technologies — seen in projects but not yet committed
|
|
64
|
-
- hold: Rejected alternatives from developer decisions
|
|
65
|
-
|
|
66
|
-
Entries are classified into quadrants: languages, frameworks, tools, platforms.
|
|
67
|
-
|
|
68
|
-
Use filters to narrow results by quadrant, ring, or free-text search.`,
|
|
69
|
-
inputSchema: {
|
|
70
|
-
type: "object",
|
|
71
|
-
properties: {
|
|
72
|
-
quadrant: {
|
|
73
|
-
type: "string",
|
|
74
|
-
enum: ["languages", "frameworks", "tools", "platforms"],
|
|
75
|
-
description: "Filter by quadrant. Leave empty for all quadrants.",
|
|
76
|
-
},
|
|
77
|
-
ring: {
|
|
78
|
-
type: "string",
|
|
79
|
-
enum: ["adopt", "trial", "assess", "hold"],
|
|
80
|
-
description: "Filter by ring. Leave empty for all rings.",
|
|
81
|
-
},
|
|
82
|
-
search: {
|
|
83
|
-
type: "string",
|
|
84
|
-
description: "Free-text search to filter entries by name.",
|
|
85
|
-
},
|
|
86
|
-
},
|
|
87
|
-
},
|
|
88
|
-
};
|
|
89
|
-
// ============================================================================
|
|
90
|
-
// Execute
|
|
91
|
-
// ============================================================================
|
|
92
|
-
export function executeTechRadar(db, params) {
|
|
93
|
-
const rawDb = db.getRawDb();
|
|
94
|
-
const entries = [];
|
|
95
|
-
const seen = new Set();
|
|
96
|
-
// 1. Primary tech stack -> ring: "adopt"
|
|
97
|
-
try {
|
|
98
|
-
const rows = rawDb
|
|
99
|
-
.prepare("SELECT technology FROM tech_stack ORDER BY technology")
|
|
100
|
-
.all();
|
|
101
|
-
for (const row of rows) {
|
|
102
|
-
const name = row.technology.toLowerCase();
|
|
103
|
-
if (!seen.has(name)) {
|
|
104
|
-
seen.add(name);
|
|
105
|
-
entries.push({
|
|
106
|
-
name,
|
|
107
|
-
ring: "adopt",
|
|
108
|
-
quadrant: classifyQuadrant(name),
|
|
109
|
-
source: "primary_stack",
|
|
110
|
-
confidence: 1.0,
|
|
111
|
-
});
|
|
112
|
-
}
|
|
113
|
-
}
|
|
114
|
-
}
|
|
115
|
-
catch {
|
|
116
|
-
// Table may not exist
|
|
117
|
-
}
|
|
118
|
-
// 2. Project dependencies -> ring: "trial"
|
|
119
|
-
try {
|
|
120
|
-
const rows = rawDb
|
|
121
|
-
.prepare("SELECT DISTINCT package_name FROM project_dependencies ORDER BY package_name")
|
|
122
|
-
.all();
|
|
123
|
-
for (const row of rows) {
|
|
124
|
-
const name = row.package_name.toLowerCase();
|
|
125
|
-
if (!seen.has(name) && isNotableDependency(name)) {
|
|
126
|
-
seen.add(name);
|
|
127
|
-
entries.push({
|
|
128
|
-
name,
|
|
129
|
-
ring: "trial",
|
|
130
|
-
quadrant: classifyQuadrant(name),
|
|
131
|
-
source: "dependency",
|
|
132
|
-
confidence: 0.7,
|
|
133
|
-
});
|
|
134
|
-
}
|
|
135
|
-
}
|
|
136
|
-
}
|
|
137
|
-
catch {
|
|
138
|
-
// Table may not exist
|
|
139
|
-
}
|
|
140
|
-
// 3. Detected tech -> ring: "assess"
|
|
141
|
-
try {
|
|
142
|
-
const rows = rawDb
|
|
143
|
-
.prepare("SELECT name, confidence FROM detected_tech WHERE confidence > 0.3 ORDER BY confidence DESC")
|
|
144
|
-
.all();
|
|
145
|
-
for (const row of rows) {
|
|
146
|
-
const name = row.name.toLowerCase();
|
|
147
|
-
if (!seen.has(name)) {
|
|
148
|
-
seen.add(name);
|
|
149
|
-
entries.push({
|
|
150
|
-
name,
|
|
151
|
-
ring: "assess",
|
|
152
|
-
quadrant: classifyQuadrant(name),
|
|
153
|
-
source: "detected",
|
|
154
|
-
confidence: Math.round(row.confidence * 100) / 100,
|
|
155
|
-
});
|
|
156
|
-
}
|
|
157
|
-
}
|
|
158
|
-
}
|
|
159
|
-
catch {
|
|
160
|
-
// Table may not exist
|
|
161
|
-
}
|
|
162
|
-
// 4. Developer decisions — rejected alternatives -> ring: "hold"
|
|
163
|
-
try {
|
|
164
|
-
const rows = rawDb
|
|
165
|
-
.prepare(`SELECT id, decision_type, subject, alternatives_rejected, status
|
|
166
|
-
FROM developer_decisions
|
|
167
|
-
WHERE status IN ('active', 'superseded') AND decision_type = 'tech_choice'`)
|
|
168
|
-
.all();
|
|
169
|
-
for (const row of rows) {
|
|
170
|
-
let alts = [];
|
|
171
|
-
try {
|
|
172
|
-
alts = JSON.parse(row.alternatives_rejected);
|
|
173
|
-
}
|
|
174
|
-
catch {
|
|
175
|
-
// Malformed JSON, skip
|
|
176
|
-
}
|
|
177
|
-
for (const alt of alts) {
|
|
178
|
-
const name = alt.toLowerCase();
|
|
179
|
-
if (!seen.has(name)) {
|
|
180
|
-
seen.add(name);
|
|
181
|
-
entries.push({
|
|
182
|
-
name,
|
|
183
|
-
ring: "hold",
|
|
184
|
-
quadrant: classifyQuadrant(name),
|
|
185
|
-
source: "decision_hold",
|
|
186
|
-
decision_ref: row.id,
|
|
187
|
-
confidence: 0.8,
|
|
188
|
-
});
|
|
189
|
-
}
|
|
190
|
-
}
|
|
191
|
-
}
|
|
192
|
-
}
|
|
193
|
-
catch {
|
|
194
|
-
// Table may not exist
|
|
195
|
-
}
|
|
196
|
-
// 5. Apply optional filters
|
|
197
|
-
let filtered = entries;
|
|
198
|
-
if (params.quadrant) {
|
|
199
|
-
filtered = filtered.filter((e) => e.quadrant === params.quadrant);
|
|
200
|
-
}
|
|
201
|
-
if (params.ring) {
|
|
202
|
-
filtered = filtered.filter((e) => e.ring === params.ring);
|
|
203
|
-
}
|
|
204
|
-
if (params.search) {
|
|
205
|
-
const term = params.search.toLowerCase();
|
|
206
|
-
filtered = filtered.filter((e) => e.name.includes(term));
|
|
207
|
-
}
|
|
208
|
-
// Sort: adopt > trial > assess > hold, then alphabetically
|
|
209
|
-
const ringOrder = {
|
|
210
|
-
adopt: 0,
|
|
211
|
-
trial: 1,
|
|
212
|
-
assess: 2,
|
|
213
|
-
hold: 3,
|
|
214
|
-
};
|
|
215
|
-
filtered.sort((a, b) => {
|
|
216
|
-
const ringDiff = (ringOrder[a.ring] ?? 4) - (ringOrder[b.ring] ?? 4);
|
|
217
|
-
if (ringDiff !== 0)
|
|
218
|
-
return ringDiff;
|
|
219
|
-
return a.name.localeCompare(b.name);
|
|
220
|
-
});
|
|
221
|
-
return {
|
|
222
|
-
entries: filtered,
|
|
223
|
-
total: filtered.length,
|
|
224
|
-
generated_at: new Date().toISOString(),
|
|
225
|
-
summary: buildSummary(filtered),
|
|
226
|
-
};
|
|
227
|
-
}
|
|
228
|
-
// ============================================================================
|
|
229
|
-
// Helpers
|
|
230
|
-
// ============================================================================
|
|
231
|
-
function buildSummary(entries) {
|
|
232
|
-
const byRing = {};
|
|
233
|
-
for (const e of entries) {
|
|
234
|
-
byRing[e.ring] = (byRing[e.ring] || 0) + 1;
|
|
235
|
-
}
|
|
236
|
-
const parts = [];
|
|
237
|
-
if (byRing.adopt)
|
|
238
|
-
parts.push(`${byRing.adopt} adopt`);
|
|
239
|
-
if (byRing.trial)
|
|
240
|
-
parts.push(`${byRing.trial} trial`);
|
|
241
|
-
if (byRing.assess)
|
|
242
|
-
parts.push(`${byRing.assess} assess`);
|
|
243
|
-
if (byRing.hold)
|
|
244
|
-
parts.push(`${byRing.hold} hold`);
|
|
245
|
-
return parts.length > 0
|
|
246
|
-
? `${entries.length} technologies: ${parts.join(", ")}`
|
|
247
|
-
: "No technologies found in radar";
|
|
248
|
-
}
|
|
249
|
-
//# sourceMappingURL=tech-radar.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"tech-radar.js","sourceRoot":"","sources":["../../src/tools/tech-radar.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,112 +0,0 @@
|
|
|
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
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"topic-connections.d.ts","sourceRoot":"","sources":["../../src/tools/topic-connections.ts"],"names":[],"mappings":"AACA;;;;;;;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"}
|