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.
Files changed (204) hide show
  1. package/README.md +94 -25
  2. package/dist/cli/help.d.ts.map +1 -1
  3. package/dist/cli/help.js +8 -6
  4. package/dist/cli/help.js.map +1 -1
  5. package/dist/cli/platform.d.ts.map +1 -1
  6. package/dist/cli/platform.js +12 -14
  7. package/dist/cli/platform.js.map +1 -1
  8. package/dist/cli/setup.d.ts +1 -1
  9. package/dist/cli/setup.d.ts.map +1 -1
  10. package/dist/cli/setup.js +30 -6
  11. package/dist/cli/setup.js.map +1 -1
  12. package/dist/formatters.d.ts +2 -2
  13. package/dist/formatters.d.ts.map +1 -1
  14. package/dist/formatters.js +23 -0
  15. package/dist/formatters.js.map +1 -1
  16. package/dist/instructions.d.ts +1 -1
  17. package/dist/instructions.d.ts.map +1 -1
  18. package/dist/instructions.js +21 -21
  19. package/dist/parser/extractors/php.d.ts.map +1 -1
  20. package/dist/parser/extractors/php.js +37 -29
  21. package/dist/parser/extractors/php.js.map +1 -1
  22. package/dist/parser/extractors/typescript.d.ts.map +1 -1
  23. package/dist/parser/extractors/typescript.js +43 -0
  24. package/dist/parser/extractors/typescript.js.map +1 -1
  25. package/dist/parser/parse-cache.d.ts +39 -0
  26. package/dist/parser/parse-cache.d.ts.map +1 -0
  27. package/dist/parser/parse-cache.js +87 -0
  28. package/dist/parser/parse-cache.js.map +1 -0
  29. package/dist/parser/parser-manager.d.ts +1 -1
  30. package/dist/parser/parser-manager.d.ts.map +1 -1
  31. package/dist/parser/parser-manager.js +14 -5
  32. package/dist/parser/parser-manager.js.map +1 -1
  33. package/dist/parser/stub-languages.d.ts +2 -0
  34. package/dist/parser/stub-languages.d.ts.map +1 -0
  35. package/dist/parser/stub-languages.js +5 -0
  36. package/dist/parser/stub-languages.js.map +1 -0
  37. package/dist/register-tool-loaders.d.ts +130 -0
  38. package/dist/register-tool-loaders.d.ts.map +1 -0
  39. package/dist/register-tool-loaders.js +212 -0
  40. package/dist/register-tool-loaders.js.map +1 -0
  41. package/dist/register-tools.d.ts +2 -2
  42. package/dist/register-tools.d.ts.map +1 -1
  43. package/dist/register-tools.js +355 -634
  44. package/dist/register-tools.js.map +1 -1
  45. package/dist/search/tool-ranker.d.ts +90 -0
  46. package/dist/search/tool-ranker.d.ts.map +1 -0
  47. package/dist/search/tool-ranker.js +420 -0
  48. package/dist/search/tool-ranker.js.map +1 -0
  49. package/dist/server.d.ts.map +1 -1
  50. package/dist/server.js +23 -14
  51. package/dist/server.js.map +1 -1
  52. package/dist/storage/usage-tracker.d.ts.map +1 -1
  53. package/dist/storage/usage-tracker.js +4 -1
  54. package/dist/storage/usage-tracker.js.map +1 -1
  55. package/dist/tools/astro-actions.d.ts +54 -0
  56. package/dist/tools/astro-actions.d.ts.map +1 -0
  57. package/dist/tools/astro-actions.js +561 -0
  58. package/dist/tools/astro-actions.js.map +1 -0
  59. package/dist/tools/astro-audit.d.ts +87 -0
  60. package/dist/tools/astro-audit.d.ts.map +1 -0
  61. package/dist/tools/astro-audit.js +345 -0
  62. package/dist/tools/astro-audit.js.map +1 -0
  63. package/dist/tools/astro-content-collections.d.ts +44 -0
  64. package/dist/tools/astro-content-collections.d.ts.map +1 -0
  65. package/dist/tools/astro-content-collections.js +630 -0
  66. package/dist/tools/astro-content-collections.js.map +1 -0
  67. package/dist/tools/astro-islands.d.ts +3 -1
  68. package/dist/tools/astro-islands.d.ts.map +1 -1
  69. package/dist/tools/astro-islands.js +19 -4
  70. package/dist/tools/astro-islands.js.map +1 -1
  71. package/dist/tools/astro-migration.d.ts +31 -0
  72. package/dist/tools/astro-migration.d.ts.map +1 -0
  73. package/dist/tools/astro-migration.js +378 -0
  74. package/dist/tools/astro-migration.js.map +1 -0
  75. package/dist/tools/async-correctness.d.ts +26 -0
  76. package/dist/tools/async-correctness.d.ts.map +1 -0
  77. package/dist/tools/async-correctness.js +166 -0
  78. package/dist/tools/async-correctness.js.map +1 -0
  79. package/dist/tools/django-view-security-tools.d.ts +32 -0
  80. package/dist/tools/django-view-security-tools.d.ts.map +1 -0
  81. package/dist/tools/django-view-security-tools.js +184 -0
  82. package/dist/tools/django-view-security-tools.js.map +1 -0
  83. package/dist/tools/fastapi-depends.d.ts +63 -0
  84. package/dist/tools/fastapi-depends.d.ts.map +1 -0
  85. package/dist/tools/fastapi-depends.js +191 -0
  86. package/dist/tools/fastapi-depends.js.map +1 -0
  87. package/dist/tools/hono-analyze-app.js +1 -9
  88. package/dist/tools/hono-analyze-app.js.map +1 -1
  89. package/dist/tools/hono-api-contract.d.ts.map +1 -1
  90. package/dist/tools/hono-api-contract.js +41 -9
  91. package/dist/tools/hono-api-contract.js.map +1 -1
  92. package/dist/tools/hono-context-flow.js +1 -9
  93. package/dist/tools/hono-context-flow.js.map +1 -1
  94. package/dist/tools/hono-dead-routes.d.ts.map +1 -1
  95. package/dist/tools/hono-dead-routes.js +2 -9
  96. package/dist/tools/hono-dead-routes.js.map +1 -1
  97. package/dist/tools/hono-entry-resolver.d.ts +27 -0
  98. package/dist/tools/hono-entry-resolver.d.ts.map +1 -0
  99. package/dist/tools/hono-entry-resolver.js +31 -0
  100. package/dist/tools/hono-entry-resolver.js.map +1 -0
  101. package/dist/tools/hono-inline-analyze.js +1 -9
  102. package/dist/tools/hono-inline-analyze.js.map +1 -1
  103. package/dist/tools/hono-middleware-chain.d.ts +24 -6
  104. package/dist/tools/hono-middleware-chain.d.ts.map +1 -1
  105. package/dist/tools/hono-middleware-chain.js +77 -40
  106. package/dist/tools/hono-middleware-chain.js.map +1 -1
  107. package/dist/tools/hono-modules.js +1 -9
  108. package/dist/tools/hono-modules.js.map +1 -1
  109. package/dist/tools/hono-response-types.js +1 -9
  110. package/dist/tools/hono-response-types.js.map +1 -1
  111. package/dist/tools/hono-rpc-types.js +1 -9
  112. package/dist/tools/hono-rpc-types.js.map +1 -1
  113. package/dist/tools/hono-security.d.ts +14 -4
  114. package/dist/tools/hono-security.d.ts.map +1 -1
  115. package/dist/tools/hono-security.js +185 -14
  116. package/dist/tools/hono-security.js.map +1 -1
  117. package/dist/tools/hono-visualize.js +1 -9
  118. package/dist/tools/hono-visualize.js.map +1 -1
  119. package/dist/tools/nest-ext-tools.d.ts +115 -0
  120. package/dist/tools/nest-ext-tools.d.ts.map +1 -1
  121. package/dist/tools/nest-ext-tools.js +393 -0
  122. package/dist/tools/nest-ext-tools.js.map +1 -1
  123. package/dist/tools/nest-tools.d.ts +27 -0
  124. package/dist/tools/nest-tools.d.ts.map +1 -1
  125. package/dist/tools/nest-tools.js +137 -37
  126. package/dist/tools/nest-tools.js.map +1 -1
  127. package/dist/tools/nextjs-component-readers.d.ts +101 -0
  128. package/dist/tools/nextjs-component-readers.d.ts.map +1 -0
  129. package/dist/tools/nextjs-component-readers.js +287 -0
  130. package/dist/tools/nextjs-component-readers.js.map +1 -0
  131. package/dist/tools/nextjs-component-tools.d.ts +8 -78
  132. package/dist/tools/nextjs-component-tools.d.ts.map +1 -1
  133. package/dist/tools/nextjs-component-tools.js +9 -257
  134. package/dist/tools/nextjs-component-tools.js.map +1 -1
  135. package/dist/tools/nextjs-framework-audit-tools.d.ts +24 -1
  136. package/dist/tools/nextjs-framework-audit-tools.d.ts.map +1 -1
  137. package/dist/tools/nextjs-framework-audit-tools.js +184 -1
  138. package/dist/tools/nextjs-framework-audit-tools.js.map +1 -1
  139. package/dist/tools/nextjs-route-readers.d.ts +81 -0
  140. package/dist/tools/nextjs-route-readers.d.ts.map +1 -0
  141. package/dist/tools/nextjs-route-readers.js +340 -0
  142. package/dist/tools/nextjs-route-readers.js.map +1 -0
  143. package/dist/tools/nextjs-route-tools.d.ts +7 -71
  144. package/dist/tools/nextjs-route-tools.d.ts.map +1 -1
  145. package/dist/tools/nextjs-route-tools.js +9 -327
  146. package/dist/tools/nextjs-route-tools.js.map +1 -1
  147. package/dist/tools/pattern-tools.d.ts.map +1 -1
  148. package/dist/tools/pattern-tools.js +92 -2
  149. package/dist/tools/pattern-tools.js.map +1 -1
  150. package/dist/tools/php-tools.d.ts +14 -5
  151. package/dist/tools/php-tools.d.ts.map +1 -1
  152. package/dist/tools/php-tools.js +166 -64
  153. package/dist/tools/php-tools.js.map +1 -1
  154. package/dist/tools/plan-turn-tools.d.ts +89 -0
  155. package/dist/tools/plan-turn-tools.d.ts.map +1 -0
  156. package/dist/tools/plan-turn-tools.js +508 -0
  157. package/dist/tools/plan-turn-tools.js.map +1 -0
  158. package/dist/tools/project-tools.d.ts +1 -1
  159. package/dist/tools/project-tools.js +1 -1
  160. package/dist/tools/project-tools.js.map +1 -1
  161. package/dist/tools/pydantic-models.d.ts +46 -0
  162. package/dist/tools/pydantic-models.d.ts.map +1 -0
  163. package/dist/tools/pydantic-models.js +249 -0
  164. package/dist/tools/pydantic-models.js.map +1 -0
  165. package/dist/tools/python-audit.d.ts +40 -0
  166. package/dist/tools/python-audit.d.ts.map +1 -0
  167. package/dist/tools/python-audit.js +244 -0
  168. package/dist/tools/python-audit.js.map +1 -0
  169. package/dist/tools/python-constants-tools.d.ts +44 -0
  170. package/dist/tools/python-constants-tools.d.ts.map +1 -0
  171. package/dist/tools/python-constants-tools.js +525 -0
  172. package/dist/tools/python-constants-tools.js.map +1 -0
  173. package/dist/tools/react-tools.d.ts +46 -1
  174. package/dist/tools/react-tools.d.ts.map +1 -1
  175. package/dist/tools/react-tools.js +126 -1
  176. package/dist/tools/react-tools.js.map +1 -1
  177. package/dist/tools/review-diff-tools.d.ts +5 -0
  178. package/dist/tools/review-diff-tools.d.ts.map +1 -1
  179. package/dist/tools/review-diff-tools.js +109 -3
  180. package/dist/tools/review-diff-tools.js.map +1 -1
  181. package/dist/tools/search-tools.d.ts +3 -2
  182. package/dist/tools/search-tools.d.ts.map +1 -1
  183. package/dist/tools/search-tools.js +16 -3
  184. package/dist/tools/search-tools.js.map +1 -1
  185. package/dist/tools/sql-tools.d.ts +40 -0
  186. package/dist/tools/sql-tools.d.ts.map +1 -1
  187. package/dist/tools/sql-tools.js +123 -0
  188. package/dist/tools/sql-tools.js.map +1 -1
  189. package/dist/tools/symbol-tools.d.ts.map +1 -1
  190. package/dist/tools/symbol-tools.js +7 -10
  191. package/dist/tools/symbol-tools.js.map +1 -1
  192. package/dist/tools/taint-tools.d.ts +43 -0
  193. package/dist/tools/taint-tools.d.ts.map +1 -0
  194. package/dist/tools/taint-tools.js +922 -0
  195. package/dist/tools/taint-tools.js.map +1 -0
  196. package/dist/utils/import-graph.d.ts +6 -0
  197. package/dist/utils/import-graph.d.ts.map +1 -1
  198. package/dist/utils/import-graph.js +43 -7
  199. package/dist/utils/import-graph.js.map +1 -1
  200. package/package.json +3 -3
  201. package/rules/codesift.md +51 -13
  202. package/rules/codesift.mdc +51 -13
  203. package/rules/codex.md +51 -13
  204. 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: "1.0.0";
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: "1.0.0",
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",