@4da/mcp-server 4.5.0 → 4.6.1
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/LICENSE +201 -21
- package/README.md +63 -83
- package/dist/auth.js +1 -1
- package/dist/auth.js.map +1 -1
- package/dist/db.d.ts +46 -1
- package/dist/db.d.ts.map +1 -1
- package/dist/db.js +156 -36
- package/dist/db.js.map +1 -1
- package/dist/doctor.js +1 -1
- package/dist/doctor.js.map +1 -1
- package/dist/http-transport.js +1 -1
- package/dist/http-transport.js.map +1 -1
- package/dist/index.d.ts +9 -14
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +49 -35
- package/dist/index.js.map +1 -1
- package/dist/live/cache.js +1 -1
- package/dist/live/cache.js.map +1 -1
- package/dist/live/crates-registry.js +1 -1
- package/dist/live/crates-registry.js.map +1 -1
- package/dist/live/go-registry.js +1 -1
- package/dist/live/go-registry.js.map +1 -1
- package/dist/live/hn-fetcher.js +1 -1
- package/dist/live/hn-fetcher.js.map +1 -1
- package/dist/live/http-utils.js +1 -1
- package/dist/live/http-utils.js.map +1 -1
- package/dist/live/index.d.ts +28 -0
- package/dist/live/index.d.ts.map +1 -1
- package/dist/live/index.js +63 -4
- package/dist/live/index.js.map +1 -1
- package/dist/live/npm-registry.js +1 -1
- package/dist/live/npm-registry.js.map +1 -1
- package/dist/live/osv-scanner.d.ts +4 -0
- package/dist/live/osv-scanner.d.ts.map +1 -1
- package/dist/live/osv-scanner.js +45 -40
- package/dist/live/osv-scanner.js.map +1 -1
- package/dist/live/pypi-registry.js +1 -1
- package/dist/live/pypi-registry.js.map +1 -1
- package/dist/live/rate-limiter.js +1 -1
- package/dist/live/rate-limiter.js.map +1 -1
- package/dist/live/semver-utils.js +1 -1
- package/dist/live/semver-utils.js.map +1 -1
- package/dist/live/types.d.ts +4 -0
- package/dist/live/types.d.ts.map +1 -1
- package/dist/live/types.js +1 -1
- package/dist/live/types.js.map +1 -1
- package/dist/live/version-resolver.d.ts +5 -0
- package/dist/live/version-resolver.d.ts.map +1 -1
- package/dist/live/version-resolver.js +64 -14
- package/dist/live/version-resolver.js.map +1 -1
- package/dist/live-singleton.js +1 -1
- package/dist/live-singleton.js.map +1 -1
- package/dist/llm.d.ts.map +1 -1
- package/dist/llm.js +13 -16
- package/dist/llm.js.map +1 -1
- package/dist/output-manager.js +1 -1
- package/dist/output-manager.js.map +1 -1
- package/dist/project-scanner.d.ts +5 -0
- package/dist/project-scanner.d.ts.map +1 -1
- package/dist/project-scanner.js +66 -10
- package/dist/project-scanner.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 +58 -238
- package/dist/schema-registry.js.map +1 -1
- package/dist/schemas/agent-memory.json +1 -1
- package/dist/schemas/decision-enforcement.json +1 -1
- package/dist/schemas/decision-memory.json +1 -1
- package/dist/schemas/dependency-health.json +1 -1
- package/dist/schemas/developer-dna.json +1 -1
- package/dist/schemas/ecosystem-pulse.json +1 -1
- package/dist/schemas/get-actionable-signals.json +1 -1
- package/dist/schemas/get-context.json +1 -1
- package/dist/schemas/get-relevant-content.json +1 -1
- package/dist/schemas/knowledge-gaps.json +1 -1
- package/dist/schemas/record-feedback.json +1 -1
- package/dist/schemas/upgrade-planner.json +1 -1
- package/dist/schemas/vulnerability-scan.json +2 -2
- package/dist/setup.js +1 -1
- package/dist/setup.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 +51 -50
- package/dist/tool-dispatch.js.map +1 -1
- package/dist/tools/agent-memory.js +1 -1
- package/dist/tools/agent-memory.js.map +1 -1
- package/dist/tools/decision-enforcement.js +1 -1
- package/dist/tools/decision-enforcement.js.map +1 -1
- package/dist/tools/decision-memory.d.ts +0 -2
- package/dist/tools/decision-memory.d.ts.map +1 -1
- package/dist/tools/decision-memory.js +1 -80
- package/dist/tools/decision-memory.js.map +1 -1
- package/dist/tools/dependency-health.js +1 -1
- package/dist/tools/dependency-health.js.map +1 -1
- package/dist/tools/developer-dna.js +1 -1
- package/dist/tools/developer-dna.js.map +1 -1
- package/dist/tools/ecosystem-pulse.js +1 -1
- package/dist/tools/ecosystem-pulse.js.map +1 -1
- package/dist/tools/get-actionable-signals.d.ts.map +1 -1
- package/dist/tools/get-actionable-signals.js +26 -1
- package/dist/tools/get-actionable-signals.js.map +1 -1
- package/dist/tools/get-context.js +1 -1
- package/dist/tools/get-context.js.map +1 -1
- package/dist/tools/get-relevant-content.js +1 -1
- package/dist/tools/get-relevant-content.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 +19 -55
- package/dist/tools/index.js.map +1 -1
- package/dist/tools/knowledge-gaps.js +1 -1
- package/dist/tools/knowledge-gaps.js.map +1 -1
- package/dist/tools/record-feedback.js +1 -1
- package/dist/tools/record-feedback.js.map +1 -1
- package/dist/tools/upgrade-planner.js +1 -1
- package/dist/tools/upgrade-planner.js.map +1 -1
- package/dist/tools/vulnerability-scan.d.ts +7 -3
- package/dist/tools/vulnerability-scan.d.ts.map +1 -1
- package/dist/tools/vulnerability-scan.js +19 -6
- package/dist/tools/vulnerability-scan.js.map +1 -1
- package/dist/tools/what-should-i-know.d.ts +3 -12
- package/dist/tools/what-should-i-know.d.ts.map +1 -1
- package/dist/tools/what-should-i-know.js +11 -171
- package/dist/tools/what-should-i-know.js.map +1 -1
- package/dist/types.d.ts +4 -0
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js +1 -1
- package/dist/types.js.map +1 -1
- package/package.json +12 -8
- 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,296 +0,0 @@
|
|
|
1
|
-
// SPDX-License-Identifier: FSL-1.1-Apache-2.0
|
|
2
|
-
/**
|
|
3
|
-
* Trend Analysis Tool
|
|
4
|
-
*
|
|
5
|
-
* Statistical analysis of patterns and trends over time.
|
|
6
|
-
* This is a SUPERPOWER - it reveals what's rising, falling, and anomalous.
|
|
7
|
-
*
|
|
8
|
-
* With synthesize=true, uses LLM to interpret trends and make predictions.
|
|
9
|
-
*/
|
|
10
|
-
import { getLLMConfig, canSynthesize, synthesize, SYNTHESIS_PROMPTS } from "../llm.js";
|
|
11
|
-
import { createTrendAnalysisCompact } from "../output-manager.js";
|
|
12
|
-
export const trendAnalysisTool = {
|
|
13
|
-
name: "trend_analysis",
|
|
14
|
-
description: `Analyze patterns and trends in 4DA's content over time.
|
|
15
|
-
|
|
16
|
-
With synthesize=true (recommended), uses AI to interpret trends and predict what matters.
|
|
17
|
-
|
|
18
|
-
Returns:
|
|
19
|
-
- Topic frequency trends (rising/falling)
|
|
20
|
-
- Volume anomalies detected
|
|
21
|
-
- Week-over-week comparisons
|
|
22
|
-
- Source performance trends
|
|
23
|
-
- AI predictions (when enabled)
|
|
24
|
-
|
|
25
|
-
Use this to understand what's changing in your information landscape.`,
|
|
26
|
-
inputSchema: {
|
|
27
|
-
type: "object",
|
|
28
|
-
properties: {
|
|
29
|
-
days: {
|
|
30
|
-
type: "number",
|
|
31
|
-
description: "Analysis period in days (default: 30)",
|
|
32
|
-
},
|
|
33
|
-
topic: {
|
|
34
|
-
type: "string",
|
|
35
|
-
description: "Specific topic to analyze (optional)",
|
|
36
|
-
},
|
|
37
|
-
detect_anomalies: {
|
|
38
|
-
type: "boolean",
|
|
39
|
-
description: "Include anomaly detection (default: true)",
|
|
40
|
-
},
|
|
41
|
-
synthesize: {
|
|
42
|
-
type: "boolean",
|
|
43
|
-
description: "Use AI to interpret trends and predict (default: true if LLM configured)",
|
|
44
|
-
},
|
|
45
|
-
compact: {
|
|
46
|
-
type: "boolean",
|
|
47
|
-
description: "Return compact result with file reference (default: true for ~80% token reduction)",
|
|
48
|
-
},
|
|
49
|
-
},
|
|
50
|
-
},
|
|
51
|
-
};
|
|
52
|
-
export async function executeTrendAnalysis(db, params) {
|
|
53
|
-
const { days = 30, topic, detect_anomalies = true } = params;
|
|
54
|
-
const useCompact = params.compact !== false; // Default to compact=true
|
|
55
|
-
const dbInstance = db.db;
|
|
56
|
-
// Check LLM availability
|
|
57
|
-
const llmConfig = getLLMConfig(dbInstance);
|
|
58
|
-
const shouldSynthesize = params.synthesize ?? canSynthesize(llmConfig);
|
|
59
|
-
const endDate = new Date();
|
|
60
|
-
const startDate = new Date(endDate.getTime() - days * 24 * 60 * 60 * 1000);
|
|
61
|
-
// Volume by day
|
|
62
|
-
const volumeByDayStmt = dbInstance.prepare(`
|
|
63
|
-
SELECT date(created_at) as date, COUNT(*) as count
|
|
64
|
-
FROM source_items
|
|
65
|
-
WHERE datetime(created_at) >= datetime(?)
|
|
66
|
-
GROUP BY date(created_at)
|
|
67
|
-
ORDER BY date
|
|
68
|
-
`);
|
|
69
|
-
const volumeByDay = volumeByDayStmt.all(startDate.toISOString());
|
|
70
|
-
// Calculate statistics for anomaly detection
|
|
71
|
-
const volumes = volumeByDay.map(v => v.count);
|
|
72
|
-
const mean = volumes.reduce((a, b) => a + b, 0) / volumes.length || 0;
|
|
73
|
-
const stdDev = Math.sqrt(volumes.reduce((sum, v) => sum + Math.pow(v - mean, 2), 0) / volumes.length) || 1;
|
|
74
|
-
// Detect anomalies
|
|
75
|
-
const anomalies = detect_anomalies
|
|
76
|
-
? volumeByDay
|
|
77
|
-
.map(v => ({
|
|
78
|
-
date: v.date,
|
|
79
|
-
volume: v.count,
|
|
80
|
-
expected: Math.round(mean),
|
|
81
|
-
z_score: Math.round(((v.count - mean) / stdDev) * 100) / 100,
|
|
82
|
-
status: (v.count - mean) / stdDev > 2 ? "spike" :
|
|
83
|
-
(v.count - mean) / stdDev < -2 ? "drop" : "normal",
|
|
84
|
-
}))
|
|
85
|
-
.filter(a => a.status !== "normal")
|
|
86
|
-
: [];
|
|
87
|
-
// Topic trends - compare this week vs last week
|
|
88
|
-
const topicTrends = getTopicTrends(dbInstance, topic);
|
|
89
|
-
// Source trends
|
|
90
|
-
const sourceTrends = getSourceTrends(dbInstance, days);
|
|
91
|
-
// Topic correlations (co-occurrence)
|
|
92
|
-
const correlations = getTopicCorrelations(dbInstance, days);
|
|
93
|
-
// Overall stats
|
|
94
|
-
const totalStmt = dbInstance.prepare(`
|
|
95
|
-
SELECT COUNT(*) as total, AVG(CASE WHEN url IS NOT NULL THEN 1 ELSE 0 END) as avg_has_url
|
|
96
|
-
FROM source_items
|
|
97
|
-
WHERE datetime(created_at) >= datetime(?)
|
|
98
|
-
`);
|
|
99
|
-
const totalStats = totalStmt.get(startDate.toISOString());
|
|
100
|
-
// Get relevant items for avg score
|
|
101
|
-
const relevantItems = db.getRelevantContent(0, undefined, 1000, days * 24);
|
|
102
|
-
const avgRelevance = relevantItems.length > 0
|
|
103
|
-
? relevantItems.reduce((sum, i) => sum + i.relevance_score, 0) / relevantItems.length
|
|
104
|
-
: 0;
|
|
105
|
-
// Volume trend
|
|
106
|
-
const recentVolume = volumeByDay.slice(-7).reduce((sum, v) => sum + v.count, 0);
|
|
107
|
-
const olderVolume = volumeByDay.slice(-14, -7).reduce((sum, v) => sum + v.count, 0);
|
|
108
|
-
const volumeTrend = recentVolume > olderVolume * 1.1 ? "increasing" :
|
|
109
|
-
recentVolume < olderVolume * 0.9 ? "decreasing" : "stable";
|
|
110
|
-
// Generate predictions
|
|
111
|
-
const predictions = generatePredictions(topicTrends, volumeTrend, anomalies);
|
|
112
|
-
const result = {
|
|
113
|
-
period: {
|
|
114
|
-
start: startDate.toISOString().split("T")[0],
|
|
115
|
-
end: endDate.toISOString().split("T")[0],
|
|
116
|
-
days,
|
|
117
|
-
},
|
|
118
|
-
summary: {
|
|
119
|
-
total_items: totalStats.total,
|
|
120
|
-
avg_relevance: Math.round(avgRelevance * 100) / 100,
|
|
121
|
-
volume_trend: volumeTrend,
|
|
122
|
-
top_rising_topic: topicTrends.find(t => t.trend === "rising")?.topic || null,
|
|
123
|
-
top_falling_topic: topicTrends.find(t => t.trend === "falling")?.topic || null,
|
|
124
|
-
},
|
|
125
|
-
topic_trends: topicTrends,
|
|
126
|
-
volume_by_day: volumeByDay,
|
|
127
|
-
anomalies,
|
|
128
|
-
source_trends: sourceTrends,
|
|
129
|
-
correlations,
|
|
130
|
-
predictions,
|
|
131
|
-
};
|
|
132
|
-
// AI Interpretation - the actual superpower
|
|
133
|
-
if (shouldSynthesize && canSynthesize(llmConfig)) {
|
|
134
|
-
try {
|
|
135
|
-
const context = db.getUserContext(true, true);
|
|
136
|
-
const trendData = {
|
|
137
|
-
period: result.period,
|
|
138
|
-
summary: result.summary,
|
|
139
|
-
topic_trends: result.topic_trends.slice(0, 8),
|
|
140
|
-
anomalies: result.anomalies,
|
|
141
|
-
correlations: result.correlations,
|
|
142
|
-
};
|
|
143
|
-
const contextData = {
|
|
144
|
-
interests: context.interests.slice(0, 10),
|
|
145
|
-
tech_stack: context.tech_stack,
|
|
146
|
-
role: context.role,
|
|
147
|
-
};
|
|
148
|
-
const synthesis = await synthesize(llmConfig, {
|
|
149
|
-
system: SYNTHESIS_PROMPTS.trendAnalysis.system,
|
|
150
|
-
prompt: SYNTHESIS_PROMPTS.trendAnalysis.buildPrompt(trendData, contextData),
|
|
151
|
-
max_tokens: 400,
|
|
152
|
-
complexity: SYNTHESIS_PROMPTS.trendAnalysis.complexity,
|
|
153
|
-
});
|
|
154
|
-
// Parse the synthesis
|
|
155
|
-
const lines = synthesis.synthesis.split("\n").filter(l => l.trim());
|
|
156
|
-
const keySignal = lines[0] || "";
|
|
157
|
-
const forecast = lines.find(l => l.toLowerCase().includes("week") || l.toLowerCase().includes("expect") || l.toLowerCase().includes("predict")) || lines[1] || "";
|
|
158
|
-
const focus = lines.find(l => l.toLowerCase().includes("focus") || l.toLowerCase().includes("attention") || l.toLowerCase().includes("should")) || "";
|
|
159
|
-
result.ai_interpretation = {
|
|
160
|
-
narrative: synthesis.synthesis,
|
|
161
|
-
key_signal: keySignal,
|
|
162
|
-
forecast: forecast,
|
|
163
|
-
recommended_focus: focus || "Continue monitoring trends",
|
|
164
|
-
model_used: synthesis.model_used,
|
|
165
|
-
};
|
|
166
|
-
}
|
|
167
|
-
catch (error) {
|
|
168
|
-
console.error("AI interpretation failed:", error);
|
|
169
|
-
}
|
|
170
|
-
}
|
|
171
|
-
// Return compact or full result based on parameter
|
|
172
|
-
if (useCompact) {
|
|
173
|
-
return createTrendAnalysisCompact(result);
|
|
174
|
-
}
|
|
175
|
-
return result;
|
|
176
|
-
}
|
|
177
|
-
function getTopicTrends(db, filterTopic) {
|
|
178
|
-
// Define topics to track
|
|
179
|
-
const topics = filterTopic
|
|
180
|
-
? [filterTopic]
|
|
181
|
-
: ["rust", "typescript", "python", "ai", "llm", "database", "security", "async", "wasm", "react"];
|
|
182
|
-
const trends = [];
|
|
183
|
-
for (const topic of topics) {
|
|
184
|
-
// This week
|
|
185
|
-
const thisWeekStmt = db.prepare(`
|
|
186
|
-
SELECT COUNT(*) as count, AVG(CASE WHEN url IS NOT NULL THEN 1 ELSE 0 END) as quality
|
|
187
|
-
FROM source_items
|
|
188
|
-
WHERE datetime(created_at) >= datetime('now', '-7 days')
|
|
189
|
-
AND (lower(title) LIKE ? OR lower(content) LIKE ?)
|
|
190
|
-
`);
|
|
191
|
-
const thisWeek = thisWeekStmt.all(`%${topic}%`, `%${topic}%`);
|
|
192
|
-
// Last week
|
|
193
|
-
const lastWeekStmt = db.prepare(`
|
|
194
|
-
SELECT COUNT(*) as count
|
|
195
|
-
FROM source_items
|
|
196
|
-
WHERE datetime(created_at) >= datetime('now', '-14 days')
|
|
197
|
-
AND datetime(created_at) < datetime('now', '-7 days')
|
|
198
|
-
AND (lower(title) LIKE ? OR lower(content) LIKE ?)
|
|
199
|
-
`);
|
|
200
|
-
const lastWeek = lastWeekStmt.all(`%${topic}%`, `%${topic}%`);
|
|
201
|
-
const current = thisWeek[0]?.count || 0;
|
|
202
|
-
const previous = lastWeek[0]?.count || 0;
|
|
203
|
-
const changePercent = previous > 0
|
|
204
|
-
? Math.round(((current - previous) / previous) * 100)
|
|
205
|
-
: current > 0 ? 100 : 0;
|
|
206
|
-
trends.push({
|
|
207
|
-
topic,
|
|
208
|
-
current_week: current,
|
|
209
|
-
previous_week: previous,
|
|
210
|
-
change_percent: changePercent,
|
|
211
|
-
trend: changePercent > 15 ? "rising" : changePercent < -15 ? "falling" : "stable",
|
|
212
|
-
avg_score: thisWeek[0]?.quality || 0,
|
|
213
|
-
});
|
|
214
|
-
}
|
|
215
|
-
// Sort by absolute change
|
|
216
|
-
return trends.sort((a, b) => Math.abs(b.change_percent) - Math.abs(a.change_percent));
|
|
217
|
-
}
|
|
218
|
-
function getSourceTrends(db, days) {
|
|
219
|
-
const stmt = db.prepare(`
|
|
220
|
-
SELECT
|
|
221
|
-
source_type,
|
|
222
|
-
COUNT(*) as total,
|
|
223
|
-
SUM(CASE WHEN datetime(created_at) >= datetime('now', '-7 days') THEN 1 ELSE 0 END) as recent,
|
|
224
|
-
SUM(CASE WHEN datetime(created_at) >= datetime('now', '-14 days')
|
|
225
|
-
AND datetime(created_at) < datetime('now', '-7 days') THEN 1 ELSE 0 END) as older
|
|
226
|
-
FROM source_items
|
|
227
|
-
WHERE datetime(created_at) >= datetime('now', '-' || ? || ' days')
|
|
228
|
-
GROUP BY source_type
|
|
229
|
-
`);
|
|
230
|
-
const sources = stmt.all(days);
|
|
231
|
-
return sources.map(s => ({
|
|
232
|
-
source: s.source_type,
|
|
233
|
-
volume_trend: s.recent > s.older * 1.1 ? "up" :
|
|
234
|
-
s.recent < s.older * 0.9 ? "down" : "stable",
|
|
235
|
-
quality_trend: "stable", // Would need more data to compute
|
|
236
|
-
avg_score: 0.6, // Placeholder
|
|
237
|
-
item_count: s.total,
|
|
238
|
-
}));
|
|
239
|
-
}
|
|
240
|
-
function getTopicCorrelations(db, days) {
|
|
241
|
-
const topicPairs = [
|
|
242
|
-
["rust", "async"],
|
|
243
|
-
["ai", "llm"],
|
|
244
|
-
["typescript", "react"],
|
|
245
|
-
["database", "sql"],
|
|
246
|
-
["security", "auth"],
|
|
247
|
-
];
|
|
248
|
-
const correlations = [];
|
|
249
|
-
for (const [a, b] of topicPairs) {
|
|
250
|
-
const stmt = db.prepare(`
|
|
251
|
-
SELECT COUNT(*) as count
|
|
252
|
-
FROM source_items
|
|
253
|
-
WHERE datetime(created_at) >= datetime('now', '-' || ? || ' days')
|
|
254
|
-
AND (lower(title) LIKE ? OR lower(content) LIKE ?)
|
|
255
|
-
AND (lower(title) LIKE ? OR lower(content) LIKE ?)
|
|
256
|
-
`);
|
|
257
|
-
const result = stmt.all(days, `%${a}%`, `%${a}%`, `%${b}%`, `%${b}%`);
|
|
258
|
-
if (result[0]?.count > 0) {
|
|
259
|
-
correlations.push({
|
|
260
|
-
topic_a: a,
|
|
261
|
-
topic_b: b,
|
|
262
|
-
co_occurrences: result[0].count,
|
|
263
|
-
});
|
|
264
|
-
}
|
|
265
|
-
}
|
|
266
|
-
return correlations.sort((a, b) => b.co_occurrences - a.co_occurrences);
|
|
267
|
-
}
|
|
268
|
-
function generatePredictions(trends, volumeTrend, anomalies) {
|
|
269
|
-
const predictions = [];
|
|
270
|
-
// Rising topics
|
|
271
|
-
const rising = trends.filter(t => t.trend === "rising");
|
|
272
|
-
if (rising.length > 0) {
|
|
273
|
-
predictions.push(`"${rising[0].topic}" is trending up (+${rising[0].change_percent}%) - expect more content soon`);
|
|
274
|
-
}
|
|
275
|
-
// Falling topics
|
|
276
|
-
const falling = trends.filter(t => t.trend === "falling");
|
|
277
|
-
if (falling.length > 0) {
|
|
278
|
-
predictions.push(`"${falling[0].topic}" is declining (${falling[0].change_percent}%) - may stabilize or continue dropping`);
|
|
279
|
-
}
|
|
280
|
-
// Volume prediction
|
|
281
|
-
if (volumeTrend === "increasing") {
|
|
282
|
-
predictions.push("Overall content volume is increasing - more items to filter");
|
|
283
|
-
}
|
|
284
|
-
else if (volumeTrend === "decreasing") {
|
|
285
|
-
predictions.push("Content volume is decreasing - sources may need attention");
|
|
286
|
-
}
|
|
287
|
-
// Anomaly-based prediction
|
|
288
|
-
if (anomalies.filter(a => a.status === "spike").length > 2) {
|
|
289
|
-
predictions.push("Multiple volume spikes detected - possibly major news events");
|
|
290
|
-
}
|
|
291
|
-
if (predictions.length === 0) {
|
|
292
|
-
predictions.push("Patterns are stable - no significant changes predicted");
|
|
293
|
-
}
|
|
294
|
-
return predictions;
|
|
295
|
-
}
|
|
296
|
-
//# sourceMappingURL=trend-analysis.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"trend-analysis.js","sourceRoot":"","sources":["../../src/tools/trend-analysis.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,38 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* trust_summary tool
|
|
3
|
-
*
|
|
4
|
-
* Returns intelligence quality metrics from the trust ledger —
|
|
5
|
-
* precision, action rate, false positive rate, preemption wins.
|
|
6
|
-
* Helps agents assess how reliable 4DA's intelligence is.
|
|
7
|
-
*/
|
|
8
|
-
import type { FourDADatabase } from "../db.js";
|
|
9
|
-
export interface TrustSummaryParams {
|
|
10
|
-
days?: number;
|
|
11
|
-
}
|
|
12
|
-
export declare const trustSummaryTool: {
|
|
13
|
-
name: string;
|
|
14
|
-
description: string;
|
|
15
|
-
inputSchema: {
|
|
16
|
-
type: "object";
|
|
17
|
-
properties: {
|
|
18
|
-
days: {
|
|
19
|
-
type: string;
|
|
20
|
-
description: string;
|
|
21
|
-
default: number;
|
|
22
|
-
};
|
|
23
|
-
};
|
|
24
|
-
};
|
|
25
|
-
};
|
|
26
|
-
export declare function executeTrustSummary(db: FourDADatabase, params: TrustSummaryParams): {
|
|
27
|
-
period_days: number;
|
|
28
|
-
total_surfaced: number;
|
|
29
|
-
acted_on: number;
|
|
30
|
-
dismissed: number;
|
|
31
|
-
false_positives: number;
|
|
32
|
-
precision: number;
|
|
33
|
-
action_conversion_rate: number;
|
|
34
|
-
preemption_wins: number;
|
|
35
|
-
avg_lead_time_hours: number | null;
|
|
36
|
-
reliability_assessment: string;
|
|
37
|
-
};
|
|
38
|
-
//# sourceMappingURL=trust-summary.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"trust-summary.d.ts","sourceRoot":"","sources":["../../src/tools/trust-summary.ts"],"names":[],"mappings":"AACA;;;;;;GAMG;AAEH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,UAAU,CAAC;AAE/C,MAAM,WAAW,kBAAkB;IACjC,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED,eAAO,MAAM,gBAAgB;;;;;;;;;;;;;CAc5B,CAAC;AAEF,wBAAgB,mBAAmB,CACjC,EAAE,EAAE,cAAc,EAClB,MAAM,EAAE,kBAAkB;;;;;;;;;;;EA8E3B"}
|
|
@@ -1,89 +0,0 @@
|
|
|
1
|
-
// SPDX-License-Identifier: FSL-1.1-Apache-2.0
|
|
2
|
-
/**
|
|
3
|
-
* trust_summary tool
|
|
4
|
-
*
|
|
5
|
-
* Returns intelligence quality metrics from the trust ledger —
|
|
6
|
-
* precision, action rate, false positive rate, preemption wins.
|
|
7
|
-
* Helps agents assess how reliable 4DA's intelligence is.
|
|
8
|
-
*/
|
|
9
|
-
export const trustSummaryTool = {
|
|
10
|
-
name: "trust_summary",
|
|
11
|
-
description: "Get intelligence quality metrics — precision, action conversion rate, false positive rate, and preemption wins. Use this to assess how reliable 4DA's signals are before acting on them.",
|
|
12
|
-
inputSchema: {
|
|
13
|
-
type: "object",
|
|
14
|
-
properties: {
|
|
15
|
-
days: {
|
|
16
|
-
type: "number",
|
|
17
|
-
description: "Number of days to analyze. Default: 30",
|
|
18
|
-
default: 30,
|
|
19
|
-
},
|
|
20
|
-
},
|
|
21
|
-
},
|
|
22
|
-
};
|
|
23
|
-
export function executeTrustSummary(db, params) {
|
|
24
|
-
const rawDb = db.getRawDb();
|
|
25
|
-
const days = params.days ?? 30;
|
|
26
|
-
const offset = `-${days} days`;
|
|
27
|
-
// Count events by type
|
|
28
|
-
let counts = [];
|
|
29
|
-
try {
|
|
30
|
-
counts = rawDb
|
|
31
|
-
.prepare(`SELECT event_type, COUNT(*) as cnt
|
|
32
|
-
FROM trust_events
|
|
33
|
-
WHERE created_at >= datetime('now', ?)
|
|
34
|
-
GROUP BY event_type`)
|
|
35
|
-
.all(offset);
|
|
36
|
-
}
|
|
37
|
-
catch {
|
|
38
|
-
/* trust_events table may not exist yet */
|
|
39
|
-
}
|
|
40
|
-
const getCount = (type) => counts.find((c) => c.event_type === type)?.cnt ?? 0;
|
|
41
|
-
const surfaced = getCount("surfaced");
|
|
42
|
-
const acted_on = getCount("acted_on");
|
|
43
|
-
const dismissed = getCount("dismissed");
|
|
44
|
-
const false_positives = getCount("false_positive");
|
|
45
|
-
const validated = getCount("validated");
|
|
46
|
-
const true_positives = acted_on + validated;
|
|
47
|
-
const precision = true_positives + false_positives > 0
|
|
48
|
-
? true_positives / (true_positives + false_positives)
|
|
49
|
-
: 1.0;
|
|
50
|
-
const action_rate = surfaced > 0 ? acted_on / surfaced : 0;
|
|
51
|
-
// Preemption wins
|
|
52
|
-
let preemption_wins = 0;
|
|
53
|
-
let avg_lead_time_hours = null;
|
|
54
|
-
try {
|
|
55
|
-
const winRow = rawDb
|
|
56
|
-
.prepare(`SELECT COUNT(*) as wins, AVG(lead_time_hours) as avg_lead
|
|
57
|
-
FROM preemption_wins
|
|
58
|
-
WHERE verified = 1 AND created_at >= datetime('now', ?)`)
|
|
59
|
-
.get(offset);
|
|
60
|
-
if (winRow) {
|
|
61
|
-
preemption_wins = winRow.wins;
|
|
62
|
-
avg_lead_time_hours = winRow.avg_lead;
|
|
63
|
-
}
|
|
64
|
-
}
|
|
65
|
-
catch {
|
|
66
|
-
/* table may not exist yet */
|
|
67
|
-
}
|
|
68
|
-
return {
|
|
69
|
-
period_days: days,
|
|
70
|
-
total_surfaced: surfaced,
|
|
71
|
-
acted_on,
|
|
72
|
-
dismissed,
|
|
73
|
-
false_positives,
|
|
74
|
-
precision: Math.round(precision * 1000) / 1000,
|
|
75
|
-
action_conversion_rate: Math.round(action_rate * 1000) / 1000,
|
|
76
|
-
preemption_wins,
|
|
77
|
-
avg_lead_time_hours: avg_lead_time_hours
|
|
78
|
-
? Math.round(avg_lead_time_hours * 10) / 10
|
|
79
|
-
: null,
|
|
80
|
-
reliability_assessment: precision >= 0.8
|
|
81
|
-
? "high"
|
|
82
|
-
: precision >= 0.6
|
|
83
|
-
? "moderate"
|
|
84
|
-
: precision >= 0.3
|
|
85
|
-
? "developing"
|
|
86
|
-
: "insufficient_data",
|
|
87
|
-
};
|
|
88
|
-
}
|
|
89
|
-
//# sourceMappingURL=trust-summary.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"trust-summary.js","sourceRoot":"","sources":["../../src/tools/trust-summary.ts"],"names":[],"mappings":"AAAA,8CAA8C;AAC9C;;;;;;GAMG;AAQH,MAAM,CAAC,MAAM,gBAAgB,GAAG;IAC9B,IAAI,EAAE,eAAe;IACrB,WAAW,EACT,0LAA0L;IAC5L,WAAW,EAAE;QACX,IAAI,EAAE,QAAiB;QACvB,UAAU,EAAE;YACV,IAAI,EAAE;gBACJ,IAAI,EAAE,QAAQ;gBACd,WAAW,EAAE,wCAAwC;gBACrD,OAAO,EAAE,EAAE;aACZ;SACF;KACF;CACF,CAAC;AAEF,MAAM,UAAU,mBAAmB,CACjC,EAAkB,EAClB,MAA0B;IAE1B,MAAM,KAAK,GAAG,EAAE,CAAC,QAAQ,EAAE,CAAC;IAC5B,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,IAAI,EAAE,CAAC;IAC/B,MAAM,MAAM,GAAG,IAAI,IAAI,OAAO,CAAC;IAE/B,uBAAuB;IACvB,IAAI,MAAM,GAA+C,EAAE,CAAC;IAC5D,IAAI,CAAC;QACH,MAAM,GAAG,KAAK;aACX,OAAO,CACN;;;2BAGmB,CACpB;aACA,GAAG,CAAC,MAAM,CAA+C,CAAC;IAC/D,CAAC;IAAC,MAAM,CAAC;QACP,0CAA0C;IAC5C,CAAC;IAED,MAAM,QAAQ,GAAG,CAAC,IAAY,EAAE,EAAE,CAChC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,UAAU,KAAK,IAAI,CAAC,EAAE,GAAG,IAAI,CAAC,CAAC;IAEtD,MAAM,QAAQ,GAAG,QAAQ,CAAC,UAAU,CAAC,CAAC;IACtC,MAAM,QAAQ,GAAG,QAAQ,CAAC,UAAU,CAAC,CAAC;IACtC,MAAM,SAAS,GAAG,QAAQ,CAAC,WAAW,CAAC,CAAC;IACxC,MAAM,eAAe,GAAG,QAAQ,CAAC,gBAAgB,CAAC,CAAC;IACnD,MAAM,SAAS,GAAG,QAAQ,CAAC,WAAW,CAAC,CAAC;IAExC,MAAM,cAAc,GAAG,QAAQ,GAAG,SAAS,CAAC;IAC5C,MAAM,SAAS,GACb,cAAc,GAAG,eAAe,GAAG,CAAC;QAClC,CAAC,CAAC,cAAc,GAAG,CAAC,cAAc,GAAG,eAAe,CAAC;QACrD,CAAC,CAAC,GAAG,CAAC;IAEV,MAAM,WAAW,GAAG,QAAQ,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC;IAE3D,kBAAkB;IAClB,IAAI,eAAe,GAAG,CAAC,CAAC;IACxB,IAAI,mBAAmB,GAAkB,IAAI,CAAC;IAC9C,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,KAAK;aACjB,OAAO,CACN;;+DAEuD,CACxD;aACA,GAAG,CAAC,MAAM,CAA0D,CAAC;QACxE,IAAI,MAAM,EAAE,CAAC;YACX,eAAe,GAAG,MAAM,CAAC,IAAI,CAAC;YAC9B,mBAAmB,GAAG,MAAM,CAAC,QAAQ,CAAC;QACxC,CAAC;IACH,CAAC;IAAC,MAAM,CAAC;QACP,6BAA6B;IAC/B,CAAC;IAED,OAAO;QACL,WAAW,EAAE,IAAI;QACjB,cAAc,EAAE,QAAQ;QACxB,QAAQ;QACR,SAAS;QACT,eAAe;QACf,SAAS,EAAE,IAAI,CAAC,KAAK,CAAC,SAAS,GAAG,IAAI,CAAC,GAAG,IAAI;QAC9C,sBAAsB,EAAE,IAAI,CAAC,KAAK,CAAC,WAAW,GAAG,IAAI,CAAC,GAAG,IAAI;QAC7D,eAAe;QACf,mBAAmB,EAAE,mBAAmB;YACtC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,mBAAmB,GAAG,EAAE,CAAC,GAAG,EAAE;YAC3C,CAAC,CAAC,IAAI;QACR,sBAAsB,EACpB,SAAS,IAAI,GAAG;YACd,CAAC,CAAC,MAAM;YACR,CAAC,CAAC,SAAS,IAAI,GAAG;gBAChB,CAAC,CAAC,UAAU;gBACZ,CAAC,CAAC,SAAS,IAAI,GAAG;oBAChB,CAAC,CAAC,YAAY;oBACd,CAAC,CAAC,mBAAmB;KAC9B,CAAC;AACJ,CAAC"}
|