@neurynae/toolcairn-mcp 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/bin/toolpilot-mcp.js +5 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +45 -0
- package/dist/index.js.map +1 -0
- package/dist/middleware/event-logger.d.ts +19 -0
- package/dist/middleware/event-logger.d.ts.map +1 -0
- package/dist/middleware/event-logger.js +138 -0
- package/dist/middleware/event-logger.js.map +1 -0
- package/dist/schemas.d.ts +2 -0
- package/dist/schemas.d.ts.map +1 -0
- package/dist/schemas.js +3 -0
- package/dist/schemas.js.map +1 -0
- package/dist/server.d.ts +3 -0
- package/dist/server.d.ts.map +1 -0
- package/dist/server.js +116 -0
- package/dist/server.js.map +1 -0
- package/dist/server.prod.d.ts +14 -0
- package/dist/server.prod.d.ts.map +1 -0
- package/dist/server.prod.js +127 -0
- package/dist/server.prod.js.map +1 -0
- package/dist/templates/agent-instructions.d.ts +22 -0
- package/dist/templates/agent-instructions.d.ts.map +1 -0
- package/dist/templates/agent-instructions.js +155 -0
- package/dist/templates/agent-instructions.js.map +1 -0
- package/dist/tools/check-compatibility.d.ts +100 -0
- package/dist/tools/check-compatibility.d.ts.map +1 -0
- package/dist/tools/check-compatibility.js +103 -0
- package/dist/tools/check-compatibility.js.map +1 -0
- package/dist/tools/check-issue.d.ts +126 -0
- package/dist/tools/check-issue.d.ts.map +1 -0
- package/dist/tools/check-issue.js +248 -0
- package/dist/tools/check-issue.js.map +1 -0
- package/dist/tools/classify-prompt.d.ts +101 -0
- package/dist/tools/classify-prompt.d.ts.map +1 -0
- package/dist/tools/classify-prompt.js +64 -0
- package/dist/tools/classify-prompt.js.map +1 -0
- package/dist/tools/compare-tools.d.ts +102 -0
- package/dist/tools/compare-tools.d.ts.map +1 -0
- package/dist/tools/compare-tools.js +178 -0
- package/dist/tools/compare-tools.js.map +1 -0
- package/dist/tools/format-results.d.ts +44 -0
- package/dist/tools/format-results.d.ts.map +1 -0
- package/dist/tools/format-results.js +114 -0
- package/dist/tools/format-results.js.map +1 -0
- package/dist/tools/generate-tracker.d.ts +7 -0
- package/dist/tools/generate-tracker.d.ts.map +1 -0
- package/dist/tools/generate-tracker.js +408 -0
- package/dist/tools/generate-tracker.js.map +1 -0
- package/dist/tools/get-stack.d.ts +105 -0
- package/dist/tools/get-stack.d.ts.map +1 -0
- package/dist/tools/get-stack.js +156 -0
- package/dist/tools/get-stack.js.map +1 -0
- package/dist/tools/init-project-config.d.ts +107 -0
- package/dist/tools/init-project-config.d.ts.map +1 -0
- package/dist/tools/init-project-config.js +52 -0
- package/dist/tools/init-project-config.js.map +1 -0
- package/dist/tools/read-project-config.d.ts +99 -0
- package/dist/tools/read-project-config.d.ts.map +1 -0
- package/dist/tools/read-project-config.js +78 -0
- package/dist/tools/read-project-config.js.map +1 -0
- package/dist/tools/refine-requirement.d.ts +105 -0
- package/dist/tools/refine-requirement.d.ts.map +1 -0
- package/dist/tools/refine-requirement.js +77 -0
- package/dist/tools/refine-requirement.js.map +1 -0
- package/dist/tools/report-outcome.d.ts +104 -0
- package/dist/tools/report-outcome.d.ts.map +1 -0
- package/dist/tools/report-outcome.js +108 -0
- package/dist/tools/report-outcome.js.map +1 -0
- package/dist/tools/search-tools-respond.d.ts +103 -0
- package/dist/tools/search-tools-respond.d.ts.map +1 -0
- package/dist/tools/search-tools-respond.js +91 -0
- package/dist/tools/search-tools-respond.js.map +1 -0
- package/dist/tools/search-tools.d.ts +104 -0
- package/dist/tools/search-tools.d.ts.map +1 -0
- package/dist/tools/search-tools.js +77 -0
- package/dist/tools/search-tools.js.map +1 -0
- package/dist/tools/suggest-graph-update.d.ts +117 -0
- package/dist/tools/suggest-graph-update.d.ts.map +1 -0
- package/dist/tools/suggest-graph-update.js +177 -0
- package/dist/tools/suggest-graph-update.js.map +1 -0
- package/dist/tools/toolpilot-init.d.ts +103 -0
- package/dist/tools/toolpilot-init.d.ts.map +1 -0
- package/dist/tools/toolpilot-init.js +115 -0
- package/dist/tools/toolpilot-init.js.map +1 -0
- package/dist/tools/update-project-config.d.ts +104 -0
- package/dist/tools/update-project-config.d.ts.map +1 -0
- package/dist/tools/update-project-config.js +117 -0
- package/dist/tools/update-project-config.js.map +1 -0
- package/dist/tools/verify-suggestion.d.ts +113 -0
- package/dist/tools/verify-suggestion.d.ts.map +1 -0
- package/dist/tools/verify-suggestion.js +223 -0
- package/dist/tools/verify-suggestion.js.map +1 -0
- package/dist/transport.d.ts +5 -0
- package/dist/transport.d.ts.map +1 -0
- package/dist/transport.js +13 -0
- package/dist/transport.js.map +1 -0
- package/dist/utils.d.ts +4 -0
- package/dist/utils.d.ts.map +1 -0
- package/dist/utils.js +12 -0
- package/dist/utils.js.map +1 -0
- package/package.json +54 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"report-outcome.d.ts","sourceRoot":"","sources":["../../src/tools/report-outcome.ts"],"names":[],"mappings":"AAwEA,wBAAsB,mBAAmB,CAAC,IAAI,EAAE;IAC9C,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,SAAS,GAAG,SAAS,GAAG,UAAU,GAAG,SAAS,CAAC;IACxD,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA0DA"}
|
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
import { PrismaClient } from '@toolpilot/db';
|
|
2
|
+
import { MemgraphToolRepository, buildDecrementEdgeWeightQuery, buildIncrementEdgeWeightQuery, getMemgraphSession, } from '@toolpilot/graph';
|
|
3
|
+
import { enqueueIndexJob } from '@toolpilot/queue';
|
|
4
|
+
import pino from 'pino';
|
|
5
|
+
import { errResult, okResult } from '../utils.js';
|
|
6
|
+
const logger = pino({ name: '@toolpilot/mcp-server:report-outcome' });
|
|
7
|
+
const prisma = new PrismaClient();
|
|
8
|
+
const repo = new MemgraphToolRepository();
|
|
9
|
+
// How much to shift edge weights per outcome report
|
|
10
|
+
const WEIGHT_DELTA_SUCCESS = 0.05;
|
|
11
|
+
const WEIGHT_DELTA_FAILURE = 0.05;
|
|
12
|
+
async function adjustSolvesEdge(toolName, delta, direction) {
|
|
13
|
+
// Find the tool in Memgraph to get its ID
|
|
14
|
+
const toolResult = await repo.findByName(toolName);
|
|
15
|
+
if (!toolResult.ok || !toolResult.data)
|
|
16
|
+
return;
|
|
17
|
+
const edgeType = 'SOLVES';
|
|
18
|
+
const session = getMemgraphSession();
|
|
19
|
+
try {
|
|
20
|
+
const { text, parameters } = direction === 'up'
|
|
21
|
+
? buildIncrementEdgeWeightQuery(edgeType, delta)
|
|
22
|
+
: buildDecrementEdgeWeightQuery(edgeType, delta);
|
|
23
|
+
// Run with both tool name variants (it solves some use case)
|
|
24
|
+
await session.run(text, {
|
|
25
|
+
...parameters,
|
|
26
|
+
name_a: toolName,
|
|
27
|
+
name_b: toolName, // SOLVES edges go tool→usecase; we adjust any outgoing SOLVES
|
|
28
|
+
});
|
|
29
|
+
}
|
|
30
|
+
catch (e) {
|
|
31
|
+
logger.warn({ err: e, tool: toolName }, 'Failed to adjust SOLVES edge weight');
|
|
32
|
+
}
|
|
33
|
+
finally {
|
|
34
|
+
await session.close();
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
async function stageReplacesEdge(oldTool, newTool, queryId) {
|
|
38
|
+
try {
|
|
39
|
+
await prisma.stagedEdge.create({
|
|
40
|
+
data: {
|
|
41
|
+
edge_type: 'REPLACES',
|
|
42
|
+
source_node_id: newTool,
|
|
43
|
+
target_node_id: oldTool,
|
|
44
|
+
edge_data: {
|
|
45
|
+
evidence: `User replaced ${oldTool} with ${newTool} in session ${queryId}`,
|
|
46
|
+
confidence: 0.6,
|
|
47
|
+
},
|
|
48
|
+
confidence: 0.6,
|
|
49
|
+
source: 'usage_data',
|
|
50
|
+
supporting_queries: [queryId],
|
|
51
|
+
},
|
|
52
|
+
});
|
|
53
|
+
logger.info({ old: oldTool, new: newTool }, 'REPLACES edge staged');
|
|
54
|
+
}
|
|
55
|
+
catch (e) {
|
|
56
|
+
logger.warn({ err: e }, 'Failed to stage REPLACES edge');
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
export async function handleReportOutcome(args) {
|
|
60
|
+
try {
|
|
61
|
+
await prisma.outcomeReport.create({
|
|
62
|
+
data: {
|
|
63
|
+
query_id: args.query_id,
|
|
64
|
+
chosen_tool: args.chosen_tool,
|
|
65
|
+
reason: args.reason,
|
|
66
|
+
outcome: args.outcome,
|
|
67
|
+
feedback: args.feedback,
|
|
68
|
+
},
|
|
69
|
+
});
|
|
70
|
+
const graphActions = [];
|
|
71
|
+
if (args.outcome === 'success') {
|
|
72
|
+
// Strengthen SOLVES edges asynchronously — never block the response
|
|
73
|
+
adjustSolvesEdge(args.chosen_tool, WEIGHT_DELTA_SUCCESS, 'up').catch((e) => {
|
|
74
|
+
logger.warn({ err: e }, 'Background edge weight update failed');
|
|
75
|
+
});
|
|
76
|
+
graphActions.push(`SOLVES weight +${WEIGHT_DELTA_SUCCESS} for ${args.chosen_tool}`);
|
|
77
|
+
}
|
|
78
|
+
if (args.outcome === 'failure') {
|
|
79
|
+
// Weaken edges + trigger re-index to refresh health signals
|
|
80
|
+
adjustSolvesEdge(args.chosen_tool, WEIGHT_DELTA_FAILURE, 'down').catch((e) => {
|
|
81
|
+
logger.warn({ err: e }, 'Background edge weight update failed');
|
|
82
|
+
});
|
|
83
|
+
const result = await enqueueIndexJob(args.chosen_tool, 1);
|
|
84
|
+
if (!result.ok) {
|
|
85
|
+
logger.warn({ tool: args.chosen_tool, err: result.error }, 'Failed to enqueue re-index');
|
|
86
|
+
}
|
|
87
|
+
graphActions.push(`SOLVES weight -${WEIGHT_DELTA_FAILURE} for ${args.chosen_tool}`, 're-index queued');
|
|
88
|
+
}
|
|
89
|
+
if (args.outcome === 'replaced' && args.replaced_by) {
|
|
90
|
+
// Stage a REPLACES edge between the new tool and the old one
|
|
91
|
+
stageReplacesEdge(args.chosen_tool, args.replaced_by, args.query_id).catch((e) => {
|
|
92
|
+
logger.warn({ err: e }, 'Background REPLACES staging failed');
|
|
93
|
+
});
|
|
94
|
+
graphActions.push(`REPLACES edge staged: ${args.replaced_by} → ${args.chosen_tool}`);
|
|
95
|
+
}
|
|
96
|
+
logger.info({ query_id: args.query_id, outcome: args.outcome, graphActions }, 'Outcome recorded');
|
|
97
|
+
return okResult({
|
|
98
|
+
recorded: true,
|
|
99
|
+
outcome: args.outcome,
|
|
100
|
+
graph_actions: graphActions,
|
|
101
|
+
});
|
|
102
|
+
}
|
|
103
|
+
catch (e) {
|
|
104
|
+
logger.error({ err: e, query_id: args.query_id }, 'Failed to record outcome');
|
|
105
|
+
return errResult('storage_error', e instanceof Error ? e.message : String(e));
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
//# sourceMappingURL=report-outcome.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"report-outcome.js","sourceRoot":"","sources":["../../src/tools/report-outcome.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
export declare function handleSearchToolsRespond(args: {
|
|
2
|
+
query_id: string;
|
|
3
|
+
answers: Array<{
|
|
4
|
+
dimension: string;
|
|
5
|
+
value: string;
|
|
6
|
+
}>;
|
|
7
|
+
}): Promise<{
|
|
8
|
+
[x: string]: unknown;
|
|
9
|
+
content: ({
|
|
10
|
+
type: "text";
|
|
11
|
+
text: string;
|
|
12
|
+
annotations?: {
|
|
13
|
+
audience?: ("user" | "assistant")[] | undefined;
|
|
14
|
+
priority?: number | undefined;
|
|
15
|
+
lastModified?: string | undefined;
|
|
16
|
+
} | undefined;
|
|
17
|
+
_meta?: {
|
|
18
|
+
[x: string]: unknown;
|
|
19
|
+
} | undefined;
|
|
20
|
+
} | {
|
|
21
|
+
type: "image";
|
|
22
|
+
data: string;
|
|
23
|
+
mimeType: string;
|
|
24
|
+
annotations?: {
|
|
25
|
+
audience?: ("user" | "assistant")[] | undefined;
|
|
26
|
+
priority?: number | undefined;
|
|
27
|
+
lastModified?: string | undefined;
|
|
28
|
+
} | undefined;
|
|
29
|
+
_meta?: {
|
|
30
|
+
[x: string]: unknown;
|
|
31
|
+
} | undefined;
|
|
32
|
+
} | {
|
|
33
|
+
type: "audio";
|
|
34
|
+
data: string;
|
|
35
|
+
mimeType: string;
|
|
36
|
+
annotations?: {
|
|
37
|
+
audience?: ("user" | "assistant")[] | undefined;
|
|
38
|
+
priority?: number | undefined;
|
|
39
|
+
lastModified?: string | undefined;
|
|
40
|
+
} | undefined;
|
|
41
|
+
_meta?: {
|
|
42
|
+
[x: string]: unknown;
|
|
43
|
+
} | undefined;
|
|
44
|
+
} | {
|
|
45
|
+
uri: string;
|
|
46
|
+
name: string;
|
|
47
|
+
type: "resource_link";
|
|
48
|
+
description?: string | undefined;
|
|
49
|
+
mimeType?: string | undefined;
|
|
50
|
+
annotations?: {
|
|
51
|
+
audience?: ("user" | "assistant")[] | undefined;
|
|
52
|
+
priority?: number | undefined;
|
|
53
|
+
lastModified?: string | undefined;
|
|
54
|
+
} | undefined;
|
|
55
|
+
_meta?: {
|
|
56
|
+
[x: string]: unknown;
|
|
57
|
+
} | undefined;
|
|
58
|
+
icons?: {
|
|
59
|
+
src: string;
|
|
60
|
+
mimeType?: string | undefined;
|
|
61
|
+
sizes?: string[] | undefined;
|
|
62
|
+
theme?: "light" | "dark" | undefined;
|
|
63
|
+
}[] | undefined;
|
|
64
|
+
title?: string | undefined;
|
|
65
|
+
} | {
|
|
66
|
+
type: "resource";
|
|
67
|
+
resource: {
|
|
68
|
+
uri: string;
|
|
69
|
+
text: string;
|
|
70
|
+
mimeType?: string | undefined;
|
|
71
|
+
_meta?: {
|
|
72
|
+
[x: string]: unknown;
|
|
73
|
+
} | undefined;
|
|
74
|
+
} | {
|
|
75
|
+
uri: string;
|
|
76
|
+
blob: string;
|
|
77
|
+
mimeType?: string | undefined;
|
|
78
|
+
_meta?: {
|
|
79
|
+
[x: string]: unknown;
|
|
80
|
+
} | undefined;
|
|
81
|
+
};
|
|
82
|
+
annotations?: {
|
|
83
|
+
audience?: ("user" | "assistant")[] | undefined;
|
|
84
|
+
priority?: number | undefined;
|
|
85
|
+
lastModified?: string | undefined;
|
|
86
|
+
} | undefined;
|
|
87
|
+
_meta?: {
|
|
88
|
+
[x: string]: unknown;
|
|
89
|
+
} | undefined;
|
|
90
|
+
})[];
|
|
91
|
+
_meta?: {
|
|
92
|
+
[x: string]: unknown;
|
|
93
|
+
progressToken?: string | number | undefined;
|
|
94
|
+
"io.modelcontextprotocol/related-task"?: {
|
|
95
|
+
taskId: string;
|
|
96
|
+
} | undefined;
|
|
97
|
+
} | undefined;
|
|
98
|
+
structuredContent?: {
|
|
99
|
+
[x: string]: unknown;
|
|
100
|
+
} | undefined;
|
|
101
|
+
isError?: boolean | undefined;
|
|
102
|
+
}>;
|
|
103
|
+
//# sourceMappingURL=search-tools-respond.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"search-tools-respond.d.ts","sourceRoot":"","sources":["../../src/tools/search-tools-respond.ts"],"names":[],"mappings":"AAgBA,wBAAsB,wBAAwB,CAAC,IAAI,EAAE;IACnD,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,KAAK,CAAC;QAAE,SAAS,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CACtD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8GA"}
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
import { PrismaClient } from '@toolpilot/db';
|
|
2
|
+
import { ClarificationEngine, SearchPipeline, SearchSessionManager } from '@toolpilot/search';
|
|
3
|
+
import pino from 'pino';
|
|
4
|
+
import { errResult, okResult } from '../utils.js';
|
|
5
|
+
import { buildLowCredibilityWarning, buildNonIndexedGuidance, formatResults, } from './format-results.js';
|
|
6
|
+
const logger = pino({ name: '@toolpilot/mcp-server:search-tools-respond' });
|
|
7
|
+
const prisma = new PrismaClient();
|
|
8
|
+
const sessionManager = new SearchSessionManager(prisma);
|
|
9
|
+
const pipeline = new SearchPipeline(sessionManager);
|
|
10
|
+
const clarificationEngine = new ClarificationEngine();
|
|
11
|
+
export async function handleSearchToolsRespond(args) {
|
|
12
|
+
try {
|
|
13
|
+
const session = await sessionManager.getSession(args.query_id);
|
|
14
|
+
if (!session) {
|
|
15
|
+
return errResult('session_not_found', `No session found for query_id: ${args.query_id}`);
|
|
16
|
+
}
|
|
17
|
+
logger.info({ sessionId: args.query_id, answerCount: args.answers.length }, 'search_tools_respond called');
|
|
18
|
+
// Load saved Stage 1 candidates
|
|
19
|
+
const candidateIds = await sessionManager.getCandidates(args.query_id);
|
|
20
|
+
if (candidateIds.length === 0) {
|
|
21
|
+
return errResult('no_candidates', 'No saved candidates for this session. Call search_tools first.');
|
|
22
|
+
}
|
|
23
|
+
// Build updated context from clarification answers
|
|
24
|
+
const filterUpdates = {};
|
|
25
|
+
for (const answer of args.answers) {
|
|
26
|
+
filterUpdates[answer.dimension] = answer.value;
|
|
27
|
+
}
|
|
28
|
+
const prevContext = session.context ?? {};
|
|
29
|
+
const updatedContext = {
|
|
30
|
+
...prevContext, // preserve stage1_ids and any other session fields
|
|
31
|
+
filters: {
|
|
32
|
+
...(prevContext.filters ?? {}),
|
|
33
|
+
...filterUpdates,
|
|
34
|
+
},
|
|
35
|
+
};
|
|
36
|
+
await sessionManager.updateContext(args.query_id, updatedContext);
|
|
37
|
+
await sessionManager.appendClarification(args.query_id, [], args.answers);
|
|
38
|
+
// Get all dimensions asked so far (including this round's answers)
|
|
39
|
+
const allAskedDimensions = await sessionManager.getAskedDimensions(args.query_id);
|
|
40
|
+
// Check if another clarification round is warranted (max 3 rounds)
|
|
41
|
+
if (allAskedDimensions.size < 3) {
|
|
42
|
+
// Filter corpus by the answers just given to produce an updated candidate set
|
|
43
|
+
const corpus = await pipeline.loadToolCorpus();
|
|
44
|
+
const idSet = new Set(candidateIds);
|
|
45
|
+
const candidateTools = corpus.filter((t) => idSet.has(t.id));
|
|
46
|
+
const filteredCandidates = clarificationEngine.applyAnswers(candidateTools, args.answers);
|
|
47
|
+
const nextQuestions = clarificationEngine.getClarification(filteredCandidates, allAskedDimensions);
|
|
48
|
+
if (nextQuestions.length > 0) {
|
|
49
|
+
// Persist the questions (no answers yet) for this upcoming round
|
|
50
|
+
await sessionManager.appendClarification(args.query_id, nextQuestions, []);
|
|
51
|
+
const clarificationRound = allAskedDimensions.size + 1;
|
|
52
|
+
logger.info({
|
|
53
|
+
sessionId: args.query_id,
|
|
54
|
+
clarificationRound,
|
|
55
|
+
questionCount: nextQuestions.length,
|
|
56
|
+
}, 'search_tools_respond: next clarification round');
|
|
57
|
+
return okResult({
|
|
58
|
+
done: false,
|
|
59
|
+
query_id: args.query_id,
|
|
60
|
+
status: 'clarification_needed',
|
|
61
|
+
stage: 2,
|
|
62
|
+
clarification_round: clarificationRound,
|
|
63
|
+
questions: nextQuestions,
|
|
64
|
+
});
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
// No more clarification needed — run stages 2-4 with saved candidates + updated context filters
|
|
68
|
+
const { results, is_two_option } = await pipeline.runStages2to4(candidateIds, updatedContext, args.query_id);
|
|
69
|
+
logger.info({ sessionId: args.query_id, resultCount: results.length }, 'search_tools_respond complete');
|
|
70
|
+
const sessionForQuery = await sessionManager.getSession(args.query_id);
|
|
71
|
+
const originalQuery = sessionForQuery?.query ?? '';
|
|
72
|
+
const formattedResults = formatResults(results, is_two_option);
|
|
73
|
+
const nonIndexedGuidance = buildNonIndexedGuidance(formattedResults, originalQuery);
|
|
74
|
+
const credibilityWarning = buildLowCredibilityWarning(formattedResults);
|
|
75
|
+
return okResult({
|
|
76
|
+
done: true,
|
|
77
|
+
query_id: args.query_id,
|
|
78
|
+
status: 'complete',
|
|
79
|
+
stage: 4,
|
|
80
|
+
results: formattedResults,
|
|
81
|
+
is_two_option,
|
|
82
|
+
...(nonIndexedGuidance ? { non_indexed_guidance: nonIndexedGuidance } : {}),
|
|
83
|
+
...(credibilityWarning ? { credibility_warning: credibilityWarning } : {}),
|
|
84
|
+
});
|
|
85
|
+
}
|
|
86
|
+
catch (e) {
|
|
87
|
+
logger.error({ err: e, query_id: args.query_id }, 'search_tools_respond failed');
|
|
88
|
+
return errResult('search_error', e instanceof Error ? e.message : String(e));
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
//# sourceMappingURL=search-tools-respond.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"search-tools-respond.js","sourceRoot":"","sources":["../../src/tools/search-tools-respond.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
export declare function handleSearchTools(args: {
|
|
2
|
+
query: string;
|
|
3
|
+
context?: {
|
|
4
|
+
filters: Record<string, unknown>;
|
|
5
|
+
};
|
|
6
|
+
query_id?: string;
|
|
7
|
+
user_id?: string;
|
|
8
|
+
}): Promise<{
|
|
9
|
+
[x: string]: unknown;
|
|
10
|
+
content: ({
|
|
11
|
+
type: "text";
|
|
12
|
+
text: string;
|
|
13
|
+
annotations?: {
|
|
14
|
+
audience?: ("user" | "assistant")[] | undefined;
|
|
15
|
+
priority?: number | undefined;
|
|
16
|
+
lastModified?: string | undefined;
|
|
17
|
+
} | undefined;
|
|
18
|
+
_meta?: {
|
|
19
|
+
[x: string]: unknown;
|
|
20
|
+
} | undefined;
|
|
21
|
+
} | {
|
|
22
|
+
type: "image";
|
|
23
|
+
data: string;
|
|
24
|
+
mimeType: string;
|
|
25
|
+
annotations?: {
|
|
26
|
+
audience?: ("user" | "assistant")[] | undefined;
|
|
27
|
+
priority?: number | undefined;
|
|
28
|
+
lastModified?: string | undefined;
|
|
29
|
+
} | undefined;
|
|
30
|
+
_meta?: {
|
|
31
|
+
[x: string]: unknown;
|
|
32
|
+
} | undefined;
|
|
33
|
+
} | {
|
|
34
|
+
type: "audio";
|
|
35
|
+
data: string;
|
|
36
|
+
mimeType: string;
|
|
37
|
+
annotations?: {
|
|
38
|
+
audience?: ("user" | "assistant")[] | undefined;
|
|
39
|
+
priority?: number | undefined;
|
|
40
|
+
lastModified?: string | undefined;
|
|
41
|
+
} | undefined;
|
|
42
|
+
_meta?: {
|
|
43
|
+
[x: string]: unknown;
|
|
44
|
+
} | undefined;
|
|
45
|
+
} | {
|
|
46
|
+
uri: string;
|
|
47
|
+
name: string;
|
|
48
|
+
type: "resource_link";
|
|
49
|
+
description?: string | undefined;
|
|
50
|
+
mimeType?: string | undefined;
|
|
51
|
+
annotations?: {
|
|
52
|
+
audience?: ("user" | "assistant")[] | undefined;
|
|
53
|
+
priority?: number | undefined;
|
|
54
|
+
lastModified?: string | undefined;
|
|
55
|
+
} | undefined;
|
|
56
|
+
_meta?: {
|
|
57
|
+
[x: string]: unknown;
|
|
58
|
+
} | undefined;
|
|
59
|
+
icons?: {
|
|
60
|
+
src: string;
|
|
61
|
+
mimeType?: string | undefined;
|
|
62
|
+
sizes?: string[] | undefined;
|
|
63
|
+
theme?: "light" | "dark" | undefined;
|
|
64
|
+
}[] | undefined;
|
|
65
|
+
title?: string | undefined;
|
|
66
|
+
} | {
|
|
67
|
+
type: "resource";
|
|
68
|
+
resource: {
|
|
69
|
+
uri: string;
|
|
70
|
+
text: string;
|
|
71
|
+
mimeType?: string | undefined;
|
|
72
|
+
_meta?: {
|
|
73
|
+
[x: string]: unknown;
|
|
74
|
+
} | undefined;
|
|
75
|
+
} | {
|
|
76
|
+
uri: string;
|
|
77
|
+
blob: string;
|
|
78
|
+
mimeType?: string | undefined;
|
|
79
|
+
_meta?: {
|
|
80
|
+
[x: string]: unknown;
|
|
81
|
+
} | undefined;
|
|
82
|
+
};
|
|
83
|
+
annotations?: {
|
|
84
|
+
audience?: ("user" | "assistant")[] | undefined;
|
|
85
|
+
priority?: number | undefined;
|
|
86
|
+
lastModified?: string | undefined;
|
|
87
|
+
} | undefined;
|
|
88
|
+
_meta?: {
|
|
89
|
+
[x: string]: unknown;
|
|
90
|
+
} | undefined;
|
|
91
|
+
})[];
|
|
92
|
+
_meta?: {
|
|
93
|
+
[x: string]: unknown;
|
|
94
|
+
progressToken?: string | number | undefined;
|
|
95
|
+
"io.modelcontextprotocol/related-task"?: {
|
|
96
|
+
taskId: string;
|
|
97
|
+
} | undefined;
|
|
98
|
+
} | undefined;
|
|
99
|
+
structuredContent?: {
|
|
100
|
+
[x: string]: unknown;
|
|
101
|
+
} | undefined;
|
|
102
|
+
isError?: boolean | undefined;
|
|
103
|
+
}>;
|
|
104
|
+
//# sourceMappingURL=search-tools.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"search-tools.d.ts","sourceRoot":"","sources":["../../src/tools/search-tools.ts"],"names":[],"mappings":"AAwBA,wBAAsB,iBAAiB,CAAC,IAAI,EAAE;IAC5C,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE;QAAE,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;KAAE,CAAC;IAC/C,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+EA"}
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
import { PrismaClient } from '@toolpilot/db';
|
|
2
|
+
import { enqueueSearchEvent } from '@toolpilot/queue';
|
|
3
|
+
import { ClarificationEngine, SearchPipeline, SearchSessionManager, stage1HybridSearch, } from '@toolpilot/search';
|
|
4
|
+
import pino from 'pino';
|
|
5
|
+
import { errResult, okResult } from '../utils.js';
|
|
6
|
+
import { buildLowCredibilityWarning, buildNonIndexedGuidance, formatResults, } from './format-results.js';
|
|
7
|
+
const logger = pino({ name: '@toolpilot/mcp-server:search-tools' });
|
|
8
|
+
const prisma = new PrismaClient();
|
|
9
|
+
const sessionManager = new SearchSessionManager(prisma);
|
|
10
|
+
const pipeline = new SearchPipeline(sessionManager);
|
|
11
|
+
const clarificationEngine = new ClarificationEngine();
|
|
12
|
+
const CLARIFICATION_THRESHOLD = 3; // ask questions if > this many candidates
|
|
13
|
+
export async function handleSearchTools(args) {
|
|
14
|
+
try {
|
|
15
|
+
const sessionId = args.query_id ?? (await sessionManager.createSession(args.query));
|
|
16
|
+
logger.info({ sessionId, query: args.query }, 'search_tools called');
|
|
17
|
+
if (args.context) {
|
|
18
|
+
await sessionManager.updateContext(sessionId, args.context);
|
|
19
|
+
}
|
|
20
|
+
const t0 = Date.now();
|
|
21
|
+
// Stage 1 — hybrid retrieval (BM25 + optional vector)
|
|
22
|
+
const corpus = await pipeline.loadToolCorpus();
|
|
23
|
+
const stage1 = await stage1HybridSearch(args.query, corpus);
|
|
24
|
+
// Build candidate set from Stage 1 IDs
|
|
25
|
+
const idSet = new Set(stage1.ids);
|
|
26
|
+
const candidates = corpus.filter((t) => idSet.has(t.id));
|
|
27
|
+
// Check if clarification is warranted
|
|
28
|
+
const askedDimensions = await sessionManager.getAskedDimensions(sessionId);
|
|
29
|
+
const questions = clarificationEngine.getClarification(candidates, askedDimensions);
|
|
30
|
+
if (questions.length > 0 && candidates.length > CLARIFICATION_THRESHOLD) {
|
|
31
|
+
// Save Stage 1 candidate IDs so search_tools_respond can use them
|
|
32
|
+
await sessionManager.saveCandidates(sessionId, stage1.ids);
|
|
33
|
+
// Record questions in clarification history (no answers yet)
|
|
34
|
+
await sessionManager.appendClarification(sessionId, questions, []);
|
|
35
|
+
enqueueSearchEvent(args.query, sessionId).catch((e) => {
|
|
36
|
+
logger.warn({ err: e }, 'Failed to enqueue search event');
|
|
37
|
+
});
|
|
38
|
+
logger.info({ sessionId, candidateCount: candidates.length, questionCount: questions.length }, 'Clarification needed');
|
|
39
|
+
const askedDimsList = [...askedDimensions];
|
|
40
|
+
const clarificationRound = pipeline.getClarificationRound(askedDimsList);
|
|
41
|
+
return okResult({
|
|
42
|
+
query_id: sessionId,
|
|
43
|
+
status: 'clarification_needed',
|
|
44
|
+
stage: 1,
|
|
45
|
+
clarification_round: clarificationRound,
|
|
46
|
+
candidate_count: candidates.length,
|
|
47
|
+
questions,
|
|
48
|
+
hint: 'Answer to narrow the search. Up to 2 more rounds of clarification may follow.',
|
|
49
|
+
});
|
|
50
|
+
}
|
|
51
|
+
// No clarification needed — run stages 2-4 directly
|
|
52
|
+
const { results, is_two_option, stage2_ms, stage3_ms, stage4_ms } = await pipeline.runStages2to4(stage1.ids, args.context, sessionId);
|
|
53
|
+
enqueueSearchEvent(args.query, sessionId).catch((e) => {
|
|
54
|
+
logger.warn({ err: e }, 'Failed to enqueue search event');
|
|
55
|
+
});
|
|
56
|
+
const total_ms = Date.now() - t0;
|
|
57
|
+
logger.info({ sessionId, total_ms, resultCount: results.length }, 'search_tools complete');
|
|
58
|
+
const formattedResults = formatResults(results, is_two_option);
|
|
59
|
+
const nonIndexedGuidance = buildNonIndexedGuidance(formattedResults, args.query);
|
|
60
|
+
const credibilityWarning = buildLowCredibilityWarning(formattedResults);
|
|
61
|
+
return okResult({
|
|
62
|
+
query_id: sessionId,
|
|
63
|
+
status: 'complete',
|
|
64
|
+
stage: 4,
|
|
65
|
+
results: formattedResults,
|
|
66
|
+
is_two_option,
|
|
67
|
+
timing: { stage1_ms: stage1.elapsed_ms, stage2_ms, stage3_ms, stage4_ms, total_ms },
|
|
68
|
+
...(nonIndexedGuidance ? { non_indexed_guidance: nonIndexedGuidance } : {}),
|
|
69
|
+
...(credibilityWarning ? { credibility_warning: credibilityWarning } : {}),
|
|
70
|
+
});
|
|
71
|
+
}
|
|
72
|
+
catch (e) {
|
|
73
|
+
logger.error({ err: e, query: args.query }, 'search_tools failed');
|
|
74
|
+
return errResult('search_error', e instanceof Error ? e.message : String(e));
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
//# sourceMappingURL=search-tools.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"search-tools.js","sourceRoot":"","sources":["../../src/tools/search-tools.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,117 @@
|
|
|
1
|
+
export declare function handleSuggestGraphUpdate(args: {
|
|
2
|
+
suggestion_type: 'new_tool' | 'new_edge' | 'update_health' | 'new_use_case';
|
|
3
|
+
data: {
|
|
4
|
+
tool_name?: string;
|
|
5
|
+
github_url?: string;
|
|
6
|
+
description?: string;
|
|
7
|
+
relationship?: {
|
|
8
|
+
source_tool: string;
|
|
9
|
+
target_tool: string;
|
|
10
|
+
edge_type: string;
|
|
11
|
+
evidence?: string;
|
|
12
|
+
};
|
|
13
|
+
use_case?: {
|
|
14
|
+
name: string;
|
|
15
|
+
description: string;
|
|
16
|
+
tools?: string[];
|
|
17
|
+
};
|
|
18
|
+
};
|
|
19
|
+
query_id?: string;
|
|
20
|
+
confidence?: number;
|
|
21
|
+
}): Promise<{
|
|
22
|
+
[x: string]: unknown;
|
|
23
|
+
content: ({
|
|
24
|
+
type: "text";
|
|
25
|
+
text: string;
|
|
26
|
+
annotations?: {
|
|
27
|
+
audience?: ("user" | "assistant")[] | undefined;
|
|
28
|
+
priority?: number | undefined;
|
|
29
|
+
lastModified?: string | undefined;
|
|
30
|
+
} | undefined;
|
|
31
|
+
_meta?: {
|
|
32
|
+
[x: string]: unknown;
|
|
33
|
+
} | undefined;
|
|
34
|
+
} | {
|
|
35
|
+
type: "image";
|
|
36
|
+
data: string;
|
|
37
|
+
mimeType: string;
|
|
38
|
+
annotations?: {
|
|
39
|
+
audience?: ("user" | "assistant")[] | undefined;
|
|
40
|
+
priority?: number | undefined;
|
|
41
|
+
lastModified?: string | undefined;
|
|
42
|
+
} | undefined;
|
|
43
|
+
_meta?: {
|
|
44
|
+
[x: string]: unknown;
|
|
45
|
+
} | undefined;
|
|
46
|
+
} | {
|
|
47
|
+
type: "audio";
|
|
48
|
+
data: string;
|
|
49
|
+
mimeType: string;
|
|
50
|
+
annotations?: {
|
|
51
|
+
audience?: ("user" | "assistant")[] | undefined;
|
|
52
|
+
priority?: number | undefined;
|
|
53
|
+
lastModified?: string | undefined;
|
|
54
|
+
} | undefined;
|
|
55
|
+
_meta?: {
|
|
56
|
+
[x: string]: unknown;
|
|
57
|
+
} | undefined;
|
|
58
|
+
} | {
|
|
59
|
+
uri: string;
|
|
60
|
+
name: string;
|
|
61
|
+
type: "resource_link";
|
|
62
|
+
description?: string | undefined;
|
|
63
|
+
mimeType?: string | undefined;
|
|
64
|
+
annotations?: {
|
|
65
|
+
audience?: ("user" | "assistant")[] | undefined;
|
|
66
|
+
priority?: number | undefined;
|
|
67
|
+
lastModified?: string | undefined;
|
|
68
|
+
} | undefined;
|
|
69
|
+
_meta?: {
|
|
70
|
+
[x: string]: unknown;
|
|
71
|
+
} | undefined;
|
|
72
|
+
icons?: {
|
|
73
|
+
src: string;
|
|
74
|
+
mimeType?: string | undefined;
|
|
75
|
+
sizes?: string[] | undefined;
|
|
76
|
+
theme?: "light" | "dark" | undefined;
|
|
77
|
+
}[] | undefined;
|
|
78
|
+
title?: string | undefined;
|
|
79
|
+
} | {
|
|
80
|
+
type: "resource";
|
|
81
|
+
resource: {
|
|
82
|
+
uri: string;
|
|
83
|
+
text: string;
|
|
84
|
+
mimeType?: string | undefined;
|
|
85
|
+
_meta?: {
|
|
86
|
+
[x: string]: unknown;
|
|
87
|
+
} | undefined;
|
|
88
|
+
} | {
|
|
89
|
+
uri: string;
|
|
90
|
+
blob: string;
|
|
91
|
+
mimeType?: string | undefined;
|
|
92
|
+
_meta?: {
|
|
93
|
+
[x: string]: unknown;
|
|
94
|
+
} | undefined;
|
|
95
|
+
};
|
|
96
|
+
annotations?: {
|
|
97
|
+
audience?: ("user" | "assistant")[] | undefined;
|
|
98
|
+
priority?: number | undefined;
|
|
99
|
+
lastModified?: string | undefined;
|
|
100
|
+
} | undefined;
|
|
101
|
+
_meta?: {
|
|
102
|
+
[x: string]: unknown;
|
|
103
|
+
} | undefined;
|
|
104
|
+
})[];
|
|
105
|
+
_meta?: {
|
|
106
|
+
[x: string]: unknown;
|
|
107
|
+
progressToken?: string | number | undefined;
|
|
108
|
+
"io.modelcontextprotocol/related-task"?: {
|
|
109
|
+
taskId: string;
|
|
110
|
+
} | undefined;
|
|
111
|
+
} | undefined;
|
|
112
|
+
structuredContent?: {
|
|
113
|
+
[x: string]: unknown;
|
|
114
|
+
} | undefined;
|
|
115
|
+
isError?: boolean | undefined;
|
|
116
|
+
}>;
|
|
117
|
+
//# sourceMappingURL=suggest-graph-update.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"suggest-graph-update.d.ts","sourceRoot":"","sources":["../../src/tools/suggest-graph-update.ts"],"names":[],"mappings":"AAyBA,wBAAsB,wBAAwB,CAAC,IAAI,EAAE;IACnD,eAAe,EAAE,UAAU,GAAG,UAAU,GAAG,eAAe,GAAG,cAAc,CAAC;IAC5E,IAAI,EAAE;QACJ,SAAS,CAAC,EAAE,MAAM,CAAC;QACnB,UAAU,CAAC,EAAE,MAAM,CAAC;QACpB,WAAW,CAAC,EAAE,MAAM,CAAC;QACrB,YAAY,CAAC,EAAE;YACb,WAAW,EAAE,MAAM,CAAC;YACpB,WAAW,EAAE,MAAM,CAAC;YACpB,SAAS,EAAE,MAAM,CAAC;YAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;SACnB,CAAC;QACF,QAAQ,CAAC,EAAE;YACT,IAAI,EAAE,MAAM,CAAC;YACb,WAAW,EAAE,MAAM,CAAC;YACpB,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;SAClB,CAAC;KACH,CAAC;IACF,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA0LA"}
|