@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,124 +0,0 @@
|
|
|
1
|
-
// SPDX-License-Identifier: FSL-1.1-Apache-2.0
|
|
2
|
-
/**
|
|
3
|
-
* preemption_feed tool
|
|
4
|
-
*
|
|
5
|
-
* Returns forward-looking intelligence alerts — what's likely to matter
|
|
6
|
-
* soon based on signal chains, dependency health, and knowledge gaps.
|
|
7
|
-
* Use before starting work to check for upcoming risks.
|
|
8
|
-
*/
|
|
9
|
-
export const preemptionFeedTool = {
|
|
10
|
-
name: "preemption_feed",
|
|
11
|
-
description: "Get forward-looking intelligence alerts about upcoming risks, breaking changes, and ecosystem shifts affecting your stack. Use before dependency updates or when planning work.",
|
|
12
|
-
inputSchema: {
|
|
13
|
-
type: "object",
|
|
14
|
-
properties: {
|
|
15
|
-
urgency_filter: {
|
|
16
|
-
type: "string",
|
|
17
|
-
description: "Filter by minimum urgency: critical, high, medium, watch. Default: all",
|
|
18
|
-
enum: ["critical", "high", "medium", "watch"],
|
|
19
|
-
},
|
|
20
|
-
limit: {
|
|
21
|
-
type: "number",
|
|
22
|
-
description: "Maximum alerts to return. Default: 10",
|
|
23
|
-
default: 10,
|
|
24
|
-
},
|
|
25
|
-
},
|
|
26
|
-
},
|
|
27
|
-
};
|
|
28
|
-
export function executePreemptionFeed(db, params) {
|
|
29
|
-
// Preemption data comes from the Tauri backend (signal chains, project health, etc.)
|
|
30
|
-
// The MCP server reads from the same DB. We synthesize from available tables.
|
|
31
|
-
const rawDb = db.getRawDb();
|
|
32
|
-
const limit = params.limit ?? 10;
|
|
33
|
-
// Get recent signal chains (open, with high confidence)
|
|
34
|
-
let chains = [];
|
|
35
|
-
try {
|
|
36
|
-
// signal_chains might be stored as temporal events
|
|
37
|
-
const rows = rawDb
|
|
38
|
-
.prepare(`SELECT te.id, te.subject, te.data, te.created_at
|
|
39
|
-
FROM temporal_events te
|
|
40
|
-
WHERE te.event_type = 'signal_chain'
|
|
41
|
-
AND te.created_at >= datetime('now', '-14 days')
|
|
42
|
-
ORDER BY te.created_at DESC
|
|
43
|
-
LIMIT ?`)
|
|
44
|
-
.all(limit);
|
|
45
|
-
chains = rows
|
|
46
|
-
.map((r) => {
|
|
47
|
-
try {
|
|
48
|
-
const data = JSON.parse(r.data);
|
|
49
|
-
return {
|
|
50
|
-
id: String(r.id),
|
|
51
|
-
chain_name: r.subject || data.chain_name || "Signal chain",
|
|
52
|
-
overall_priority: data.overall_priority || "medium",
|
|
53
|
-
confidence: data.confidence || 0.5,
|
|
54
|
-
suggested_action: data.suggested_action || "Investigate",
|
|
55
|
-
link_count: data.links?.length || 0,
|
|
56
|
-
};
|
|
57
|
-
}
|
|
58
|
-
catch {
|
|
59
|
-
return null;
|
|
60
|
-
}
|
|
61
|
-
})
|
|
62
|
-
.filter(Boolean);
|
|
63
|
-
}
|
|
64
|
-
catch {
|
|
65
|
-
/* table may not exist */
|
|
66
|
-
}
|
|
67
|
-
// Get critical dependency alerts from project health
|
|
68
|
-
let health_alerts = [];
|
|
69
|
-
try {
|
|
70
|
-
const alerts = rawDb
|
|
71
|
-
.prepare(`SELECT da.package_name, da.alert_type, da.severity, da.message, pd.project_path
|
|
72
|
-
FROM dependency_alerts da
|
|
73
|
-
LEFT JOIN project_dependencies pd ON pd.package_name = da.package_name
|
|
74
|
-
WHERE da.created_at >= datetime('now', '-7 days')
|
|
75
|
-
ORDER BY da.severity DESC
|
|
76
|
-
LIMIT ?`)
|
|
77
|
-
.all(limit);
|
|
78
|
-
health_alerts = alerts.map((a) => ({
|
|
79
|
-
project: a.project_path || "unknown",
|
|
80
|
-
severity: a.severity,
|
|
81
|
-
message: a.message,
|
|
82
|
-
dep: a.package_name,
|
|
83
|
-
}));
|
|
84
|
-
}
|
|
85
|
-
catch {
|
|
86
|
-
/* table may not exist */
|
|
87
|
-
}
|
|
88
|
-
// Get knowledge gaps (blind spots)
|
|
89
|
-
let blind_spots = [];
|
|
90
|
-
try {
|
|
91
|
-
// Find deps with no recent interactions
|
|
92
|
-
const gaps = rawDb
|
|
93
|
-
.prepare(`SELECT ud.name, ud.dep_type,
|
|
94
|
-
COALESCE(
|
|
95
|
-
CAST((julianday('now') - julianday(MAX(i.created_at))) AS INTEGER),
|
|
96
|
-
999
|
|
97
|
-
) as days_since
|
|
98
|
-
FROM user_dependencies ud
|
|
99
|
-
LEFT JOIN interactions i ON LOWER(i.action) LIKE '%' || LOWER(ud.name) || '%'
|
|
100
|
-
GROUP BY ud.name
|
|
101
|
-
HAVING days_since > 14
|
|
102
|
-
ORDER BY days_since DESC
|
|
103
|
-
LIMIT ?`)
|
|
104
|
-
.all(limit);
|
|
105
|
-
blind_spots = gaps.map((g) => ({
|
|
106
|
-
dep: g.name,
|
|
107
|
-
days_stale: g.days_since,
|
|
108
|
-
missed_count: 0,
|
|
109
|
-
}));
|
|
110
|
-
}
|
|
111
|
-
catch {
|
|
112
|
-
/* table may not exist */
|
|
113
|
-
}
|
|
114
|
-
return {
|
|
115
|
-
signal_chains: chains,
|
|
116
|
-
health_alerts,
|
|
117
|
-
blind_spots,
|
|
118
|
-
total_alerts: chains.length + health_alerts.length + blind_spots.length,
|
|
119
|
-
recommendation: chains.length + health_alerts.length > 0
|
|
120
|
-
? "Active risks detected. Review before proceeding with dependency changes."
|
|
121
|
-
: "No urgent risks detected. Safe to proceed.",
|
|
122
|
-
};
|
|
123
|
-
}
|
|
124
|
-
//# sourceMappingURL=preemption-feed.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"preemption-feed.js","sourceRoot":"","sources":["../../src/tools/preemption-feed.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,53 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* project_health tool
|
|
3
|
-
*
|
|
4
|
-
* Get project health summary across all tracked projects.
|
|
5
|
-
*/
|
|
6
|
-
import type { FourDADatabase } from "../db.js";
|
|
7
|
-
export interface ProjectHealthParams {
|
|
8
|
-
project_path?: string;
|
|
9
|
-
}
|
|
10
|
-
export declare const projectHealthTool: {
|
|
11
|
-
name: string;
|
|
12
|
-
description: string;
|
|
13
|
-
inputSchema: {
|
|
14
|
-
type: "object";
|
|
15
|
-
properties: {
|
|
16
|
-
project_path: {
|
|
17
|
-
type: string;
|
|
18
|
-
description: string;
|
|
19
|
-
};
|
|
20
|
-
};
|
|
21
|
-
};
|
|
22
|
-
};
|
|
23
|
-
export declare function executeProjectHealth(db: FourDADatabase, params: ProjectHealthParams): {
|
|
24
|
-
projects: never[];
|
|
25
|
-
total_projects: number;
|
|
26
|
-
summary: string;
|
|
27
|
-
error: string;
|
|
28
|
-
} | {
|
|
29
|
-
projects: {
|
|
30
|
-
project_path: string;
|
|
31
|
-
project_name: string;
|
|
32
|
-
dependency_count: number;
|
|
33
|
-
dependencies: {
|
|
34
|
-
name: string;
|
|
35
|
-
version: string;
|
|
36
|
-
language: string;
|
|
37
|
-
}[];
|
|
38
|
-
health: {
|
|
39
|
-
security_score: number;
|
|
40
|
-
security_issues: number;
|
|
41
|
-
vulnerable_packages: {
|
|
42
|
-
name: string;
|
|
43
|
-
vulnCount: number;
|
|
44
|
-
highestSeverity: string;
|
|
45
|
-
}[] | undefined;
|
|
46
|
-
data_source: string;
|
|
47
|
-
};
|
|
48
|
-
}[];
|
|
49
|
-
total_projects: number;
|
|
50
|
-
summary: string;
|
|
51
|
-
error?: undefined;
|
|
52
|
-
};
|
|
53
|
-
//# sourceMappingURL=project-health.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"project-health.d.ts","sourceRoot":"","sources":["../../src/tools/project-health.ts"],"names":[],"mappings":"AACA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,UAAU,CAAC;AAI/C,MAAM,WAAW,mBAAmB;IAClC,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,eAAO,MAAM,iBAAiB;;;;;;;;;;;;CAY7B,CAAC;AAEF,wBAAgB,oBAAoB,CAClC,EAAE,EAAE,cAAc,EAClB,MAAM,EAAE,mBAAmB;;;;;;;;;;;;;;;;;;;sBAuCW,MAAM;2BAAa,MAAM;iCAAmB,MAAM;;;;;;;;EAsEzF"}
|
|
@@ -1,122 +0,0 @@
|
|
|
1
|
-
// SPDX-License-Identifier: FSL-1.1-Apache-2.0
|
|
2
|
-
/**
|
|
3
|
-
* project_health tool
|
|
4
|
-
*
|
|
5
|
-
* Get project health summary across all tracked projects.
|
|
6
|
-
*/
|
|
7
|
-
import { getLiveIntelligence } from "../live-singleton.js";
|
|
8
|
-
export const projectHealthTool = {
|
|
9
|
-
name: "project_health",
|
|
10
|
-
description: `Get project health radar - dependency freshness, security exposure, ecosystem momentum, and community signals for your tracked projects.`,
|
|
11
|
-
inputSchema: {
|
|
12
|
-
type: "object",
|
|
13
|
-
properties: {
|
|
14
|
-
project_path: {
|
|
15
|
-
type: "string",
|
|
16
|
-
description: "Specific project path to check. Omit for all projects.",
|
|
17
|
-
},
|
|
18
|
-
},
|
|
19
|
-
},
|
|
20
|
-
};
|
|
21
|
-
export function executeProjectHealth(db, params) {
|
|
22
|
-
const rawDb = db.getRawDb();
|
|
23
|
-
// Get all projects with their dependency counts
|
|
24
|
-
let query = `SELECT project_path, COUNT(*) as dep_count,
|
|
25
|
-
GROUP_CONCAT(package_name, ', ') as packages
|
|
26
|
-
FROM project_dependencies`;
|
|
27
|
-
const queryParams = [];
|
|
28
|
-
if (params.project_path) {
|
|
29
|
-
query += " WHERE project_path = ?";
|
|
30
|
-
queryParams.push(params.project_path);
|
|
31
|
-
}
|
|
32
|
-
query += " GROUP BY project_path";
|
|
33
|
-
let projects;
|
|
34
|
-
try {
|
|
35
|
-
projects = rawDb.prepare(query).all(...queryParams);
|
|
36
|
-
}
|
|
37
|
-
catch (e) {
|
|
38
|
-
const msg = e instanceof Error ? e.message : String(e);
|
|
39
|
-
return {
|
|
40
|
-
projects: [],
|
|
41
|
-
total_projects: 0,
|
|
42
|
-
summary: "Project health unavailable — database may need updating",
|
|
43
|
-
error: msg,
|
|
44
|
-
};
|
|
45
|
-
}
|
|
46
|
-
const healthReports = projects.map((proj) => {
|
|
47
|
-
// Get dependencies for this project
|
|
48
|
-
const deps = rawDb
|
|
49
|
-
.prepare("SELECT package_name, version, language, is_dev FROM project_dependencies WHERE project_path = ?")
|
|
50
|
-
.all(proj.project_path);
|
|
51
|
-
// Security: use live OSV data if available, fall back to source_items pattern matching
|
|
52
|
-
let securityIssues = 0;
|
|
53
|
-
const depVulnDetails = [];
|
|
54
|
-
const liveIntel = getLiveIntelligence();
|
|
55
|
-
const vulnResult = liveIntel?.getVulnerabilities();
|
|
56
|
-
if (vulnResult && vulnResult.vulnerabilities.length > 0) {
|
|
57
|
-
// Use real vulnerability data from OSV
|
|
58
|
-
const vulnByPkg = new Map();
|
|
59
|
-
for (const v of vulnResult.vulnerabilities) {
|
|
60
|
-
const existing = vulnByPkg.get(v.package);
|
|
61
|
-
if (!existing) {
|
|
62
|
-
vulnByPkg.set(v.package, { count: 1, severity: v.severity });
|
|
63
|
-
}
|
|
64
|
-
else {
|
|
65
|
-
existing.count++;
|
|
66
|
-
const order = { critical: 4, high: 3, medium: 2, low: 1, unknown: 0 };
|
|
67
|
-
if ((order[v.severity] || 0) > (order[existing.severity] || 0)) {
|
|
68
|
-
existing.severity = v.severity;
|
|
69
|
-
}
|
|
70
|
-
}
|
|
71
|
-
}
|
|
72
|
-
for (const dep of deps) {
|
|
73
|
-
const vuln = vulnByPkg.get(dep.package_name);
|
|
74
|
-
if (vuln) {
|
|
75
|
-
securityIssues++;
|
|
76
|
-
depVulnDetails.push({ name: dep.package_name, vulnCount: vuln.count, highestSeverity: vuln.severity });
|
|
77
|
-
}
|
|
78
|
-
}
|
|
79
|
-
}
|
|
80
|
-
else {
|
|
81
|
-
// Fallback: search source_items for security mentions (only if table has expected columns)
|
|
82
|
-
try {
|
|
83
|
-
for (const dep of deps.slice(0, 20)) {
|
|
84
|
-
const pattern = `%${dep.package_name}%`;
|
|
85
|
-
const securityMentions = rawDb
|
|
86
|
-
.prepare(`SELECT COUNT(*) as cnt FROM source_items
|
|
87
|
-
WHERE (title LIKE ? OR content LIKE ?)
|
|
88
|
-
AND (title LIKE '%CVE%' OR title LIKE '%vulnerability%')`)
|
|
89
|
-
.get(pattern, pattern);
|
|
90
|
-
if (securityMentions && securityMentions.cnt > 0)
|
|
91
|
-
securityIssues++;
|
|
92
|
-
}
|
|
93
|
-
}
|
|
94
|
-
catch {
|
|
95
|
-
// source_items table may not exist or have different schema in standalone
|
|
96
|
-
}
|
|
97
|
-
}
|
|
98
|
-
const securityScore = deps.length > 0 ? 1.0 - securityIssues / deps.length : 1.0;
|
|
99
|
-
return {
|
|
100
|
-
project_path: proj.project_path,
|
|
101
|
-
project_name: proj.project_path.split(/[/\\]/).pop() || proj.project_path,
|
|
102
|
-
dependency_count: proj.dep_count,
|
|
103
|
-
dependencies: deps.slice(0, 20).map((d) => ({
|
|
104
|
-
name: d.package_name,
|
|
105
|
-
version: d.version,
|
|
106
|
-
language: d.language,
|
|
107
|
-
})),
|
|
108
|
-
health: {
|
|
109
|
-
security_score: Math.max(0, securityScore),
|
|
110
|
-
security_issues: securityIssues,
|
|
111
|
-
vulnerable_packages: depVulnDetails.length > 0 ? depVulnDetails : undefined,
|
|
112
|
-
data_source: vulnResult ? "osv.dev" : "source_items",
|
|
113
|
-
},
|
|
114
|
-
};
|
|
115
|
-
});
|
|
116
|
-
return {
|
|
117
|
-
projects: healthReports,
|
|
118
|
-
total_projects: healthReports.length,
|
|
119
|
-
summary: `${healthReports.length} project${healthReports.length !== 1 ? "s" : ""} tracked`,
|
|
120
|
-
};
|
|
121
|
-
}
|
|
122
|
-
//# sourceMappingURL=project-health.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"project-health.js","sourceRoot":"","sources":["../../src/tools/project-health.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,46 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* record_agent_feedback tool
|
|
3
|
-
*
|
|
4
|
-
* Record whether content recommended by 4DA was useful in the agent's task.
|
|
5
|
-
* Feeds into PASIFA scoring system learning.
|
|
6
|
-
*/
|
|
7
|
-
import type { FourDADatabase } from "../db.js";
|
|
8
|
-
import type { RecordAgentFeedbackParams, AgentFeedbackResult } from "../types.js";
|
|
9
|
-
/**
|
|
10
|
-
* Tool definition for MCP registration
|
|
11
|
-
*/
|
|
12
|
-
export declare const recordAgentFeedbackTool: {
|
|
13
|
-
name: string;
|
|
14
|
-
description: string;
|
|
15
|
-
inputSchema: {
|
|
16
|
-
type: "object";
|
|
17
|
-
properties: {
|
|
18
|
-
item_ids: {
|
|
19
|
-
type: string;
|
|
20
|
-
items: {
|
|
21
|
-
type: string;
|
|
22
|
-
};
|
|
23
|
-
description: string;
|
|
24
|
-
};
|
|
25
|
-
outcome: {
|
|
26
|
-
type: string;
|
|
27
|
-
enum: string[];
|
|
28
|
-
description: string;
|
|
29
|
-
};
|
|
30
|
-
context: {
|
|
31
|
-
type: string;
|
|
32
|
-
description: string;
|
|
33
|
-
};
|
|
34
|
-
session_task: {
|
|
35
|
-
type: string;
|
|
36
|
-
description: string;
|
|
37
|
-
};
|
|
38
|
-
};
|
|
39
|
-
required: string[];
|
|
40
|
-
};
|
|
41
|
-
};
|
|
42
|
-
/**
|
|
43
|
-
* Execute the record_agent_feedback tool
|
|
44
|
-
*/
|
|
45
|
-
export declare function executeRecordAgentFeedback(db: FourDADatabase, params: RecordAgentFeedbackParams): AgentFeedbackResult;
|
|
46
|
-
//# sourceMappingURL=record-agent-feedback.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"record-agent-feedback.d.ts","sourceRoot":"","sources":["../../src/tools/record-agent-feedback.ts"],"names":[],"mappings":"AACA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,UAAU,CAAC;AAC/C,OAAO,KAAK,EAAE,yBAAyB,EAAE,mBAAmB,EAAwB,MAAM,aAAa,CAAC;AAExG;;GAEG;AACH,eAAO,MAAM,uBAAuB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAqCnC,CAAC;AAIF;;GAEG;AACH,wBAAgB,0BAA0B,CACxC,EAAE,EAAE,cAAc,EAClB,MAAM,EAAE,yBAAyB,GAChC,mBAAmB,CA0BrB"}
|
|
@@ -1,71 +0,0 @@
|
|
|
1
|
-
// SPDX-License-Identifier: FSL-1.1-Apache-2.0
|
|
2
|
-
/**
|
|
3
|
-
* record_agent_feedback tool
|
|
4
|
-
*
|
|
5
|
-
* Record whether content recommended by 4DA was useful in the agent's task.
|
|
6
|
-
* Feeds into PASIFA scoring system learning.
|
|
7
|
-
*/
|
|
8
|
-
/**
|
|
9
|
-
* Tool definition for MCP registration
|
|
10
|
-
*/
|
|
11
|
-
export const recordAgentFeedbackTool = {
|
|
12
|
-
name: "record_agent_feedback",
|
|
13
|
-
description: `Record whether content recommended by 4DA was useful in the agent's task.
|
|
14
|
-
|
|
15
|
-
Call this after using get_relevant_content results to help 4DA learn what's actually valuable for AI-assisted development.
|
|
16
|
-
|
|
17
|
-
Outcomes:
|
|
18
|
-
- "used": Agent/developer used the recommended content (strong positive signal)
|
|
19
|
-
- "rejected": Content was not useful — outdated, irrelevant, or wrong context (negative signal)
|
|
20
|
-
- "partially_used": Some value extracted but not directly applicable (weak positive signal)
|
|
21
|
-
|
|
22
|
-
This feedback helps 4DA's PASIFA scoring system learn which content sources and topics are genuinely useful when agents recommend them.`,
|
|
23
|
-
inputSchema: {
|
|
24
|
-
type: "object",
|
|
25
|
-
properties: {
|
|
26
|
-
item_ids: {
|
|
27
|
-
type: "array",
|
|
28
|
-
items: { type: "string" },
|
|
29
|
-
description: "Source item IDs that were recommended (from get_relevant_content results)",
|
|
30
|
-
},
|
|
31
|
-
outcome: {
|
|
32
|
-
type: "string",
|
|
33
|
-
enum: ["used", "rejected", "partially_used"],
|
|
34
|
-
description: "Whether the agent/developer used the recommended content",
|
|
35
|
-
},
|
|
36
|
-
context: {
|
|
37
|
-
type: "string",
|
|
38
|
-
description: "Brief context about why (e.g., 'recommended to developer, they found it relevant' or 'content was outdated')",
|
|
39
|
-
},
|
|
40
|
-
session_task: {
|
|
41
|
-
type: "string",
|
|
42
|
-
description: "What task the agent was working on when it used this content",
|
|
43
|
-
},
|
|
44
|
-
},
|
|
45
|
-
required: ["item_ids", "outcome"],
|
|
46
|
-
},
|
|
47
|
-
};
|
|
48
|
-
const validOutcomes = ["used", "rejected", "partially_used"];
|
|
49
|
-
/**
|
|
50
|
-
* Execute the record_agent_feedback tool
|
|
51
|
-
*/
|
|
52
|
-
export function executeRecordAgentFeedback(db, params) {
|
|
53
|
-
if (!params.item_ids || !Array.isArray(params.item_ids) || params.item_ids.length === 0) {
|
|
54
|
-
return {
|
|
55
|
-
success: false,
|
|
56
|
-
message: "item_ids must be a non-empty array of item ID strings",
|
|
57
|
-
recorded_count: 0,
|
|
58
|
-
};
|
|
59
|
-
}
|
|
60
|
-
if (!params.outcome || !validOutcomes.includes(params.outcome)) {
|
|
61
|
-
return {
|
|
62
|
-
success: false,
|
|
63
|
-
message: `Invalid outcome: ${params.outcome}. Valid outcomes: ${validOutcomes.join(", ")}`,
|
|
64
|
-
recorded_count: 0,
|
|
65
|
-
};
|
|
66
|
-
}
|
|
67
|
-
// Normalize item IDs to strings
|
|
68
|
-
const itemIds = params.item_ids.map((id) => String(id));
|
|
69
|
-
return db.recordAgentFeedback(itemIds, params.outcome, params.context, params.session_task);
|
|
70
|
-
}
|
|
71
|
-
//# sourceMappingURL=record-agent-feedback.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"record-agent-feedback.js","sourceRoot":"","sources":["../../src/tools/record-agent-feedback.ts"],"names":[],"mappings":"AAAA,8CAA8C;AAC9C;;;;;GAKG;AAKH;;GAEG;AACH,MAAM,CAAC,MAAM,uBAAuB,GAAG;IACrC,IAAI,EAAE,uBAAuB;IAC7B,WAAW,EAAE;;;;;;;;;wIASyH;IACtI,WAAW,EAAE;QACX,IAAI,EAAE,QAAiB;QACvB,UAAU,EAAE;YACV,QAAQ,EAAE;gBACR,IAAI,EAAE,OAAO;gBACb,KAAK,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;gBACzB,WAAW,EAAE,2EAA2E;aACzF;YACD,OAAO,EAAE;gBACP,IAAI,EAAE,QAAQ;gBACd,IAAI,EAAE,CAAC,MAAM,EAAE,UAAU,EAAE,gBAAgB,CAAC;gBAC5C,WAAW,EAAE,0DAA0D;aACxE;YACD,OAAO,EAAE;gBACP,IAAI,EAAE,QAAQ;gBACd,WAAW,EACT,8GAA8G;aACjH;YACD,YAAY,EAAE;gBACZ,IAAI,EAAE,QAAQ;gBACd,WAAW,EAAE,8DAA8D;aAC5E;SACF;QACD,QAAQ,EAAE,CAAC,UAAU,EAAE,SAAS,CAAC;KAClC;CACF,CAAC;AAEF,MAAM,aAAa,GAA2B,CAAC,MAAM,EAAE,UAAU,EAAE,gBAAgB,CAAC,CAAC;AAErF;;GAEG;AACH,MAAM,UAAU,0BAA0B,CACxC,EAAkB,EAClB,MAAiC;IAEjC,IAAI,CAAC,MAAM,CAAC,QAAQ,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,MAAM,CAAC,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACxF,OAAO;YACL,OAAO,EAAE,KAAK;YACd,OAAO,EAAE,uDAAuD;YAChE,cAAc,EAAE,CAAC;SAClB,CAAC;IACJ,CAAC;IAED,IAAI,CAAC,MAAM,CAAC,OAAO,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,CAAC;QAC/D,OAAO;YACL,OAAO,EAAE,KAAK;YACd,OAAO,EAAE,oBAAoB,MAAM,CAAC,OAAO,qBAAqB,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE;YAC1F,cAAc,EAAE,CAAC;SAClB,CAAC;IACJ,CAAC;IAED,gCAAgC;IAChC,MAAM,OAAO,GAAG,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC;IAExD,OAAO,EAAE,CAAC,mBAAmB,CAC3B,OAAO,EACP,MAAM,CAAC,OAAO,EACd,MAAM,CAAC,OAAO,EACd,MAAM,CAAC,YAAY,CACpB,CAAC;AACJ,CAAC"}
|
|
@@ -1,38 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* reverse_mentions tool
|
|
3
|
-
*
|
|
4
|
-
* Detect when your projects/packages are mentioned in sources.
|
|
5
|
-
*/
|
|
6
|
-
import type { FourDADatabase } from "../db.js";
|
|
7
|
-
export interface ReverseMentionsParams {
|
|
8
|
-
limit?: number;
|
|
9
|
-
}
|
|
10
|
-
export declare const reverseMentionsTool: {
|
|
11
|
-
name: string;
|
|
12
|
-
description: string;
|
|
13
|
-
inputSchema: {
|
|
14
|
-
type: "object";
|
|
15
|
-
properties: {
|
|
16
|
-
limit: {
|
|
17
|
-
type: string;
|
|
18
|
-
description: string;
|
|
19
|
-
default: number;
|
|
20
|
-
};
|
|
21
|
-
};
|
|
22
|
-
};
|
|
23
|
-
};
|
|
24
|
-
export declare function executeReverseMentions(db: FourDADatabase, params: ReverseMentionsParams): {
|
|
25
|
-
mentions: {
|
|
26
|
-
source_item_id: number;
|
|
27
|
-
title: string;
|
|
28
|
-
url: string;
|
|
29
|
-
source_type: string;
|
|
30
|
-
mentioned_project: string;
|
|
31
|
-
mention_context: string;
|
|
32
|
-
discovered_at: string;
|
|
33
|
-
}[];
|
|
34
|
-
total: number;
|
|
35
|
-
tracked_projects: string[];
|
|
36
|
-
summary: string;
|
|
37
|
-
};
|
|
38
|
-
//# sourceMappingURL=reverse-mentions.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"reverse-mentions.d.ts","sourceRoot":"","sources":["../../src/tools/reverse-mentions.ts"],"names":[],"mappings":"AACA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,UAAU,CAAC;AAG/C,MAAM,WAAW,qBAAqB;IACpC,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,eAAO,MAAM,mBAAmB;;;;;;;;;;;;;CAa/B,CAAC;AAEF,wBAAgB,sBAAsB,CACpC,EAAE,EAAE,cAAc,EAClB,MAAM,EAAE,qBAAqB;;;;;;;;;;;;;EA0D9B"}
|
|
@@ -1,75 +0,0 @@
|
|
|
1
|
-
// SPDX-License-Identifier: FSL-1.1-Apache-2.0
|
|
2
|
-
/**
|
|
3
|
-
* reverse_mentions tool
|
|
4
|
-
*
|
|
5
|
-
* Detect when your projects/packages are mentioned in sources.
|
|
6
|
-
*/
|
|
7
|
-
export const reverseMentionsTool = {
|
|
8
|
-
name: "reverse_mentions",
|
|
9
|
-
description: `Detect when your projects or packages are mentioned in sources. Finds discussions about your work in HN, Reddit, etc.`,
|
|
10
|
-
inputSchema: {
|
|
11
|
-
type: "object",
|
|
12
|
-
properties: {
|
|
13
|
-
limit: {
|
|
14
|
-
type: "number",
|
|
15
|
-
description: "Maximum mentions to return. Default: 20",
|
|
16
|
-
default: 20,
|
|
17
|
-
},
|
|
18
|
-
},
|
|
19
|
-
},
|
|
20
|
-
};
|
|
21
|
-
export function executeReverseMentions(db, params) {
|
|
22
|
-
const rawDb = db.getRawDb();
|
|
23
|
-
const limit = params.limit || 20;
|
|
24
|
-
// Get project identifiers from item_relationships
|
|
25
|
-
let mentions = [];
|
|
26
|
-
try {
|
|
27
|
-
mentions = rawDb
|
|
28
|
-
.prepare(`SELECT ir.source_item_id, ir.related_item_id, ir.metadata, ir.created_at,
|
|
29
|
-
si.title, si.url, si.source_type
|
|
30
|
-
FROM item_relationships ir
|
|
31
|
-
JOIN source_items si ON ir.source_item_id = si.id
|
|
32
|
-
WHERE ir.relationship_type = 'mentions_project'
|
|
33
|
-
ORDER BY ir.created_at DESC
|
|
34
|
-
LIMIT ?`)
|
|
35
|
-
.all(limit);
|
|
36
|
-
}
|
|
37
|
-
catch {
|
|
38
|
-
return {
|
|
39
|
-
mentions: [],
|
|
40
|
-
total: 0,
|
|
41
|
-
tracked_projects: [],
|
|
42
|
-
summary: "Reverse mentions unavailable — item_relationships table not present in this database.",
|
|
43
|
-
};
|
|
44
|
-
}
|
|
45
|
-
const results = mentions.map((m) => {
|
|
46
|
-
const metadata = m.metadata ? JSON.parse(m.metadata) : {};
|
|
47
|
-
return {
|
|
48
|
-
source_item_id: m.source_item_id,
|
|
49
|
-
title: m.title,
|
|
50
|
-
url: m.url,
|
|
51
|
-
source_type: m.source_type,
|
|
52
|
-
mentioned_project: metadata.project_name || "unknown",
|
|
53
|
-
mention_context: metadata.context || "",
|
|
54
|
-
discovered_at: m.created_at,
|
|
55
|
-
};
|
|
56
|
-
});
|
|
57
|
-
// Also check for mentions via text search of project names from dependencies
|
|
58
|
-
let projectNames = [];
|
|
59
|
-
try {
|
|
60
|
-
projectNames = rawDb
|
|
61
|
-
.prepare("SELECT DISTINCT package_name FROM project_dependencies LIMIT 10")
|
|
62
|
-
.all()
|
|
63
|
-
.map((r) => r.package_name);
|
|
64
|
-
}
|
|
65
|
-
catch {
|
|
66
|
-
// project_dependencies table not present
|
|
67
|
-
}
|
|
68
|
-
return {
|
|
69
|
-
mentions: results,
|
|
70
|
-
total: results.length,
|
|
71
|
-
tracked_projects: projectNames,
|
|
72
|
-
summary: `${results.length} mention${results.length !== 1 ? "s" : ""} found across ${projectNames.length} tracked projects`,
|
|
73
|
-
};
|
|
74
|
-
}
|
|
75
|
-
//# sourceMappingURL=reverse-mentions.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"reverse-mentions.js","sourceRoot":"","sources":["../../src/tools/reverse-mentions.ts"],"names":[],"mappings":"AAAA,8CAA8C;AAC9C;;;;GAIG;AASH,MAAM,CAAC,MAAM,mBAAmB,GAAG;IACjC,IAAI,EAAE,kBAAkB;IACxB,WAAW,EAAE,uHAAuH;IACpI,WAAW,EAAE;QACX,IAAI,EAAE,QAAiB;QACvB,UAAU,EAAE;YACV,KAAK,EAAE;gBACL,IAAI,EAAE,QAAQ;gBACd,WAAW,EAAE,yCAAyC;gBACtD,OAAO,EAAE,EAAE;aACZ;SACF;KACF;CACF,CAAC;AAEF,MAAM,UAAU,sBAAsB,CACpC,EAAkB,EAClB,MAA6B;IAE7B,MAAM,KAAK,GAAG,EAAE,CAAC,QAAQ,EAAE,CAAC;IAC5B,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,IAAI,EAAE,CAAC;IAEjC,kDAAkD;IAClD,IAAI,QAAQ,GAAiB,EAAE,CAAC;IAChC,IAAI,CAAC;QACH,QAAQ,GAAG,KAAK;aACb,OAAO,CACN;;;;;;iBAMS,CACV;aACA,GAAG,CAAC,KAAK,CAAiB,CAAC;IAChC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO;YACL,QAAQ,EAAE,EAAE;YACZ,KAAK,EAAE,CAAC;YACR,gBAAgB,EAAE,EAAE;YACpB,OAAO,EAAE,uFAAuF;SACjG,CAAC;IACJ,CAAC;IAED,MAAM,OAAO,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE;QACjC,MAAM,QAAQ,GAAgD,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;QACvG,OAAO;YACL,cAAc,EAAE,CAAC,CAAC,cAAc;YAChC,KAAK,EAAE,CAAC,CAAC,KAAK;YACd,GAAG,EAAE,CAAC,CAAC,GAAG;YACV,WAAW,EAAE,CAAC,CAAC,WAAW;YAC1B,iBAAiB,EAAE,QAAQ,CAAC,YAAY,IAAI,SAAS;YACrD,eAAe,EAAE,QAAQ,CAAC,OAAO,IAAI,EAAE;YACvC,aAAa,EAAE,CAAC,CAAC,UAAU;SAC5B,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,6EAA6E;IAC7E,IAAI,YAAY,GAAa,EAAE,CAAC;IAChC,IAAI,CAAC;QACH,YAAY,GAAI,KAAK;aAClB,OAAO,CAAC,iEAAiE,CAAC;aAC1E,GAAG,EAAuB;aAC1B,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC;IAChC,CAAC;IAAC,MAAM,CAAC;QACP,yCAAyC;IAC3C,CAAC;IAED,OAAO;QACL,QAAQ,EAAE,OAAO;QACjB,KAAK,EAAE,OAAO,CAAC,MAAM;QACrB,gBAAgB,EAAE,YAAY;QAC9B,OAAO,EAAE,GAAG,OAAO,CAAC,MAAM,WAAW,OAAO,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,iBAAiB,YAAY,CAAC,MAAM,mBAAmB;KAC5H,CAAC;AACJ,CAAC"}
|
|
@@ -1,93 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Score Autopsy Tool
|
|
3
|
-
*
|
|
4
|
-
* Deep forensic analysis of why content scored the way it did.
|
|
5
|
-
* This is a SUPERPOWER - it reveals the complete scoring breakdown.
|
|
6
|
-
*
|
|
7
|
-
* With synthesize=true, uses LLM to explain whether the score makes sense.
|
|
8
|
-
*/
|
|
9
|
-
import type { FourDADatabase } from "../db.js";
|
|
10
|
-
import { type CompactResult, type ScoreAutopsyKeyData } from "../output-manager.js";
|
|
11
|
-
export declare const scoreAutopsyTool: {
|
|
12
|
-
name: string;
|
|
13
|
-
description: string;
|
|
14
|
-
inputSchema: {
|
|
15
|
-
type: string;
|
|
16
|
-
properties: {
|
|
17
|
-
item_id: {
|
|
18
|
-
type: string;
|
|
19
|
-
description: string;
|
|
20
|
-
};
|
|
21
|
-
source_type: {
|
|
22
|
-
type: string;
|
|
23
|
-
description: string;
|
|
24
|
-
};
|
|
25
|
-
compare_count: {
|
|
26
|
-
type: string;
|
|
27
|
-
description: string;
|
|
28
|
-
};
|
|
29
|
-
synthesize: {
|
|
30
|
-
type: string;
|
|
31
|
-
description: string;
|
|
32
|
-
};
|
|
33
|
-
compact: {
|
|
34
|
-
type: string;
|
|
35
|
-
description: string;
|
|
36
|
-
};
|
|
37
|
-
};
|
|
38
|
-
required: string[];
|
|
39
|
-
};
|
|
40
|
-
};
|
|
41
|
-
export interface ScoreAutopsyParams {
|
|
42
|
-
item_id: number;
|
|
43
|
-
source_type: string;
|
|
44
|
-
compare_count?: number;
|
|
45
|
-
synthesize?: boolean;
|
|
46
|
-
compact?: boolean;
|
|
47
|
-
}
|
|
48
|
-
interface ScoreComponent {
|
|
49
|
-
name: string;
|
|
50
|
-
raw_value: number;
|
|
51
|
-
weight: number;
|
|
52
|
-
contribution: number;
|
|
53
|
-
explanation: string;
|
|
54
|
-
}
|
|
55
|
-
interface SimilarItem {
|
|
56
|
-
id: number;
|
|
57
|
-
title: string;
|
|
58
|
-
score: number;
|
|
59
|
-
score_difference: number;
|
|
60
|
-
key_difference: string;
|
|
61
|
-
}
|
|
62
|
-
interface AutopsyResult {
|
|
63
|
-
item: {
|
|
64
|
-
id: number;
|
|
65
|
-
title: string;
|
|
66
|
-
url: string | null;
|
|
67
|
-
source_type: string;
|
|
68
|
-
created_at: string;
|
|
69
|
-
age_hours: number;
|
|
70
|
-
};
|
|
71
|
-
final_score: number;
|
|
72
|
-
components: ScoreComponent[];
|
|
73
|
-
matching_context: {
|
|
74
|
-
interests: string[];
|
|
75
|
-
tech_stack: string[];
|
|
76
|
-
active_topics: string[];
|
|
77
|
-
learned_affinities: string[];
|
|
78
|
-
exclusions_hit: string[];
|
|
79
|
-
};
|
|
80
|
-
similar_items: SimilarItem[];
|
|
81
|
-
recommendations: string[];
|
|
82
|
-
narrative: string;
|
|
83
|
-
ai_analysis?: {
|
|
84
|
-
verdict: string;
|
|
85
|
-
score_assessment: "accurate" | "too_high" | "too_low" | "uncertain";
|
|
86
|
-
reasoning: string;
|
|
87
|
-
suggested_action: string;
|
|
88
|
-
model_used: string;
|
|
89
|
-
};
|
|
90
|
-
}
|
|
91
|
-
export declare function executeScoreAutopsy(db: FourDADatabase, params: ScoreAutopsyParams): Promise<AutopsyResult | CompactResult<ScoreAutopsyKeyData>>;
|
|
92
|
-
export {};
|
|
93
|
-
//# sourceMappingURL=score-autopsy.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"score-autopsy.d.ts","sourceRoot":"","sources":["../../src/tools/score-autopsy.ts"],"names":[],"mappings":"AACA;;;;;;;GAOG;AAEH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,UAAU,CAAC;AAE/C,OAAO,EAA6B,KAAK,aAAa,EAAE,KAAK,mBAAmB,EAAE,MAAM,sBAAsB,CAAC;AAE/G,eAAO,MAAM,gBAAgB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAwC5B,CAAC;AAEF,MAAM,WAAW,kBAAkB;IACjC,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,EAAE,MAAM,CAAC;IACpB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAED,UAAU,cAAc;IACtB,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;IACf,YAAY,EAAE,MAAM,CAAC;IACrB,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,UAAU,WAAW;IACnB,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,gBAAgB,EAAE,MAAM,CAAC;IACzB,cAAc,EAAE,MAAM,CAAC;CACxB;AAED,UAAU,aAAa;IACrB,IAAI,EAAE;QACJ,EAAE,EAAE,MAAM,CAAC;QACX,KAAK,EAAE,MAAM,CAAC;QACd,GAAG,EAAE,MAAM,GAAG,IAAI,CAAC;QACnB,WAAW,EAAE,MAAM,CAAC;QACpB,UAAU,EAAE,MAAM,CAAC;QACnB,SAAS,EAAE,MAAM,CAAC;KACnB,CAAC;IACF,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,EAAE,cAAc,EAAE,CAAC;IAC7B,gBAAgB,EAAE;QAChB,SAAS,EAAE,MAAM,EAAE,CAAC;QACpB,UAAU,EAAE,MAAM,EAAE,CAAC;QACrB,aAAa,EAAE,MAAM,EAAE,CAAC;QACxB,kBAAkB,EAAE,MAAM,EAAE,CAAC;QAC7B,cAAc,EAAE,MAAM,EAAE,CAAC;KAC1B,CAAC;IACF,aAAa,EAAE,WAAW,EAAE,CAAC;IAC7B,eAAe,EAAE,MAAM,EAAE,CAAC;IAC1B,SAAS,EAAE,MAAM,CAAC;IAElB,WAAW,CAAC,EAAE;QACZ,OAAO,EAAE,MAAM,CAAC;QAChB,gBAAgB,EAAE,UAAU,GAAG,UAAU,GAAG,SAAS,GAAG,WAAW,CAAC;QACpE,SAAS,EAAE,MAAM,CAAC;QAClB,gBAAgB,EAAE,MAAM,CAAC;QACzB,UAAU,EAAE,MAAM,CAAC;KACpB,CAAC;CACH;AAED,wBAAsB,mBAAmB,CACvC,EAAE,EAAE,cAAc,EAClB,MAAM,EAAE,kBAAkB,GACzB,OAAO,CAAC,aAAa,GAAG,aAAa,CAAC,mBAAmB,CAAC,CAAC,CA4L7D"}
|