codesift-mcp 0.4.0 → 0.5.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +94 -25
- package/dist/cli/help.d.ts.map +1 -1
- package/dist/cli/help.js +8 -6
- package/dist/cli/help.js.map +1 -1
- package/dist/cli/platform.d.ts.map +1 -1
- package/dist/cli/platform.js +12 -14
- package/dist/cli/platform.js.map +1 -1
- package/dist/cli/setup.d.ts +1 -1
- package/dist/cli/setup.d.ts.map +1 -1
- package/dist/cli/setup.js +30 -6
- package/dist/cli/setup.js.map +1 -1
- package/dist/formatters.d.ts +2 -2
- package/dist/formatters.d.ts.map +1 -1
- package/dist/formatters.js +23 -0
- package/dist/formatters.js.map +1 -1
- package/dist/instructions.d.ts +1 -1
- package/dist/instructions.d.ts.map +1 -1
- package/dist/instructions.js +21 -21
- package/dist/parser/extractors/php.d.ts.map +1 -1
- package/dist/parser/extractors/php.js +37 -29
- package/dist/parser/extractors/php.js.map +1 -1
- package/dist/parser/extractors/typescript.d.ts.map +1 -1
- package/dist/parser/extractors/typescript.js +43 -0
- package/dist/parser/extractors/typescript.js.map +1 -1
- package/dist/parser/parse-cache.d.ts +39 -0
- package/dist/parser/parse-cache.d.ts.map +1 -0
- package/dist/parser/parse-cache.js +87 -0
- package/dist/parser/parse-cache.js.map +1 -0
- package/dist/parser/parser-manager.d.ts +1 -1
- package/dist/parser/parser-manager.d.ts.map +1 -1
- package/dist/parser/parser-manager.js +14 -5
- package/dist/parser/parser-manager.js.map +1 -1
- package/dist/parser/stub-languages.d.ts +2 -0
- package/dist/parser/stub-languages.d.ts.map +1 -0
- package/dist/parser/stub-languages.js +5 -0
- package/dist/parser/stub-languages.js.map +1 -0
- package/dist/register-tool-loaders.d.ts +130 -0
- package/dist/register-tool-loaders.d.ts.map +1 -0
- package/dist/register-tool-loaders.js +212 -0
- package/dist/register-tool-loaders.js.map +1 -0
- package/dist/register-tools.d.ts +2 -2
- package/dist/register-tools.d.ts.map +1 -1
- package/dist/register-tools.js +355 -634
- package/dist/register-tools.js.map +1 -1
- package/dist/search/tool-ranker.d.ts +90 -0
- package/dist/search/tool-ranker.d.ts.map +1 -0
- package/dist/search/tool-ranker.js +420 -0
- package/dist/search/tool-ranker.js.map +1 -0
- package/dist/server.d.ts.map +1 -1
- package/dist/server.js +23 -14
- package/dist/server.js.map +1 -1
- package/dist/storage/usage-tracker.d.ts.map +1 -1
- package/dist/storage/usage-tracker.js +4 -1
- package/dist/storage/usage-tracker.js.map +1 -1
- package/dist/tools/astro-actions.d.ts +54 -0
- package/dist/tools/astro-actions.d.ts.map +1 -0
- package/dist/tools/astro-actions.js +561 -0
- package/dist/tools/astro-actions.js.map +1 -0
- package/dist/tools/astro-audit.d.ts +87 -0
- package/dist/tools/astro-audit.d.ts.map +1 -0
- package/dist/tools/astro-audit.js +345 -0
- package/dist/tools/astro-audit.js.map +1 -0
- package/dist/tools/astro-content-collections.d.ts +44 -0
- package/dist/tools/astro-content-collections.d.ts.map +1 -0
- package/dist/tools/astro-content-collections.js +630 -0
- package/dist/tools/astro-content-collections.js.map +1 -0
- package/dist/tools/astro-islands.d.ts +3 -1
- package/dist/tools/astro-islands.d.ts.map +1 -1
- package/dist/tools/astro-islands.js +19 -4
- package/dist/tools/astro-islands.js.map +1 -1
- package/dist/tools/astro-migration.d.ts +31 -0
- package/dist/tools/astro-migration.d.ts.map +1 -0
- package/dist/tools/astro-migration.js +378 -0
- package/dist/tools/astro-migration.js.map +1 -0
- package/dist/tools/async-correctness.d.ts +26 -0
- package/dist/tools/async-correctness.d.ts.map +1 -0
- package/dist/tools/async-correctness.js +166 -0
- package/dist/tools/async-correctness.js.map +1 -0
- package/dist/tools/django-view-security-tools.d.ts +32 -0
- package/dist/tools/django-view-security-tools.d.ts.map +1 -0
- package/dist/tools/django-view-security-tools.js +184 -0
- package/dist/tools/django-view-security-tools.js.map +1 -0
- package/dist/tools/fastapi-depends.d.ts +63 -0
- package/dist/tools/fastapi-depends.d.ts.map +1 -0
- package/dist/tools/fastapi-depends.js +191 -0
- package/dist/tools/fastapi-depends.js.map +1 -0
- package/dist/tools/hono-analyze-app.js +1 -9
- package/dist/tools/hono-analyze-app.js.map +1 -1
- package/dist/tools/hono-api-contract.d.ts.map +1 -1
- package/dist/tools/hono-api-contract.js +41 -9
- package/dist/tools/hono-api-contract.js.map +1 -1
- package/dist/tools/hono-context-flow.js +1 -9
- package/dist/tools/hono-context-flow.js.map +1 -1
- package/dist/tools/hono-dead-routes.d.ts.map +1 -1
- package/dist/tools/hono-dead-routes.js +2 -9
- package/dist/tools/hono-dead-routes.js.map +1 -1
- package/dist/tools/hono-entry-resolver.d.ts +27 -0
- package/dist/tools/hono-entry-resolver.d.ts.map +1 -0
- package/dist/tools/hono-entry-resolver.js +31 -0
- package/dist/tools/hono-entry-resolver.js.map +1 -0
- package/dist/tools/hono-inline-analyze.js +1 -9
- package/dist/tools/hono-inline-analyze.js.map +1 -1
- package/dist/tools/hono-middleware-chain.d.ts +24 -6
- package/dist/tools/hono-middleware-chain.d.ts.map +1 -1
- package/dist/tools/hono-middleware-chain.js +77 -40
- package/dist/tools/hono-middleware-chain.js.map +1 -1
- package/dist/tools/hono-modules.js +1 -9
- package/dist/tools/hono-modules.js.map +1 -1
- package/dist/tools/hono-response-types.js +1 -9
- package/dist/tools/hono-response-types.js.map +1 -1
- package/dist/tools/hono-rpc-types.js +1 -9
- package/dist/tools/hono-rpc-types.js.map +1 -1
- package/dist/tools/hono-security.d.ts +14 -4
- package/dist/tools/hono-security.d.ts.map +1 -1
- package/dist/tools/hono-security.js +185 -14
- package/dist/tools/hono-security.js.map +1 -1
- package/dist/tools/hono-visualize.js +1 -9
- package/dist/tools/hono-visualize.js.map +1 -1
- package/dist/tools/nest-ext-tools.d.ts +115 -0
- package/dist/tools/nest-ext-tools.d.ts.map +1 -1
- package/dist/tools/nest-ext-tools.js +393 -0
- package/dist/tools/nest-ext-tools.js.map +1 -1
- package/dist/tools/nest-tools.d.ts +27 -0
- package/dist/tools/nest-tools.d.ts.map +1 -1
- package/dist/tools/nest-tools.js +137 -37
- package/dist/tools/nest-tools.js.map +1 -1
- package/dist/tools/nextjs-component-readers.d.ts +101 -0
- package/dist/tools/nextjs-component-readers.d.ts.map +1 -0
- package/dist/tools/nextjs-component-readers.js +287 -0
- package/dist/tools/nextjs-component-readers.js.map +1 -0
- package/dist/tools/nextjs-component-tools.d.ts +8 -78
- package/dist/tools/nextjs-component-tools.d.ts.map +1 -1
- package/dist/tools/nextjs-component-tools.js +9 -257
- package/dist/tools/nextjs-component-tools.js.map +1 -1
- package/dist/tools/nextjs-framework-audit-tools.d.ts +24 -1
- package/dist/tools/nextjs-framework-audit-tools.d.ts.map +1 -1
- package/dist/tools/nextjs-framework-audit-tools.js +184 -1
- package/dist/tools/nextjs-framework-audit-tools.js.map +1 -1
- package/dist/tools/nextjs-route-readers.d.ts +81 -0
- package/dist/tools/nextjs-route-readers.d.ts.map +1 -0
- package/dist/tools/nextjs-route-readers.js +340 -0
- package/dist/tools/nextjs-route-readers.js.map +1 -0
- package/dist/tools/nextjs-route-tools.d.ts +7 -71
- package/dist/tools/nextjs-route-tools.d.ts.map +1 -1
- package/dist/tools/nextjs-route-tools.js +9 -327
- package/dist/tools/nextjs-route-tools.js.map +1 -1
- package/dist/tools/pattern-tools.d.ts.map +1 -1
- package/dist/tools/pattern-tools.js +92 -2
- package/dist/tools/pattern-tools.js.map +1 -1
- package/dist/tools/php-tools.d.ts +14 -5
- package/dist/tools/php-tools.d.ts.map +1 -1
- package/dist/tools/php-tools.js +166 -64
- package/dist/tools/php-tools.js.map +1 -1
- package/dist/tools/plan-turn-tools.d.ts +89 -0
- package/dist/tools/plan-turn-tools.d.ts.map +1 -0
- package/dist/tools/plan-turn-tools.js +508 -0
- package/dist/tools/plan-turn-tools.js.map +1 -0
- package/dist/tools/project-tools.d.ts +1 -1
- package/dist/tools/project-tools.js +1 -1
- package/dist/tools/project-tools.js.map +1 -1
- package/dist/tools/pydantic-models.d.ts +46 -0
- package/dist/tools/pydantic-models.d.ts.map +1 -0
- package/dist/tools/pydantic-models.js +249 -0
- package/dist/tools/pydantic-models.js.map +1 -0
- package/dist/tools/python-audit.d.ts +40 -0
- package/dist/tools/python-audit.d.ts.map +1 -0
- package/dist/tools/python-audit.js +244 -0
- package/dist/tools/python-audit.js.map +1 -0
- package/dist/tools/python-constants-tools.d.ts +44 -0
- package/dist/tools/python-constants-tools.d.ts.map +1 -0
- package/dist/tools/python-constants-tools.js +525 -0
- package/dist/tools/python-constants-tools.js.map +1 -0
- package/dist/tools/react-tools.d.ts +46 -1
- package/dist/tools/react-tools.d.ts.map +1 -1
- package/dist/tools/react-tools.js +126 -1
- package/dist/tools/react-tools.js.map +1 -1
- package/dist/tools/review-diff-tools.d.ts +5 -0
- package/dist/tools/review-diff-tools.d.ts.map +1 -1
- package/dist/tools/review-diff-tools.js +109 -3
- package/dist/tools/review-diff-tools.js.map +1 -1
- package/dist/tools/search-tools.d.ts +3 -2
- package/dist/tools/search-tools.d.ts.map +1 -1
- package/dist/tools/search-tools.js +16 -3
- package/dist/tools/search-tools.js.map +1 -1
- package/dist/tools/sql-tools.d.ts +40 -0
- package/dist/tools/sql-tools.d.ts.map +1 -1
- package/dist/tools/sql-tools.js +123 -0
- package/dist/tools/sql-tools.js.map +1 -1
- package/dist/tools/symbol-tools.d.ts.map +1 -1
- package/dist/tools/symbol-tools.js +7 -10
- package/dist/tools/symbol-tools.js.map +1 -1
- package/dist/tools/taint-tools.d.ts +43 -0
- package/dist/tools/taint-tools.d.ts.map +1 -0
- package/dist/tools/taint-tools.js +922 -0
- package/dist/tools/taint-tools.js.map +1 -0
- package/dist/utils/import-graph.d.ts +6 -0
- package/dist/utils/import-graph.d.ts.map +1 -1
- package/dist/utils/import-graph.js +43 -7
- package/dist/utils/import-graph.js.map +1 -1
- package/package.json +3 -3
- package/rules/codesift.md +51 -13
- package/rules/codesift.mdc +51 -13
- package/rules/codex.md +51 -13
- package/rules/gemini.md +51 -13
|
@@ -0,0 +1,508 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* plan-turn-tools.ts — Query parser + main handler for plan/turn routing.
|
|
3
|
+
*
|
|
4
|
+
* Parser (Task 6):
|
|
5
|
+
* - Normalisation (lowercase, trim, 1000-char cap)
|
|
6
|
+
* - Multi-intent split on "and / or / ; / &&" with surrounding whitespace
|
|
7
|
+
* - File ref extraction (extensions: ts/tsx/js/jsx/py/go/rs/php/kt/sql)
|
|
8
|
+
* - Symbol ref extraction (cross-referenced against index.symbols)
|
|
9
|
+
* - Vague detection (short query with no domain keywords)
|
|
10
|
+
*
|
|
11
|
+
* Handler (Task 7) — `planTurn`:
|
|
12
|
+
* 1. Guards against missing index → returns structured error
|
|
13
|
+
* 2. Parses query via parseQuery
|
|
14
|
+
* 3. Checks negative evidence → returns STOP_AND_REPORT_GAP early
|
|
15
|
+
* 4. Builds ranker context (usage freq, framework tools, embeddings)
|
|
16
|
+
* 5. Runs rankTools per intent, merges results
|
|
17
|
+
* 6. Dedups against session.queries (top-3 retained)
|
|
18
|
+
* 7. Collects hidden tool names for reveal_required[]
|
|
19
|
+
* 8. Populates metadata flags (stale_index, framework_mismatch, cold_start…)
|
|
20
|
+
*/
|
|
21
|
+
import { getCodeIndex } from "./index-tools.js";
|
|
22
|
+
import { getToolDefinitions, CORE_TOOL_NAMES, detectAutoLoadTools, } from "../register-tools.js";
|
|
23
|
+
import { rankTools, getToolEmbeddings, } from "../search/tool-ranker.js";
|
|
24
|
+
import { getSessionState } from "../storage/session-state.js";
|
|
25
|
+
import { getUsageStats } from "../storage/usage-stats.js";
|
|
26
|
+
// ---------------------------------------------------------------------------
|
|
27
|
+
// Constants
|
|
28
|
+
// ---------------------------------------------------------------------------
|
|
29
|
+
const VAGUE_STOPWORDS = new Set([
|
|
30
|
+
"help", "hi", "hello", "what", "how", "why", "please", "can", "could",
|
|
31
|
+
]);
|
|
32
|
+
const DOMAIN_KEYWORDS = new Set([
|
|
33
|
+
"find", "search", "audit", "analyze", "trace", "review", "check",
|
|
34
|
+
"show", "get", "list", "detect", "scan",
|
|
35
|
+
]);
|
|
36
|
+
const FILE_EXT_RE = /\b[\w./-]+\.(?:ts|tsx|js|jsx|py|go|rs|php|kt|sql)\b/g;
|
|
37
|
+
// Identifiers: starts with letter or _, at least 3 chars total
|
|
38
|
+
const IDENT_RE = /\b[a-zA-Z_][a-zA-Z0-9_]{2,}\b/g;
|
|
39
|
+
// Split only on whitespace-bounded and/or/;/&&
|
|
40
|
+
const MULTI_INTENT_RE = /\s+(?:and|or|;|&&)\s+/i;
|
|
41
|
+
// ---------------------------------------------------------------------------
|
|
42
|
+
// parseQuery
|
|
43
|
+
// ---------------------------------------------------------------------------
|
|
44
|
+
export function parseQuery(raw, index) {
|
|
45
|
+
const original = raw;
|
|
46
|
+
const truncated = raw.length > 1000;
|
|
47
|
+
const normalized = raw.slice(0, 1000).toLowerCase().trim();
|
|
48
|
+
// Empty / whitespace-only input
|
|
49
|
+
if (normalized.length === 0) {
|
|
50
|
+
return {
|
|
51
|
+
original,
|
|
52
|
+
normalized,
|
|
53
|
+
truncated,
|
|
54
|
+
intents: [],
|
|
55
|
+
file_refs: [],
|
|
56
|
+
symbol_refs: [],
|
|
57
|
+
is_vague: true,
|
|
58
|
+
};
|
|
59
|
+
}
|
|
60
|
+
// Multi-intent split
|
|
61
|
+
const intents = normalized.split(MULTI_INTENT_RE);
|
|
62
|
+
// File references — run on the normalized text
|
|
63
|
+
const file_refs = Array.from(new Set(normalized.match(FILE_EXT_RE) ?? []));
|
|
64
|
+
// Symbol references — extract identifiers from the original text (capped at
|
|
65
|
+
// 1000 chars, pre-lowercase) to preserve camelCase names, then cross-reference
|
|
66
|
+
// against the index symbol table using exact match.
|
|
67
|
+
const symbolNames = new Set(index.symbols.map((s) => s.name));
|
|
68
|
+
const rawCapped = raw.slice(0, 1000);
|
|
69
|
+
const candidateTokens = Array.from(new Set(rawCapped.match(IDENT_RE) ?? []));
|
|
70
|
+
const symbol_refs = candidateTokens.filter((tok) => symbolNames.has(tok));
|
|
71
|
+
// Vague detection
|
|
72
|
+
const words = normalized.split(/\s+/).filter(Boolean);
|
|
73
|
+
const wordCount = words.length;
|
|
74
|
+
const containsDomainKeyword = words.some((w) => DOMAIN_KEYWORDS.has(w));
|
|
75
|
+
const allStopwords = words.every((w) => VAGUE_STOPWORDS.has(w));
|
|
76
|
+
const is_vague = normalized.length < 15 &&
|
|
77
|
+
wordCount < 3 &&
|
|
78
|
+
(!containsDomainKeyword || allStopwords);
|
|
79
|
+
return {
|
|
80
|
+
original,
|
|
81
|
+
normalized,
|
|
82
|
+
truncated,
|
|
83
|
+
intents,
|
|
84
|
+
file_refs,
|
|
85
|
+
symbol_refs,
|
|
86
|
+
is_vague,
|
|
87
|
+
};
|
|
88
|
+
}
|
|
89
|
+
// ---------------------------------------------------------------------------
|
|
90
|
+
// Module-scoped caches
|
|
91
|
+
// ---------------------------------------------------------------------------
|
|
92
|
+
let usageFreqCache = null;
|
|
93
|
+
/** Fetch usage frequency map (tool → call count). Cached per process. */
|
|
94
|
+
async function getUsageFrequency() {
|
|
95
|
+
if (usageFreqCache)
|
|
96
|
+
return usageFreqCache;
|
|
97
|
+
try {
|
|
98
|
+
const stats = await getUsageStats();
|
|
99
|
+
const map = new Map();
|
|
100
|
+
for (const t of stats.tools ?? []) {
|
|
101
|
+
map.set(t.tool, t.total_calls ?? 0);
|
|
102
|
+
}
|
|
103
|
+
usageFreqCache = map;
|
|
104
|
+
return map;
|
|
105
|
+
}
|
|
106
|
+
catch {
|
|
107
|
+
return new Map();
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
/** Test-only reset of module caches. */
|
|
111
|
+
export function _resetPlanTurnCaches() {
|
|
112
|
+
usageFreqCache = null;
|
|
113
|
+
}
|
|
114
|
+
// ---------------------------------------------------------------------------
|
|
115
|
+
// Constants for merging / framework mismatch detection
|
|
116
|
+
// ---------------------------------------------------------------------------
|
|
117
|
+
const STALE_INDEX_THRESHOLD_MS = 5 * 60 * 1000;
|
|
118
|
+
const MAX_TOOLS = 10;
|
|
119
|
+
const MAX_SYMBOLS = 20;
|
|
120
|
+
const MAX_FILES = 10;
|
|
121
|
+
/** Frameworks detectable via detectAutoLoadTools. If user mentions one but
|
|
122
|
+
* it's not in the detected framework tools, flag framework_mismatch. */
|
|
123
|
+
const KNOWN_FRAMEWORK_KEYWORDS = {
|
|
124
|
+
react: ["react", "jsx", "tsx"],
|
|
125
|
+
nextjs: ["next", "next.js", "nextjs"],
|
|
126
|
+
astro: ["astro"],
|
|
127
|
+
hono: ["hono"],
|
|
128
|
+
php: ["php", "yii", "laravel", "symfony"],
|
|
129
|
+
kotlin: ["kotlin", "compose", "android"],
|
|
130
|
+
python: ["python", "django", "fastapi", "flask"],
|
|
131
|
+
};
|
|
132
|
+
// ---------------------------------------------------------------------------
|
|
133
|
+
// Helper: build an "unindexed" error result
|
|
134
|
+
// ---------------------------------------------------------------------------
|
|
135
|
+
function buildUnindexedResult(query, startedAt) {
|
|
136
|
+
const indexFolderRec = {
|
|
137
|
+
name: "index_folder",
|
|
138
|
+
confidence: 1.0,
|
|
139
|
+
reasoning: "Repo is not indexed — run index_folder before any query tools",
|
|
140
|
+
is_hidden: !CORE_TOOL_NAMES.has("index_folder"),
|
|
141
|
+
};
|
|
142
|
+
return {
|
|
143
|
+
query,
|
|
144
|
+
truncated: false,
|
|
145
|
+
confidence: 1.0,
|
|
146
|
+
tools: [indexFolderRec],
|
|
147
|
+
symbols: [],
|
|
148
|
+
files: [],
|
|
149
|
+
reveal_required: indexFolderRec.is_hidden ? [indexFolderRec.name] : [],
|
|
150
|
+
already_used: [],
|
|
151
|
+
metadata: {
|
|
152
|
+
intents_detected: 0,
|
|
153
|
+
bm25_candidates: 0,
|
|
154
|
+
embedding_available: false,
|
|
155
|
+
session_queries_seen: 0,
|
|
156
|
+
duration_ms: Date.now() - startedAt,
|
|
157
|
+
unindexed: true,
|
|
158
|
+
cold_start: true,
|
|
159
|
+
},
|
|
160
|
+
};
|
|
161
|
+
}
|
|
162
|
+
// ---------------------------------------------------------------------------
|
|
163
|
+
// Helper: merge tool recommendations across intents (max-confidence dedup)
|
|
164
|
+
// ---------------------------------------------------------------------------
|
|
165
|
+
function mergeToolRecommendations(batches) {
|
|
166
|
+
const byName = new Map();
|
|
167
|
+
for (const batch of batches) {
|
|
168
|
+
for (const rec of batch) {
|
|
169
|
+
const existing = byName.get(rec.name);
|
|
170
|
+
if (!existing || rec.confidence > existing.confidence) {
|
|
171
|
+
byName.set(rec.name, rec);
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
}
|
|
175
|
+
return [...byName.values()].sort((a, b) => b.confidence - a.confidence);
|
|
176
|
+
}
|
|
177
|
+
// ---------------------------------------------------------------------------
|
|
178
|
+
// Helper: extract symbol + file recommendations from the index
|
|
179
|
+
// ---------------------------------------------------------------------------
|
|
180
|
+
function collectSymbolRecommendations(parsed, index) {
|
|
181
|
+
if (parsed.symbol_refs.length === 0)
|
|
182
|
+
return [];
|
|
183
|
+
const byName = new Map();
|
|
184
|
+
const wantSet = new Set(parsed.symbol_refs);
|
|
185
|
+
for (const sym of index.symbols) {
|
|
186
|
+
if (!wantSet.has(sym.name))
|
|
187
|
+
continue;
|
|
188
|
+
const existing = byName.get(sym.name);
|
|
189
|
+
if (existing)
|
|
190
|
+
continue; // first occurrence wins — stable ordering
|
|
191
|
+
byName.set(sym.name, {
|
|
192
|
+
name: sym.name,
|
|
193
|
+
file: sym.file,
|
|
194
|
+
line: sym.start_line,
|
|
195
|
+
kind: sym.kind,
|
|
196
|
+
score: 1.0,
|
|
197
|
+
});
|
|
198
|
+
if (byName.size >= MAX_SYMBOLS)
|
|
199
|
+
break;
|
|
200
|
+
}
|
|
201
|
+
return [...byName.values()];
|
|
202
|
+
}
|
|
203
|
+
function collectFileRecommendations(parsed, index) {
|
|
204
|
+
if (parsed.file_refs.length === 0)
|
|
205
|
+
return [];
|
|
206
|
+
const out = [];
|
|
207
|
+
const seen = new Set();
|
|
208
|
+
const fileSet = new Set(index.files.map((f) => f.path));
|
|
209
|
+
for (const ref of parsed.file_refs) {
|
|
210
|
+
if (seen.has(ref))
|
|
211
|
+
continue;
|
|
212
|
+
seen.add(ref);
|
|
213
|
+
const inIndex = fileSet.has(ref);
|
|
214
|
+
out.push({
|
|
215
|
+
path: ref,
|
|
216
|
+
score: inIndex ? 1.0 : 0.5,
|
|
217
|
+
reason: inIndex ? "explicit file reference" : "referenced in query",
|
|
218
|
+
});
|
|
219
|
+
if (out.length >= MAX_FILES)
|
|
220
|
+
break;
|
|
221
|
+
}
|
|
222
|
+
return out;
|
|
223
|
+
}
|
|
224
|
+
// ---------------------------------------------------------------------------
|
|
225
|
+
// Helper: framework mismatch detection
|
|
226
|
+
// ---------------------------------------------------------------------------
|
|
227
|
+
function detectFrameworkMismatch(normalizedQuery, frameworkTools) {
|
|
228
|
+
if (frameworkTools.length === 0)
|
|
229
|
+
return false;
|
|
230
|
+
const detectedJoined = frameworkTools.join(" ").toLowerCase();
|
|
231
|
+
for (const [framework, keywords] of Object.entries(KNOWN_FRAMEWORK_KEYWORDS)) {
|
|
232
|
+
for (const kw of keywords) {
|
|
233
|
+
// Word-boundary match inside the normalized query
|
|
234
|
+
const re = new RegExp(`\\b${kw.replace(/[.*+?^${}()|[\]\\]/g, "\\$&")}\\b`);
|
|
235
|
+
if (re.test(normalizedQuery)) {
|
|
236
|
+
// User mentions this framework. Is it present in detected tool names?
|
|
237
|
+
if (!detectedJoined.includes(framework)) {
|
|
238
|
+
return true;
|
|
239
|
+
}
|
|
240
|
+
}
|
|
241
|
+
}
|
|
242
|
+
}
|
|
243
|
+
return false;
|
|
244
|
+
}
|
|
245
|
+
// ---------------------------------------------------------------------------
|
|
246
|
+
// Main handler
|
|
247
|
+
// ---------------------------------------------------------------------------
|
|
248
|
+
export async function planTurn(repo, query, options) {
|
|
249
|
+
const startedAt = Date.now();
|
|
250
|
+
const maxTools = Math.min(MAX_TOOLS, options?.max_results ?? MAX_TOOLS);
|
|
251
|
+
const skipSession = options?.skip_session === true;
|
|
252
|
+
// --- 1. Guard: index present? -----------------------------------------
|
|
253
|
+
const index = await getCodeIndex(repo);
|
|
254
|
+
if (!index) {
|
|
255
|
+
return buildUnindexedResult(query, startedAt);
|
|
256
|
+
}
|
|
257
|
+
// --- 2. Parse query ---------------------------------------------------
|
|
258
|
+
const parsed = parseQuery(query, index);
|
|
259
|
+
// --- 3. Negative evidence check (STOP_AND_REPORT_GAP) ------------------
|
|
260
|
+
const sessionState = getSessionState();
|
|
261
|
+
const normalizedForCompare = parsed.normalized.replace(/[^\w\s]/g, "").trim();
|
|
262
|
+
let gap;
|
|
263
|
+
if (!skipSession && normalizedForCompare.length > 0) {
|
|
264
|
+
for (const entry of sessionState.negativeEvidence) {
|
|
265
|
+
const entryNormalized = entry.query
|
|
266
|
+
.toLowerCase()
|
|
267
|
+
.replace(/[^\w\s]/g, "")
|
|
268
|
+
.trim();
|
|
269
|
+
if (entryNormalized === normalizedForCompare) {
|
|
270
|
+
// Negative entries are only recorded when the prior result count was
|
|
271
|
+
// zero, so we short-circuit unconditionally on a match.
|
|
272
|
+
gap = {
|
|
273
|
+
action: "STOP_AND_REPORT_GAP",
|
|
274
|
+
prior_query: entry.query,
|
|
275
|
+
prior_result_count: 0,
|
|
276
|
+
suggestion: `Prior call to ${entry.tool} with the same query returned 0 results. ` +
|
|
277
|
+
`Reformulate (broaden pattern / drop file filter / try semantic search) ` +
|
|
278
|
+
`before retrying.`,
|
|
279
|
+
};
|
|
280
|
+
break;
|
|
281
|
+
}
|
|
282
|
+
}
|
|
283
|
+
}
|
|
284
|
+
if (gap) {
|
|
285
|
+
return {
|
|
286
|
+
query,
|
|
287
|
+
truncated: parsed.truncated,
|
|
288
|
+
confidence: 0,
|
|
289
|
+
tools: [],
|
|
290
|
+
symbols: [],
|
|
291
|
+
files: [],
|
|
292
|
+
reveal_required: [],
|
|
293
|
+
already_used: [],
|
|
294
|
+
gap_analysis: gap,
|
|
295
|
+
metadata: {
|
|
296
|
+
intents_detected: parsed.intents.length,
|
|
297
|
+
bm25_candidates: 0,
|
|
298
|
+
embedding_available: false,
|
|
299
|
+
session_queries_seen: sessionState.queries.length,
|
|
300
|
+
duration_ms: Date.now() - startedAt,
|
|
301
|
+
...(parsed.truncated ? { truncated: true } : {}),
|
|
302
|
+
...(parsed.is_vague ? { vague_query: true } : {}),
|
|
303
|
+
},
|
|
304
|
+
};
|
|
305
|
+
}
|
|
306
|
+
// --- 4. Build ranker context (parallel fetch) --------------------------
|
|
307
|
+
const toolDefs = [...getToolDefinitions()];
|
|
308
|
+
const [usageFreq, frameworkTools, embeddings] = await Promise.all([
|
|
309
|
+
getUsageFrequency(),
|
|
310
|
+
detectAutoLoadTools(process.cwd()).catch(() => []),
|
|
311
|
+
getToolEmbeddings(toolDefs).catch(() => null),
|
|
312
|
+
]);
|
|
313
|
+
const embeddingAvailable = embeddings !== null && embeddings.size > 0;
|
|
314
|
+
// --- 5. Run ranker per intent, merge results ---------------------------
|
|
315
|
+
const intents = parsed.intents.length > 0 ? parsed.intents : [parsed.normalized];
|
|
316
|
+
const batches = [];
|
|
317
|
+
for (const intent of intents) {
|
|
318
|
+
if (!intent.trim())
|
|
319
|
+
continue;
|
|
320
|
+
const ctx = {
|
|
321
|
+
query: intent,
|
|
322
|
+
toolDefs,
|
|
323
|
+
embeddings,
|
|
324
|
+
queryEmbedding: null, // Query embedding computation happens via ranker's external path; optional here
|
|
325
|
+
usageFrequency: usageFreq,
|
|
326
|
+
frameworkTools,
|
|
327
|
+
coreToolNames: CORE_TOOL_NAMES,
|
|
328
|
+
};
|
|
329
|
+
try {
|
|
330
|
+
const recs = rankTools(ctx);
|
|
331
|
+
batches.push(recs);
|
|
332
|
+
}
|
|
333
|
+
catch {
|
|
334
|
+
// Ranker failure per intent is non-fatal — continue with remaining intents.
|
|
335
|
+
batches.push([]);
|
|
336
|
+
}
|
|
337
|
+
}
|
|
338
|
+
let merged = mergeToolRecommendations(batches);
|
|
339
|
+
// --- 6. Session dedup (already_used) with top-3 retention --------------
|
|
340
|
+
const alreadyCalled = new Set();
|
|
341
|
+
if (!skipSession) {
|
|
342
|
+
for (const q of sessionState.queries) {
|
|
343
|
+
alreadyCalled.add(q.tool);
|
|
344
|
+
}
|
|
345
|
+
}
|
|
346
|
+
const primary = [];
|
|
347
|
+
const alreadyUsed = [];
|
|
348
|
+
for (let i = 0; i < merged.length; i++) {
|
|
349
|
+
const rec = merged[i];
|
|
350
|
+
if (!rec)
|
|
351
|
+
continue;
|
|
352
|
+
const isTop3 = i < 3;
|
|
353
|
+
if (alreadyCalled.has(rec.name) && !isTop3) {
|
|
354
|
+
alreadyUsed.push(rec.name);
|
|
355
|
+
}
|
|
356
|
+
else {
|
|
357
|
+
primary.push(rec);
|
|
358
|
+
}
|
|
359
|
+
}
|
|
360
|
+
// Cap primary tool list
|
|
361
|
+
let tools = primary.slice(0, maxTools);
|
|
362
|
+
// Fallback when nothing survived
|
|
363
|
+
if (tools.length === 0) {
|
|
364
|
+
tools = [
|
|
365
|
+
{
|
|
366
|
+
name: "discover_tools",
|
|
367
|
+
confidence: 0.3,
|
|
368
|
+
reasoning: "No direct matches, fall back to explicit search",
|
|
369
|
+
is_hidden: !CORE_TOOL_NAMES.has("discover_tools"),
|
|
370
|
+
},
|
|
371
|
+
];
|
|
372
|
+
}
|
|
373
|
+
// --- 7. reveal_required: hidden tools in primary ----------------------
|
|
374
|
+
const revealRequired = [];
|
|
375
|
+
for (const rec of tools) {
|
|
376
|
+
if (rec.is_hidden && !CORE_TOOL_NAMES.has(rec.name)) {
|
|
377
|
+
revealRequired.push(rec.name);
|
|
378
|
+
}
|
|
379
|
+
}
|
|
380
|
+
// --- 8. Symbol & file recommendations from index ----------------------
|
|
381
|
+
const symbols = collectSymbolRecommendations(parsed, index).slice(0, MAX_SYMBOLS);
|
|
382
|
+
const files = collectFileRecommendations(parsed, index).slice(0, MAX_FILES);
|
|
383
|
+
// --- 9. Metadata ------------------------------------------------------
|
|
384
|
+
const staleIndex = Date.now() - (index.updated_at ?? index.created_at ?? 0) > STALE_INDEX_THRESHOLD_MS;
|
|
385
|
+
const coldStart = usageFreq.size === 0;
|
|
386
|
+
const frameworkMismatch = detectFrameworkMismatch(parsed.normalized, frameworkTools);
|
|
387
|
+
// Low-discrimination: top two tools within 0.05 of each other
|
|
388
|
+
const top1 = tools[0]?.confidence ?? 0;
|
|
389
|
+
const top2 = tools[1]?.confidence ?? 0;
|
|
390
|
+
const lowDiscrimination = tools.length >= 2 && Math.abs(top1 - top2) < 0.05;
|
|
391
|
+
const overallConfidence = tools.length > 0
|
|
392
|
+
? Math.max(...tools.map((t) => t.confidence))
|
|
393
|
+
: 0;
|
|
394
|
+
// Approximate bm25 candidate count via the batches size (upper bound).
|
|
395
|
+
const bm25Candidates = batches.reduce((sum, b) => sum + b.length, 0);
|
|
396
|
+
const metadata = {
|
|
397
|
+
intents_detected: parsed.intents.length,
|
|
398
|
+
bm25_candidates: bm25Candidates,
|
|
399
|
+
embedding_available: embeddingAvailable,
|
|
400
|
+
session_queries_seen: sessionState.queries.length,
|
|
401
|
+
duration_ms: Date.now() - startedAt,
|
|
402
|
+
...(parsed.truncated ? { truncated: true } : {}),
|
|
403
|
+
...(parsed.is_vague ? { vague_query: true } : {}),
|
|
404
|
+
...(staleIndex ? { stale_index: true } : {}),
|
|
405
|
+
...(lowDiscrimination ? { low_discrimination: true } : {}),
|
|
406
|
+
...(frameworkMismatch ? { framework_mismatch: true } : {}),
|
|
407
|
+
...(coldStart ? { cold_start: true } : {}),
|
|
408
|
+
};
|
|
409
|
+
const result = {
|
|
410
|
+
query,
|
|
411
|
+
truncated: parsed.truncated,
|
|
412
|
+
confidence: Math.round(overallConfidence * 1000) / 1000,
|
|
413
|
+
tools,
|
|
414
|
+
symbols,
|
|
415
|
+
files,
|
|
416
|
+
reveal_required: revealRequired,
|
|
417
|
+
already_used: alreadyUsed,
|
|
418
|
+
metadata,
|
|
419
|
+
};
|
|
420
|
+
if (frameworkTools.length > 0) {
|
|
421
|
+
result.framework_context = frameworkTools.slice(0, 5).join(", ");
|
|
422
|
+
}
|
|
423
|
+
return result;
|
|
424
|
+
}
|
|
425
|
+
// ---------------------------------------------------------------------------
|
|
426
|
+
// Output formatter (Task 9)
|
|
427
|
+
// ---------------------------------------------------------------------------
|
|
428
|
+
/**
|
|
429
|
+
* Format a PlanTurnResult as a human-readable markdown-style string.
|
|
430
|
+
* Edge-case: if no tools, injects a discover_tools fallback.
|
|
431
|
+
*/
|
|
432
|
+
export function formatPlanTurnResult(result) {
|
|
433
|
+
// Edge-case: no tools → inject fallback
|
|
434
|
+
const tools = result.tools.length > 0
|
|
435
|
+
? result.tools.slice(0, 10)
|
|
436
|
+
: [
|
|
437
|
+
{
|
|
438
|
+
name: "discover_tools",
|
|
439
|
+
confidence: 0.3,
|
|
440
|
+
reasoning: "No direct matches, try explicit search",
|
|
441
|
+
is_hidden: false,
|
|
442
|
+
},
|
|
443
|
+
];
|
|
444
|
+
// Cap arrays at spec limits
|
|
445
|
+
const symbols = result.symbols.slice(0, 10);
|
|
446
|
+
const files = result.files.slice(0, 5);
|
|
447
|
+
const lines = [];
|
|
448
|
+
// --- Header ---
|
|
449
|
+
lines.push(`plan_turn: ${result.query}`);
|
|
450
|
+
lines.push(`confidence: ${result.confidence.toFixed(3)} | duration: ${result.metadata.duration_ms}ms`);
|
|
451
|
+
// --- Gap Analysis (early exit) ---
|
|
452
|
+
if (result.gap_analysis) {
|
|
453
|
+
lines.push(`\n⛔ STOP_AND_REPORT_GAP`);
|
|
454
|
+
lines.push(`prior_query: ${result.gap_analysis.prior_query}`);
|
|
455
|
+
lines.push(`prior_result_count: ${result.gap_analysis.prior_result_count}`);
|
|
456
|
+
lines.push(`suggestion: ${result.gap_analysis.suggestion}`);
|
|
457
|
+
return lines.join("\n");
|
|
458
|
+
}
|
|
459
|
+
// --- Tools section (primary) ---
|
|
460
|
+
lines.push(`\n─── Tools (${tools.length}) ───`);
|
|
461
|
+
for (const t of tools) {
|
|
462
|
+
const conf = t.confidence.toFixed(3);
|
|
463
|
+
const hidden = t.is_hidden ? " [hidden]" : "";
|
|
464
|
+
lines.push(` ${t.name}${hidden} confidence: ${conf}`);
|
|
465
|
+
lines.push(` ${t.reasoning}`);
|
|
466
|
+
}
|
|
467
|
+
// --- Already Used ---
|
|
468
|
+
if (result.already_used.length > 0) {
|
|
469
|
+
lines.push(`\n─── Already Used (${result.already_used.length}) ───`);
|
|
470
|
+
lines.push(` ${result.already_used.join(", ")}`);
|
|
471
|
+
}
|
|
472
|
+
// --- Reveal Required ---
|
|
473
|
+
if (result.reveal_required.length > 0) {
|
|
474
|
+
lines.push(`\n─── Reveal Required (${result.reveal_required.length}) ───`);
|
|
475
|
+
lines.push(` These tools are hidden — call describe_tools(names=[...]) to reveal:`);
|
|
476
|
+
lines.push(` ${result.reveal_required.join(", ")}`);
|
|
477
|
+
}
|
|
478
|
+
// --- Symbols ---
|
|
479
|
+
if (symbols.length > 0) {
|
|
480
|
+
lines.push(`\n─── Symbols (${symbols.length}) ───`);
|
|
481
|
+
for (const s of symbols) {
|
|
482
|
+
lines.push(` ${s.kind} ${s.name} ${s.file}:${s.line}`);
|
|
483
|
+
}
|
|
484
|
+
}
|
|
485
|
+
// --- Files ---
|
|
486
|
+
if (files.length > 0) {
|
|
487
|
+
lines.push(`\n─── Files (${files.length}) ───`);
|
|
488
|
+
for (const f of files) {
|
|
489
|
+
lines.push(` ${f.path} score: ${f.score.toFixed(2)} (${f.reason})`);
|
|
490
|
+
}
|
|
491
|
+
}
|
|
492
|
+
// --- Metadata footer (key flags only) ---
|
|
493
|
+
const flags = [];
|
|
494
|
+
if (result.metadata.vague_query)
|
|
495
|
+
flags.push("vague_query");
|
|
496
|
+
if (result.metadata.stale_index)
|
|
497
|
+
flags.push("stale_index");
|
|
498
|
+
if (result.metadata.framework_mismatch)
|
|
499
|
+
flags.push("framework_mismatch");
|
|
500
|
+
if (result.metadata.cold_start)
|
|
501
|
+
flags.push("cold_start");
|
|
502
|
+
if (flags.length > 0) {
|
|
503
|
+
lines.push(`\n─── Flags ───`);
|
|
504
|
+
lines.push(` ${flags.join(", ")}`);
|
|
505
|
+
}
|
|
506
|
+
return lines.join("\n");
|
|
507
|
+
}
|
|
508
|
+
//# sourceMappingURL=plan-turn-tools.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"plan-turn-tools.js","sourceRoot":"","sources":["../../src/tools/plan-turn-tools.ts"],"names":[],"mappings":"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"}
|
|
@@ -13,7 +13,7 @@ export declare const EXTRACTOR_VERSIONS: {
|
|
|
13
13
|
readonly nestjs: "1.0.0";
|
|
14
14
|
readonly nextjs: "1.0.0";
|
|
15
15
|
readonly express: "1.0.0";
|
|
16
|
-
readonly react: "
|
|
16
|
+
readonly react: "2.0.0";
|
|
17
17
|
readonly python: "1.0.0";
|
|
18
18
|
readonly php: "1.0.0";
|
|
19
19
|
readonly astro: "1.0.0";
|
|
@@ -21,7 +21,7 @@ export const EXTRACTOR_VERSIONS = {
|
|
|
21
21
|
nestjs: "1.0.0",
|
|
22
22
|
nextjs: "1.0.0",
|
|
23
23
|
express: "1.0.0",
|
|
24
|
-
react: "
|
|
24
|
+
react: "2.0.0", // Wave 1-4 + Tier 1-4: component/hook kinds, classifyReactKind, isReactClassComponent — forces cache invalidation
|
|
25
25
|
python: "1.0.0",
|
|
26
26
|
php: "1.0.0",
|
|
27
27
|
astro: "1.0.0",
|