@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,34 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "topic_connections",
|
|
3
|
+
"description": "Discover connections between topics in your content.\n\nWith synthesize=true (recommended), uses AI to explain the significance of connections.\n\nReturns:\n- Topic co-occurrence graph\n- Strongest topic relationships\n- Central/hub topics\n- Path finding between topics\n- AI insights about connections (when enabled)\n\nUse this to understand how your interests connect.",
|
|
4
|
+
"inputSchema": {
|
|
5
|
+
"type": "object",
|
|
6
|
+
"properties": {
|
|
7
|
+
"topics": {
|
|
8
|
+
"type": "array",
|
|
9
|
+
"items": { "type": "string" },
|
|
10
|
+
"description": "Specific topics to analyze (optional, auto-detect if not specified)"
|
|
11
|
+
},
|
|
12
|
+
"find_path": {
|
|
13
|
+
"type": "object",
|
|
14
|
+
"properties": {
|
|
15
|
+
"from": { "type": "string" },
|
|
16
|
+
"to": { "type": "string" }
|
|
17
|
+
},
|
|
18
|
+
"description": "Find connection path between two topics"
|
|
19
|
+
},
|
|
20
|
+
"days": {
|
|
21
|
+
"type": "number",
|
|
22
|
+
"description": "Days of content to analyze (default: 30)"
|
|
23
|
+
},
|
|
24
|
+
"synthesize": {
|
|
25
|
+
"type": "boolean",
|
|
26
|
+
"description": "Use AI to explain connection significance (default: true if LLM configured)"
|
|
27
|
+
},
|
|
28
|
+
"compact": {
|
|
29
|
+
"type": "boolean",
|
|
30
|
+
"description": "Return compact result with file reference (default: true for ~80% token reduction)"
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "trend_analysis",
|
|
3
|
+
"description": "Analyze patterns and trends in 4DA's content over time.\n\nWith synthesize=true (recommended), uses AI to interpret trends and predict what matters.\n\nReturns:\n- Topic frequency trends (rising/falling)\n- Volume anomalies detected\n- Week-over-week comparisons\n- Source performance trends\n- AI predictions (when enabled)\n\nUse this to understand what's changing in your information landscape.",
|
|
4
|
+
"inputSchema": {
|
|
5
|
+
"type": "object",
|
|
6
|
+
"properties": {
|
|
7
|
+
"days": {
|
|
8
|
+
"type": "number",
|
|
9
|
+
"description": "Analysis period in days (default: 30)"
|
|
10
|
+
},
|
|
11
|
+
"topic": {
|
|
12
|
+
"type": "string",
|
|
13
|
+
"description": "Specific topic to analyze (optional)"
|
|
14
|
+
},
|
|
15
|
+
"detect_anomalies": {
|
|
16
|
+
"type": "boolean",
|
|
17
|
+
"description": "Include anomaly detection (default: true)"
|
|
18
|
+
},
|
|
19
|
+
"synthesize": {
|
|
20
|
+
"type": "boolean",
|
|
21
|
+
"description": "Use AI to interpret trends and predict (default: true if LLM configured)"
|
|
22
|
+
},
|
|
23
|
+
"compact": {
|
|
24
|
+
"type": "boolean",
|
|
25
|
+
"description": "Return compact result with file reference (default: true for ~80% token reduction)"
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* attention_report tool
|
|
3
|
+
*
|
|
4
|
+
* Analyze where your attention goes vs. where your code needs it.
|
|
5
|
+
*/
|
|
6
|
+
import type { FourDADatabase } from "../db.js";
|
|
7
|
+
export interface AttentionReportParams {
|
|
8
|
+
period_days?: number;
|
|
9
|
+
}
|
|
10
|
+
export declare const attentionReportTool: {
|
|
11
|
+
name: string;
|
|
12
|
+
description: string;
|
|
13
|
+
inputSchema: {
|
|
14
|
+
type: "object";
|
|
15
|
+
properties: {
|
|
16
|
+
period_days: {
|
|
17
|
+
type: string;
|
|
18
|
+
description: string;
|
|
19
|
+
default: number;
|
|
20
|
+
};
|
|
21
|
+
};
|
|
22
|
+
};
|
|
23
|
+
};
|
|
24
|
+
export declare function executeAttentionReport(db: FourDADatabase, params: AttentionReportParams): {
|
|
25
|
+
period_days: number;
|
|
26
|
+
total_interactions: any;
|
|
27
|
+
engagement_by_source: any[];
|
|
28
|
+
topic_affinities: any[];
|
|
29
|
+
codebase_topics: any[];
|
|
30
|
+
blind_spots: {
|
|
31
|
+
topic: any;
|
|
32
|
+
in_codebase: boolean;
|
|
33
|
+
engagement_level: number;
|
|
34
|
+
risk_level: string;
|
|
35
|
+
gap_description: string;
|
|
36
|
+
}[];
|
|
37
|
+
summary: string;
|
|
38
|
+
};
|
|
39
|
+
//# sourceMappingURL=attention-report.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"attention-report.d.ts","sourceRoot":"","sources":["../../src/tools/attention-report.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,UAAU,CAAC;AAE/C,MAAM,WAAW,qBAAqB;IACpC,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,eAAO,MAAM,mBAAmB;;;;;;;;;;;;;CAa/B,CAAC;AAEF,wBAAgB,sBAAsB,CACpC,EAAE,EAAE,cAAc,EAClB,MAAM,EAAE,qBAAqB;;;;;;;;;;;;;;EAsE9B"}
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* attention_report tool
|
|
3
|
+
*
|
|
4
|
+
* Analyze where your attention goes vs. where your code needs it.
|
|
5
|
+
*/
|
|
6
|
+
export const attentionReportTool = {
|
|
7
|
+
name: "attention_report",
|
|
8
|
+
description: `Analyze your attention allocation - where you focus vs. where your codebase needs attention. Identifies blind spots and engagement patterns.`,
|
|
9
|
+
inputSchema: {
|
|
10
|
+
type: "object",
|
|
11
|
+
properties: {
|
|
12
|
+
period_days: {
|
|
13
|
+
type: "number",
|
|
14
|
+
description: "Analysis period in days. Default: 7",
|
|
15
|
+
default: 7,
|
|
16
|
+
},
|
|
17
|
+
},
|
|
18
|
+
},
|
|
19
|
+
};
|
|
20
|
+
export function executeAttentionReport(db, params) {
|
|
21
|
+
const rawDb = db.getRawDb();
|
|
22
|
+
const days = params.period_days || 7;
|
|
23
|
+
// Get engagement by topic from interactions + source items
|
|
24
|
+
const engagementRows = rawDb
|
|
25
|
+
.prepare(`SELECT si.source_type, COUNT(*) as interactions
|
|
26
|
+
FROM interactions i
|
|
27
|
+
JOIN source_items si ON i.source_item_id = si.id
|
|
28
|
+
WHERE i.timestamp >= datetime('now', '-' || ? || ' days')
|
|
29
|
+
GROUP BY si.source_type
|
|
30
|
+
ORDER BY interactions DESC`)
|
|
31
|
+
.all(days);
|
|
32
|
+
// Get topic affinities (learned attention)
|
|
33
|
+
const topicAffinities = rawDb
|
|
34
|
+
.prepare(`SELECT topic, positive_signals, negative_signals,
|
|
35
|
+
(positive_signals - negative_signals * 0.5) as attention_score
|
|
36
|
+
FROM topic_affinities
|
|
37
|
+
WHERE total_exposures > 0
|
|
38
|
+
ORDER BY attention_score DESC
|
|
39
|
+
LIMIT 15`)
|
|
40
|
+
.all();
|
|
41
|
+
// Get codebase topics from detected tech
|
|
42
|
+
const codebaseTopics = rawDb
|
|
43
|
+
.prepare(`SELECT name as topic, category, confidence
|
|
44
|
+
FROM detected_tech
|
|
45
|
+
ORDER BY confidence DESC
|
|
46
|
+
LIMIT 15`)
|
|
47
|
+
.all();
|
|
48
|
+
// Identify blind spots: in codebase but low engagement
|
|
49
|
+
const engagedTopics = new Set(topicAffinities
|
|
50
|
+
.filter((t) => t.attention_score > 0)
|
|
51
|
+
.map((t) => t.topic.toLowerCase()));
|
|
52
|
+
const blindSpots = codebaseTopics
|
|
53
|
+
.filter((ct) => !engagedTopics.has(ct.topic.toLowerCase()))
|
|
54
|
+
.map((ct) => ({
|
|
55
|
+
topic: ct.topic,
|
|
56
|
+
in_codebase: true,
|
|
57
|
+
engagement_level: 0,
|
|
58
|
+
risk_level: ct.confidence > 0.8 ? "high" : "medium",
|
|
59
|
+
gap_description: `${ct.topic} is in your codebase (${ct.category}) but has low engagement`,
|
|
60
|
+
}));
|
|
61
|
+
const totalInteractions = engagementRows.reduce((sum, r) => sum + r.interactions, 0);
|
|
62
|
+
return {
|
|
63
|
+
period_days: days,
|
|
64
|
+
total_interactions: totalInteractions,
|
|
65
|
+
engagement_by_source: engagementRows,
|
|
66
|
+
topic_affinities: topicAffinities.slice(0, 10),
|
|
67
|
+
codebase_topics: codebaseTopics,
|
|
68
|
+
blind_spots: blindSpots,
|
|
69
|
+
summary: `${totalInteractions} interactions over ${days} days, ${blindSpots.length} blind spot${blindSpots.length !== 1 ? "s" : ""} detected`,
|
|
70
|
+
};
|
|
71
|
+
}
|
|
72
|
+
//# sourceMappingURL=attention-report.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"attention-report.js","sourceRoot":"","sources":["../../src/tools/attention-report.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAQH,MAAM,CAAC,MAAM,mBAAmB,GAAG;IACjC,IAAI,EAAE,kBAAkB;IACxB,WAAW,EAAE,8IAA8I;IAC3J,WAAW,EAAE;QACX,IAAI,EAAE,QAAiB;QACvB,UAAU,EAAE;YACV,WAAW,EAAE;gBACX,IAAI,EAAE,QAAQ;gBACd,WAAW,EAAE,qCAAqC;gBAClD,OAAO,EAAE,CAAC;aACX;SACF;KACF;CACF,CAAC;AAEF,MAAM,UAAU,sBAAsB,CACpC,EAAkB,EAClB,MAA6B;IAE7B,MAAM,KAAK,GAAG,EAAE,CAAC,QAAQ,EAAE,CAAC;IAC5B,MAAM,IAAI,GAAG,MAAM,CAAC,WAAW,IAAI,CAAC,CAAC;IAErC,2DAA2D;IAC3D,MAAM,cAAc,GAAG,KAAK;SACzB,OAAO,CACN;;;;;kCAK4B,CAC7B;SACA,GAAG,CAAC,IAAI,CAAU,CAAC;IAEtB,2CAA2C;IAC3C,MAAM,eAAe,GAAG,KAAK;SAC1B,OAAO,CACN;;;;;gBAKU,CACX;SACA,GAAG,EAAW,CAAC;IAElB,yCAAyC;IACzC,MAAM,cAAc,GAAG,KAAK;SACzB,OAAO,CACN;;;gBAGU,CACX;SACA,GAAG,EAAW,CAAC;IAElB,uDAAuD;IACvD,MAAM,aAAa,GAAG,IAAI,GAAG,CAC3B,eAAe;SACZ,MAAM,CAAC,CAAC,CAAM,EAAE,EAAE,CAAC,CAAC,CAAC,eAAe,GAAG,CAAC,CAAC;SACzC,GAAG,CAAC,CAAC,CAAM,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,WAAW,EAAE,CAAC,CAC1C,CAAC;IAEF,MAAM,UAAU,GAAG,cAAc;SAC9B,MAAM,CAAC,CAAC,EAAO,EAAE,EAAE,CAAC,CAAC,aAAa,CAAC,GAAG,CAAC,EAAE,CAAC,KAAK,CAAC,WAAW,EAAE,CAAC,CAAC;SAC/D,GAAG,CAAC,CAAC,EAAO,EAAE,EAAE,CAAC,CAAC;QACjB,KAAK,EAAE,EAAE,CAAC,KAAK;QACf,WAAW,EAAE,IAAI;QACjB,gBAAgB,EAAE,CAAC;QACnB,UAAU,EAAE,EAAE,CAAC,UAAU,GAAG,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,QAAQ;QACnD,eAAe,EAAE,GAAG,EAAE,CAAC,KAAK,yBAAyB,EAAE,CAAC,QAAQ,0BAA0B;KAC3F,CAAC,CAAC,CAAC;IAEN,MAAM,iBAAiB,GAAG,cAAc,CAAC,MAAM,CAC7C,CAAC,GAAW,EAAE,CAAM,EAAE,EAAE,CAAC,GAAG,GAAG,CAAC,CAAC,YAAY,EAC7C,CAAC,CACF,CAAC;IAEF,OAAO;QACL,WAAW,EAAE,IAAI;QACjB,kBAAkB,EAAE,iBAAiB;QACrC,oBAAoB,EAAE,cAAc;QACpC,gBAAgB,EAAE,eAAe,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC;QAC9C,eAAe,EAAE,cAAc;QAC/B,WAAW,EAAE,UAAU;QACvB,OAAO,EAAE,GAAG,iBAAiB,sBAAsB,IAAI,UAAU,UAAU,CAAC,MAAM,cAAc,UAAU,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,WAAW;KAC9I,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Config Validator Tool
|
|
3
|
+
*
|
|
4
|
+
* Validate and diagnose 4DA configuration issues.
|
|
5
|
+
* This is a SUPERPOWER - it catches config errors before they cause problems.
|
|
6
|
+
*/
|
|
7
|
+
import type { FourDADatabase } from "../db.js";
|
|
8
|
+
export declare const configValidatorTool: {
|
|
9
|
+
name: string;
|
|
10
|
+
description: string;
|
|
11
|
+
inputSchema: {
|
|
12
|
+
type: string;
|
|
13
|
+
properties: {
|
|
14
|
+
section: {
|
|
15
|
+
type: string;
|
|
16
|
+
enum: string[];
|
|
17
|
+
description: string;
|
|
18
|
+
};
|
|
19
|
+
fix_suggestions: {
|
|
20
|
+
type: string;
|
|
21
|
+
description: string;
|
|
22
|
+
};
|
|
23
|
+
};
|
|
24
|
+
};
|
|
25
|
+
};
|
|
26
|
+
export interface ConfigValidatorParams {
|
|
27
|
+
section?: "all" | "sources" | "embedding" | "llm" | "ace" | "digest" | "ui";
|
|
28
|
+
fix_suggestions?: boolean;
|
|
29
|
+
}
|
|
30
|
+
interface ValidationIssue {
|
|
31
|
+
section: string;
|
|
32
|
+
field: string;
|
|
33
|
+
severity: "error" | "warning" | "info";
|
|
34
|
+
message: string;
|
|
35
|
+
current_value: unknown;
|
|
36
|
+
expected: string;
|
|
37
|
+
fix?: string;
|
|
38
|
+
}
|
|
39
|
+
interface SectionValidation {
|
|
40
|
+
section: string;
|
|
41
|
+
status: "valid" | "warnings" | "errors";
|
|
42
|
+
issue_count: number;
|
|
43
|
+
issues: ValidationIssue[];
|
|
44
|
+
}
|
|
45
|
+
interface ConfigValidationResult {
|
|
46
|
+
overall_status: "valid" | "warnings" | "errors";
|
|
47
|
+
sections: SectionValidation[];
|
|
48
|
+
summary: {
|
|
49
|
+
total_issues: number;
|
|
50
|
+
errors: number;
|
|
51
|
+
warnings: number;
|
|
52
|
+
info: number;
|
|
53
|
+
};
|
|
54
|
+
quick_fixes: string[];
|
|
55
|
+
config_score: number;
|
|
56
|
+
}
|
|
57
|
+
export declare function executeConfigValidator(db: FourDADatabase, params: ConfigValidatorParams): ConfigValidationResult;
|
|
58
|
+
export {};
|
|
59
|
+
//# sourceMappingURL=config-validator.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config-validator.d.ts","sourceRoot":"","sources":["../../src/tools/config-validator.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,UAAU,CAAC;AAE/C,eAAO,MAAM,mBAAmB;;;;;;;;;;;;;;;;;CAyB/B,CAAC;AAEF,MAAM,WAAW,qBAAqB;IACpC,OAAO,CAAC,EAAE,KAAK,GAAG,SAAS,GAAG,WAAW,GAAG,KAAK,GAAG,KAAK,GAAG,QAAQ,GAAG,IAAI,CAAC;IAC5E,eAAe,CAAC,EAAE,OAAO,CAAC;CAC3B;AAED,UAAU,eAAe;IACvB,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,OAAO,GAAG,SAAS,GAAG,MAAM,CAAC;IACvC,OAAO,EAAE,MAAM,CAAC;IAChB,aAAa,EAAE,OAAO,CAAC;IACvB,QAAQ,EAAE,MAAM,CAAC;IACjB,GAAG,CAAC,EAAE,MAAM,CAAC;CACd;AAED,UAAU,iBAAiB;IACzB,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,OAAO,GAAG,UAAU,GAAG,QAAQ,CAAC;IACxC,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,eAAe,EAAE,CAAC;CAC3B;AAED,UAAU,sBAAsB;IAC9B,cAAc,EAAE,OAAO,GAAG,UAAU,GAAG,QAAQ,CAAC;IAChD,QAAQ,EAAE,iBAAiB,EAAE,CAAC;IAC9B,OAAO,EAAE;QACP,YAAY,EAAE,MAAM,CAAC;QACrB,MAAM,EAAE,MAAM,CAAC;QACf,QAAQ,EAAE,MAAM,CAAC;QACjB,IAAI,EAAE,MAAM,CAAC;KACd,CAAC;IACF,WAAW,EAAE,MAAM,EAAE,CAAC;IACtB,YAAY,EAAE,MAAM,CAAC;CACtB;AAED,wBAAgB,sBAAsB,CACpC,EAAE,EAAE,cAAc,EAClB,MAAM,EAAE,qBAAqB,GAC5B,sBAAsB,CA0ExB"}
|
|
@@ -0,0 +1,375 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Config Validator Tool
|
|
3
|
+
*
|
|
4
|
+
* Validate and diagnose 4DA configuration issues.
|
|
5
|
+
* This is a SUPERPOWER - it catches config errors before they cause problems.
|
|
6
|
+
*/
|
|
7
|
+
export const configValidatorTool = {
|
|
8
|
+
name: "config_validator",
|
|
9
|
+
description: `Validate 4DA configuration and detect issues.
|
|
10
|
+
Returns:
|
|
11
|
+
- Schema validation results
|
|
12
|
+
- Missing required fields
|
|
13
|
+
- Invalid values detected
|
|
14
|
+
- Cross-field consistency checks
|
|
15
|
+
- Recommendations for fixes
|
|
16
|
+
|
|
17
|
+
Use this when things aren't working as expected.`,
|
|
18
|
+
inputSchema: {
|
|
19
|
+
type: "object",
|
|
20
|
+
properties: {
|
|
21
|
+
section: {
|
|
22
|
+
type: "string",
|
|
23
|
+
enum: ["all", "sources", "embedding", "llm", "ace", "digest", "ui"],
|
|
24
|
+
description: "Config section to validate (default: all)",
|
|
25
|
+
},
|
|
26
|
+
fix_suggestions: {
|
|
27
|
+
type: "boolean",
|
|
28
|
+
description: "Include fix suggestions (default: true)",
|
|
29
|
+
},
|
|
30
|
+
},
|
|
31
|
+
},
|
|
32
|
+
};
|
|
33
|
+
export function executeConfigValidator(db, params) {
|
|
34
|
+
const { section = "all", fix_suggestions = true } = params;
|
|
35
|
+
const dbInstance = db.db;
|
|
36
|
+
// Get current settings
|
|
37
|
+
const settingsStmt = dbInstance.prepare(`
|
|
38
|
+
SELECT key, value FROM settings
|
|
39
|
+
`);
|
|
40
|
+
const settingsRows = settingsStmt.all();
|
|
41
|
+
const settings = {};
|
|
42
|
+
for (const row of settingsRows) {
|
|
43
|
+
try {
|
|
44
|
+
settings[row.key] = JSON.parse(row.value);
|
|
45
|
+
}
|
|
46
|
+
catch {
|
|
47
|
+
settings[row.key] = row.value;
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
const sections = [];
|
|
51
|
+
// Validate each section
|
|
52
|
+
if (section === "all" || section === "sources") {
|
|
53
|
+
sections.push(validateSources(settings, fix_suggestions));
|
|
54
|
+
}
|
|
55
|
+
if (section === "all" || section === "embedding") {
|
|
56
|
+
sections.push(validateEmbedding(settings, fix_suggestions));
|
|
57
|
+
}
|
|
58
|
+
if (section === "all" || section === "llm") {
|
|
59
|
+
sections.push(validateLLM(settings, fix_suggestions));
|
|
60
|
+
}
|
|
61
|
+
if (section === "all" || section === "ace") {
|
|
62
|
+
sections.push(validateACE(settings, fix_suggestions));
|
|
63
|
+
}
|
|
64
|
+
if (section === "all" || section === "digest") {
|
|
65
|
+
sections.push(validateDigest(settings, fix_suggestions));
|
|
66
|
+
}
|
|
67
|
+
if (section === "all" || section === "ui") {
|
|
68
|
+
sections.push(validateUI(settings, fix_suggestions));
|
|
69
|
+
}
|
|
70
|
+
// Calculate summary
|
|
71
|
+
const allIssues = sections.flatMap(s => s.issues);
|
|
72
|
+
const errors = allIssues.filter(i => i.severity === "error").length;
|
|
73
|
+
const warnings = allIssues.filter(i => i.severity === "warning").length;
|
|
74
|
+
const info = allIssues.filter(i => i.severity === "info").length;
|
|
75
|
+
const overallStatus = errors > 0 ? "errors" : warnings > 0 ? "warnings" : "valid";
|
|
76
|
+
// Generate quick fixes
|
|
77
|
+
const quickFixes = allIssues
|
|
78
|
+
.filter(i => i.fix && i.severity !== "info")
|
|
79
|
+
.map(i => i.fix)
|
|
80
|
+
.slice(0, 5);
|
|
81
|
+
// Calculate config score (0-100)
|
|
82
|
+
const maxScore = 100;
|
|
83
|
+
const errorPenalty = errors * 20;
|
|
84
|
+
const warningPenalty = warnings * 5;
|
|
85
|
+
const configScore = Math.max(0, maxScore - errorPenalty - warningPenalty);
|
|
86
|
+
return {
|
|
87
|
+
overall_status: overallStatus,
|
|
88
|
+
sections,
|
|
89
|
+
summary: {
|
|
90
|
+
total_issues: allIssues.length,
|
|
91
|
+
errors,
|
|
92
|
+
warnings,
|
|
93
|
+
info,
|
|
94
|
+
},
|
|
95
|
+
quick_fixes: quickFixes,
|
|
96
|
+
config_score: configScore,
|
|
97
|
+
};
|
|
98
|
+
}
|
|
99
|
+
function validateSources(settings, includeFixes) {
|
|
100
|
+
const issues = [];
|
|
101
|
+
// Check enabled sources
|
|
102
|
+
const sources = settings.sources;
|
|
103
|
+
if (!sources) {
|
|
104
|
+
issues.push({
|
|
105
|
+
section: "sources",
|
|
106
|
+
field: "sources",
|
|
107
|
+
severity: "error",
|
|
108
|
+
message: "No sources configured",
|
|
109
|
+
current_value: undefined,
|
|
110
|
+
expected: "At least one source should be enabled",
|
|
111
|
+
fix: includeFixes ? "Add sources in Settings → Sources" : undefined,
|
|
112
|
+
});
|
|
113
|
+
}
|
|
114
|
+
else {
|
|
115
|
+
const enabledCount = Object.values(sources).filter(s => s.enabled).length;
|
|
116
|
+
if (enabledCount === 0) {
|
|
117
|
+
issues.push({
|
|
118
|
+
section: "sources",
|
|
119
|
+
field: "sources",
|
|
120
|
+
severity: "error",
|
|
121
|
+
message: "All sources are disabled",
|
|
122
|
+
current_value: "0 enabled",
|
|
123
|
+
expected: "At least one source should be enabled",
|
|
124
|
+
fix: includeFixes ? "Enable at least one source in Settings" : undefined,
|
|
125
|
+
});
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
// Check fetch intervals
|
|
129
|
+
const fetchInterval = settings.fetch_interval_minutes;
|
|
130
|
+
if (fetchInterval && fetchInterval < 5) {
|
|
131
|
+
issues.push({
|
|
132
|
+
section: "sources",
|
|
133
|
+
field: "fetch_interval_minutes",
|
|
134
|
+
severity: "warning",
|
|
135
|
+
message: "Very aggressive fetch interval may cause rate limiting",
|
|
136
|
+
current_value: fetchInterval,
|
|
137
|
+
expected: "5 minutes or more recommended",
|
|
138
|
+
fix: includeFixes ? "Increase fetch_interval_minutes to 15+" : undefined,
|
|
139
|
+
});
|
|
140
|
+
}
|
|
141
|
+
return {
|
|
142
|
+
section: "sources",
|
|
143
|
+
status: issues.some(i => i.severity === "error") ? "errors" :
|
|
144
|
+
issues.some(i => i.severity === "warning") ? "warnings" : "valid",
|
|
145
|
+
issue_count: issues.length,
|
|
146
|
+
issues,
|
|
147
|
+
};
|
|
148
|
+
}
|
|
149
|
+
function validateEmbedding(settings, includeFixes) {
|
|
150
|
+
const issues = [];
|
|
151
|
+
const embeddingProvider = settings.embedding_provider;
|
|
152
|
+
const openaiKey = settings.openai_api_key;
|
|
153
|
+
const ollamaUrl = settings.ollama_url;
|
|
154
|
+
if (!embeddingProvider) {
|
|
155
|
+
issues.push({
|
|
156
|
+
section: "embedding",
|
|
157
|
+
field: "embedding_provider",
|
|
158
|
+
severity: "error",
|
|
159
|
+
message: "No embedding provider configured",
|
|
160
|
+
current_value: undefined,
|
|
161
|
+
expected: "openai or ollama",
|
|
162
|
+
fix: includeFixes ? "Set embedding_provider in Settings" : undefined,
|
|
163
|
+
});
|
|
164
|
+
}
|
|
165
|
+
else if (embeddingProvider === "openai" && !openaiKey) {
|
|
166
|
+
issues.push({
|
|
167
|
+
section: "embedding",
|
|
168
|
+
field: "openai_api_key",
|
|
169
|
+
severity: "error",
|
|
170
|
+
message: "OpenAI selected but no API key provided",
|
|
171
|
+
current_value: "(empty)",
|
|
172
|
+
expected: "Valid OpenAI API key",
|
|
173
|
+
fix: includeFixes ? "Add your OpenAI API key in Settings → API Keys" : undefined,
|
|
174
|
+
});
|
|
175
|
+
}
|
|
176
|
+
else if (embeddingProvider === "ollama" && !ollamaUrl) {
|
|
177
|
+
issues.push({
|
|
178
|
+
section: "embedding",
|
|
179
|
+
field: "ollama_url",
|
|
180
|
+
severity: "warning",
|
|
181
|
+
message: "Ollama selected but no URL configured (using default)",
|
|
182
|
+
current_value: ollamaUrl || "(empty)",
|
|
183
|
+
expected: "http://localhost:11434 or custom URL",
|
|
184
|
+
fix: includeFixes ? "Verify Ollama is running at default port" : undefined,
|
|
185
|
+
});
|
|
186
|
+
}
|
|
187
|
+
// Check embedding model
|
|
188
|
+
const embeddingModel = settings.embedding_model;
|
|
189
|
+
if (!embeddingModel) {
|
|
190
|
+
issues.push({
|
|
191
|
+
section: "embedding",
|
|
192
|
+
field: "embedding_model",
|
|
193
|
+
severity: "info",
|
|
194
|
+
message: "No embedding model specified (using default)",
|
|
195
|
+
current_value: "(default)",
|
|
196
|
+
expected: "text-embedding-3-small recommended",
|
|
197
|
+
});
|
|
198
|
+
}
|
|
199
|
+
return {
|
|
200
|
+
section: "embedding",
|
|
201
|
+
status: issues.some(i => i.severity === "error") ? "errors" :
|
|
202
|
+
issues.some(i => i.severity === "warning") ? "warnings" : "valid",
|
|
203
|
+
issue_count: issues.length,
|
|
204
|
+
issues,
|
|
205
|
+
};
|
|
206
|
+
}
|
|
207
|
+
function validateLLM(settings, includeFixes) {
|
|
208
|
+
const issues = [];
|
|
209
|
+
const llmProvider = settings.llm_provider;
|
|
210
|
+
const anthropicKey = settings.anthropic_api_key;
|
|
211
|
+
const openaiKey = settings.openai_api_key;
|
|
212
|
+
if (!llmProvider) {
|
|
213
|
+
issues.push({
|
|
214
|
+
section: "llm",
|
|
215
|
+
field: "llm_provider",
|
|
216
|
+
severity: "warning",
|
|
217
|
+
message: "No LLM provider configured - relevance scoring will be limited",
|
|
218
|
+
current_value: undefined,
|
|
219
|
+
expected: "anthropic, openai, or ollama",
|
|
220
|
+
fix: includeFixes ? "Configure an LLM provider for better relevance scoring" : undefined,
|
|
221
|
+
});
|
|
222
|
+
}
|
|
223
|
+
else if (llmProvider === "anthropic" && !anthropicKey) {
|
|
224
|
+
issues.push({
|
|
225
|
+
section: "llm",
|
|
226
|
+
field: "anthropic_api_key",
|
|
227
|
+
severity: "error",
|
|
228
|
+
message: "Anthropic selected but no API key provided",
|
|
229
|
+
current_value: "(empty)",
|
|
230
|
+
expected: "Valid Anthropic API key",
|
|
231
|
+
fix: includeFixes ? "Add your Anthropic API key in Settings → API Keys" : undefined,
|
|
232
|
+
});
|
|
233
|
+
}
|
|
234
|
+
else if (llmProvider === "openai" && !openaiKey) {
|
|
235
|
+
issues.push({
|
|
236
|
+
section: "llm",
|
|
237
|
+
field: "openai_api_key",
|
|
238
|
+
severity: "error",
|
|
239
|
+
message: "OpenAI selected for LLM but no API key provided",
|
|
240
|
+
current_value: "(empty)",
|
|
241
|
+
expected: "Valid OpenAI API key",
|
|
242
|
+
fix: includeFixes ? "Add your OpenAI API key in Settings → API Keys" : undefined,
|
|
243
|
+
});
|
|
244
|
+
}
|
|
245
|
+
// Check daily limit
|
|
246
|
+
const dailyLimit = settings.daily_cost_limit_usd;
|
|
247
|
+
if (dailyLimit === undefined) {
|
|
248
|
+
issues.push({
|
|
249
|
+
section: "llm",
|
|
250
|
+
field: "daily_cost_limit_usd",
|
|
251
|
+
severity: "info",
|
|
252
|
+
message: "No daily cost limit set",
|
|
253
|
+
current_value: "(unlimited)",
|
|
254
|
+
expected: "Consider setting a limit to avoid surprise bills",
|
|
255
|
+
});
|
|
256
|
+
}
|
|
257
|
+
return {
|
|
258
|
+
section: "llm",
|
|
259
|
+
status: issues.some(i => i.severity === "error") ? "errors" :
|
|
260
|
+
issues.some(i => i.severity === "warning") ? "warnings" : "valid",
|
|
261
|
+
issue_count: issues.length,
|
|
262
|
+
issues,
|
|
263
|
+
};
|
|
264
|
+
}
|
|
265
|
+
function validateACE(settings, includeFixes) {
|
|
266
|
+
const issues = [];
|
|
267
|
+
const watchedDirs = settings.watched_directories;
|
|
268
|
+
const aceEnabled = settings.ace_enabled;
|
|
269
|
+
if (aceEnabled && (!watchedDirs || watchedDirs.length === 0)) {
|
|
270
|
+
issues.push({
|
|
271
|
+
section: "ace",
|
|
272
|
+
field: "watched_directories",
|
|
273
|
+
severity: "warning",
|
|
274
|
+
message: "ACE enabled but no directories configured to watch",
|
|
275
|
+
current_value: watchedDirs || [],
|
|
276
|
+
expected: "At least one directory for context detection",
|
|
277
|
+
fix: includeFixes ? "Add project directories in Settings → Context" : undefined,
|
|
278
|
+
});
|
|
279
|
+
}
|
|
280
|
+
// Check for overly broad paths
|
|
281
|
+
if (watchedDirs) {
|
|
282
|
+
for (const dir of watchedDirs) {
|
|
283
|
+
if (dir === "/" || dir === "C:\\" || dir.split(/[/\\]/).length <= 2) {
|
|
284
|
+
issues.push({
|
|
285
|
+
section: "ace",
|
|
286
|
+
field: "watched_directories",
|
|
287
|
+
severity: "warning",
|
|
288
|
+
message: `Path "${dir}" is very broad - may cause performance issues`,
|
|
289
|
+
current_value: dir,
|
|
290
|
+
expected: "More specific project directories",
|
|
291
|
+
fix: includeFixes ? `Use specific project paths instead of "${dir}"` : undefined,
|
|
292
|
+
});
|
|
293
|
+
}
|
|
294
|
+
}
|
|
295
|
+
}
|
|
296
|
+
return {
|
|
297
|
+
section: "ace",
|
|
298
|
+
status: issues.some(i => i.severity === "error") ? "errors" :
|
|
299
|
+
issues.some(i => i.severity === "warning") ? "warnings" : "valid",
|
|
300
|
+
issue_count: issues.length,
|
|
301
|
+
issues,
|
|
302
|
+
};
|
|
303
|
+
}
|
|
304
|
+
function validateDigest(settings, includeFixes) {
|
|
305
|
+
const issues = [];
|
|
306
|
+
const digestEnabled = settings.digest_enabled;
|
|
307
|
+
const digestEmail = settings.digest_email;
|
|
308
|
+
if (digestEnabled && digestEmail) {
|
|
309
|
+
// Basic email validation
|
|
310
|
+
if (!digestEmail.includes("@") || !digestEmail.includes(".")) {
|
|
311
|
+
issues.push({
|
|
312
|
+
section: "digest",
|
|
313
|
+
field: "digest_email",
|
|
314
|
+
severity: "error",
|
|
315
|
+
message: "Invalid email address format",
|
|
316
|
+
current_value: digestEmail,
|
|
317
|
+
expected: "Valid email address",
|
|
318
|
+
fix: includeFixes ? "Correct the email address format" : undefined,
|
|
319
|
+
});
|
|
320
|
+
}
|
|
321
|
+
}
|
|
322
|
+
const digestFrequency = settings.digest_frequency;
|
|
323
|
+
if (digestEnabled && !digestFrequency) {
|
|
324
|
+
issues.push({
|
|
325
|
+
section: "digest",
|
|
326
|
+
field: "digest_frequency",
|
|
327
|
+
severity: "info",
|
|
328
|
+
message: "No digest frequency set (using default)",
|
|
329
|
+
current_value: "(default)",
|
|
330
|
+
expected: "daily, weekly, or custom schedule",
|
|
331
|
+
});
|
|
332
|
+
}
|
|
333
|
+
return {
|
|
334
|
+
section: "digest",
|
|
335
|
+
status: issues.some(i => i.severity === "error") ? "errors" :
|
|
336
|
+
issues.some(i => i.severity === "warning") ? "warnings" : "valid",
|
|
337
|
+
issue_count: issues.length,
|
|
338
|
+
issues,
|
|
339
|
+
};
|
|
340
|
+
}
|
|
341
|
+
function validateUI(settings, includeFixes) {
|
|
342
|
+
const issues = [];
|
|
343
|
+
const theme = settings.theme;
|
|
344
|
+
if (theme && !["dark", "light", "system"].includes(theme)) {
|
|
345
|
+
issues.push({
|
|
346
|
+
section: "ui",
|
|
347
|
+
field: "theme",
|
|
348
|
+
severity: "warning",
|
|
349
|
+
message: "Unknown theme value",
|
|
350
|
+
current_value: theme,
|
|
351
|
+
expected: "dark, light, or system",
|
|
352
|
+
fix: includeFixes ? "Set theme to dark, light, or system" : undefined,
|
|
353
|
+
});
|
|
354
|
+
}
|
|
355
|
+
const maxResults = settings.max_results_per_page;
|
|
356
|
+
if (maxResults && (maxResults < 5 || maxResults > 100)) {
|
|
357
|
+
issues.push({
|
|
358
|
+
section: "ui",
|
|
359
|
+
field: "max_results_per_page",
|
|
360
|
+
severity: "warning",
|
|
361
|
+
message: "Unusual results per page value",
|
|
362
|
+
current_value: maxResults,
|
|
363
|
+
expected: "Between 5 and 100",
|
|
364
|
+
fix: includeFixes ? "Set max_results_per_page to a reasonable value (10-50)" : undefined,
|
|
365
|
+
});
|
|
366
|
+
}
|
|
367
|
+
return {
|
|
368
|
+
section: "ui",
|
|
369
|
+
status: issues.some(i => i.severity === "error") ? "errors" :
|
|
370
|
+
issues.some(i => i.severity === "warning") ? "warnings" : "valid",
|
|
371
|
+
issue_count: issues.length,
|
|
372
|
+
issues,
|
|
373
|
+
};
|
|
374
|
+
}
|
|
375
|
+
//# sourceMappingURL=config-validator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config-validator.js","sourceRoot":"","sources":["../../src/tools/config-validator.ts"],"names":[],"mappings":"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"}
|