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