codesift-mcp 0.4.0 → 0.5.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.
Files changed (194) 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 +10 -1
  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.map +1 -1
  30. package/dist/parser/parser-manager.js +12 -1
  31. package/dist/parser/parser-manager.js.map +1 -1
  32. package/dist/register-tools.d.ts +2 -2
  33. package/dist/register-tools.d.ts.map +1 -1
  34. package/dist/register-tools.js +353 -570
  35. package/dist/register-tools.js.map +1 -1
  36. package/dist/search/tool-ranker.d.ts +90 -0
  37. package/dist/search/tool-ranker.d.ts.map +1 -0
  38. package/dist/search/tool-ranker.js +420 -0
  39. package/dist/search/tool-ranker.js.map +1 -0
  40. package/dist/server.js +19 -13
  41. package/dist/server.js.map +1 -1
  42. package/dist/storage/usage-tracker.d.ts.map +1 -1
  43. package/dist/storage/usage-tracker.js +4 -1
  44. package/dist/storage/usage-tracker.js.map +1 -1
  45. package/dist/tools/astro-actions.d.ts +54 -0
  46. package/dist/tools/astro-actions.d.ts.map +1 -0
  47. package/dist/tools/astro-actions.js +561 -0
  48. package/dist/tools/astro-actions.js.map +1 -0
  49. package/dist/tools/astro-audit.d.ts +87 -0
  50. package/dist/tools/astro-audit.d.ts.map +1 -0
  51. package/dist/tools/astro-audit.js +345 -0
  52. package/dist/tools/astro-audit.js.map +1 -0
  53. package/dist/tools/astro-content-collections.d.ts +44 -0
  54. package/dist/tools/astro-content-collections.d.ts.map +1 -0
  55. package/dist/tools/astro-content-collections.js +630 -0
  56. package/dist/tools/astro-content-collections.js.map +1 -0
  57. package/dist/tools/astro-islands.d.ts +3 -1
  58. package/dist/tools/astro-islands.d.ts.map +1 -1
  59. package/dist/tools/astro-islands.js +19 -4
  60. package/dist/tools/astro-islands.js.map +1 -1
  61. package/dist/tools/astro-migration.d.ts +31 -0
  62. package/dist/tools/astro-migration.d.ts.map +1 -0
  63. package/dist/tools/astro-migration.js +378 -0
  64. package/dist/tools/astro-migration.js.map +1 -0
  65. package/dist/tools/async-correctness.d.ts +26 -0
  66. package/dist/tools/async-correctness.d.ts.map +1 -0
  67. package/dist/tools/async-correctness.js +166 -0
  68. package/dist/tools/async-correctness.js.map +1 -0
  69. package/dist/tools/django-view-security-tools.d.ts +32 -0
  70. package/dist/tools/django-view-security-tools.d.ts.map +1 -0
  71. package/dist/tools/django-view-security-tools.js +184 -0
  72. package/dist/tools/django-view-security-tools.js.map +1 -0
  73. package/dist/tools/fastapi-depends.d.ts +63 -0
  74. package/dist/tools/fastapi-depends.d.ts.map +1 -0
  75. package/dist/tools/fastapi-depends.js +191 -0
  76. package/dist/tools/fastapi-depends.js.map +1 -0
  77. package/dist/tools/hono-analyze-app.js +1 -9
  78. package/dist/tools/hono-analyze-app.js.map +1 -1
  79. package/dist/tools/hono-api-contract.d.ts.map +1 -1
  80. package/dist/tools/hono-api-contract.js +41 -9
  81. package/dist/tools/hono-api-contract.js.map +1 -1
  82. package/dist/tools/hono-context-flow.js +1 -9
  83. package/dist/tools/hono-context-flow.js.map +1 -1
  84. package/dist/tools/hono-dead-routes.d.ts.map +1 -1
  85. package/dist/tools/hono-dead-routes.js +2 -9
  86. package/dist/tools/hono-dead-routes.js.map +1 -1
  87. package/dist/tools/hono-entry-resolver.d.ts +27 -0
  88. package/dist/tools/hono-entry-resolver.d.ts.map +1 -0
  89. package/dist/tools/hono-entry-resolver.js +31 -0
  90. package/dist/tools/hono-entry-resolver.js.map +1 -0
  91. package/dist/tools/hono-inline-analyze.js +1 -9
  92. package/dist/tools/hono-inline-analyze.js.map +1 -1
  93. package/dist/tools/hono-middleware-chain.d.ts +24 -6
  94. package/dist/tools/hono-middleware-chain.d.ts.map +1 -1
  95. package/dist/tools/hono-middleware-chain.js +77 -40
  96. package/dist/tools/hono-middleware-chain.js.map +1 -1
  97. package/dist/tools/hono-modules.js +1 -9
  98. package/dist/tools/hono-modules.js.map +1 -1
  99. package/dist/tools/hono-response-types.js +1 -9
  100. package/dist/tools/hono-response-types.js.map +1 -1
  101. package/dist/tools/hono-rpc-types.js +1 -9
  102. package/dist/tools/hono-rpc-types.js.map +1 -1
  103. package/dist/tools/hono-security.d.ts +14 -4
  104. package/dist/tools/hono-security.d.ts.map +1 -1
  105. package/dist/tools/hono-security.js +185 -14
  106. package/dist/tools/hono-security.js.map +1 -1
  107. package/dist/tools/hono-visualize.js +1 -9
  108. package/dist/tools/hono-visualize.js.map +1 -1
  109. package/dist/tools/nest-ext-tools.d.ts +115 -0
  110. package/dist/tools/nest-ext-tools.d.ts.map +1 -1
  111. package/dist/tools/nest-ext-tools.js +393 -0
  112. package/dist/tools/nest-ext-tools.js.map +1 -1
  113. package/dist/tools/nest-tools.d.ts +27 -0
  114. package/dist/tools/nest-tools.d.ts.map +1 -1
  115. package/dist/tools/nest-tools.js +137 -37
  116. package/dist/tools/nest-tools.js.map +1 -1
  117. package/dist/tools/nextjs-component-readers.d.ts +101 -0
  118. package/dist/tools/nextjs-component-readers.d.ts.map +1 -0
  119. package/dist/tools/nextjs-component-readers.js +287 -0
  120. package/dist/tools/nextjs-component-readers.js.map +1 -0
  121. package/dist/tools/nextjs-component-tools.d.ts +8 -78
  122. package/dist/tools/nextjs-component-tools.d.ts.map +1 -1
  123. package/dist/tools/nextjs-component-tools.js +9 -257
  124. package/dist/tools/nextjs-component-tools.js.map +1 -1
  125. package/dist/tools/nextjs-framework-audit-tools.d.ts +24 -1
  126. package/dist/tools/nextjs-framework-audit-tools.d.ts.map +1 -1
  127. package/dist/tools/nextjs-framework-audit-tools.js +184 -1
  128. package/dist/tools/nextjs-framework-audit-tools.js.map +1 -1
  129. package/dist/tools/nextjs-route-readers.d.ts +81 -0
  130. package/dist/tools/nextjs-route-readers.d.ts.map +1 -0
  131. package/dist/tools/nextjs-route-readers.js +340 -0
  132. package/dist/tools/nextjs-route-readers.js.map +1 -0
  133. package/dist/tools/nextjs-route-tools.d.ts +7 -71
  134. package/dist/tools/nextjs-route-tools.d.ts.map +1 -1
  135. package/dist/tools/nextjs-route-tools.js +9 -327
  136. package/dist/tools/nextjs-route-tools.js.map +1 -1
  137. package/dist/tools/pattern-tools.d.ts.map +1 -1
  138. package/dist/tools/pattern-tools.js +92 -2
  139. package/dist/tools/pattern-tools.js.map +1 -1
  140. package/dist/tools/php-tools.d.ts +14 -5
  141. package/dist/tools/php-tools.d.ts.map +1 -1
  142. package/dist/tools/php-tools.js +166 -64
  143. package/dist/tools/php-tools.js.map +1 -1
  144. package/dist/tools/plan-turn-tools.d.ts +89 -0
  145. package/dist/tools/plan-turn-tools.d.ts.map +1 -0
  146. package/dist/tools/plan-turn-tools.js +508 -0
  147. package/dist/tools/plan-turn-tools.js.map +1 -0
  148. package/dist/tools/project-tools.d.ts +1 -1
  149. package/dist/tools/project-tools.js +1 -1
  150. package/dist/tools/project-tools.js.map +1 -1
  151. package/dist/tools/pydantic-models.d.ts +46 -0
  152. package/dist/tools/pydantic-models.d.ts.map +1 -0
  153. package/dist/tools/pydantic-models.js +249 -0
  154. package/dist/tools/pydantic-models.js.map +1 -0
  155. package/dist/tools/python-audit.d.ts +40 -0
  156. package/dist/tools/python-audit.d.ts.map +1 -0
  157. package/dist/tools/python-audit.js +244 -0
  158. package/dist/tools/python-audit.js.map +1 -0
  159. package/dist/tools/python-constants-tools.d.ts +44 -0
  160. package/dist/tools/python-constants-tools.d.ts.map +1 -0
  161. package/dist/tools/python-constants-tools.js +525 -0
  162. package/dist/tools/python-constants-tools.js.map +1 -0
  163. package/dist/tools/react-tools.d.ts +46 -1
  164. package/dist/tools/react-tools.d.ts.map +1 -1
  165. package/dist/tools/react-tools.js +126 -1
  166. package/dist/tools/react-tools.js.map +1 -1
  167. package/dist/tools/review-diff-tools.d.ts +5 -0
  168. package/dist/tools/review-diff-tools.d.ts.map +1 -1
  169. package/dist/tools/review-diff-tools.js +109 -3
  170. package/dist/tools/review-diff-tools.js.map +1 -1
  171. package/dist/tools/search-tools.d.ts +3 -2
  172. package/dist/tools/search-tools.d.ts.map +1 -1
  173. package/dist/tools/search-tools.js +16 -3
  174. package/dist/tools/search-tools.js.map +1 -1
  175. package/dist/tools/sql-tools.d.ts +40 -0
  176. package/dist/tools/sql-tools.d.ts.map +1 -1
  177. package/dist/tools/sql-tools.js +123 -0
  178. package/dist/tools/sql-tools.js.map +1 -1
  179. package/dist/tools/symbol-tools.d.ts.map +1 -1
  180. package/dist/tools/symbol-tools.js +7 -10
  181. package/dist/tools/symbol-tools.js.map +1 -1
  182. package/dist/tools/taint-tools.d.ts +43 -0
  183. package/dist/tools/taint-tools.d.ts.map +1 -0
  184. package/dist/tools/taint-tools.js +922 -0
  185. package/dist/tools/taint-tools.js.map +1 -0
  186. package/dist/utils/import-graph.d.ts +6 -0
  187. package/dist/utils/import-graph.d.ts.map +1 -1
  188. package/dist/utils/import-graph.js +43 -7
  189. package/dist/utils/import-graph.js.map +1 -1
  190. package/package.json +2 -2
  191. package/rules/codesift.md +51 -13
  192. package/rules/codesift.mdc +51 -13
  193. package/rules/codex.md +51 -13
  194. package/rules/gemini.md +51 -13
@@ -0,0 +1,90 @@
1
+ /**
2
+ * Tool-ranker — ranks MCP tool definitions against a natural-language query
3
+ * using BM25 (lexical), exact-name (identity), embedding cosine (semantic),
4
+ * usage frequency (structural), and framework-match (framework) signals.
5
+ *
6
+ * Used by the `plan_turn` / tool-recommendation meta tools to surface the
7
+ * most relevant tools for an agent's current intent.
8
+ *
9
+ * All signals are optional — semantic and structural gracefully degrade to
10
+ * zero when the corresponding input is unavailable (e.g. no embedding API
11
+ * key, fresh session with no usage history).
12
+ */
13
+ import { type BM25Index } from "./bm25.js";
14
+ import type { ToolDefinition } from "../register-tools.js";
15
+ export interface ToolRecommendation {
16
+ name: string;
17
+ confidence: number;
18
+ reasoning: string;
19
+ suggested_params?: Record<string, string>;
20
+ is_hidden: boolean;
21
+ }
22
+ export interface ToolRankerContext {
23
+ query: string;
24
+ toolDefs: ToolDefinition[];
25
+ embeddings: Map<string, number[]> | null;
26
+ queryEmbedding: number[] | null;
27
+ usageFrequency: Map<string, number>;
28
+ frameworkTools: string[];
29
+ /**
30
+ * Names of tools visible in ListTools (core tools). When provided, tools
31
+ * outside this set are flagged as `is_hidden=true` in the recommendation.
32
+ * Defaults to an empty set → every tool is reported as hidden.
33
+ */
34
+ coreToolNames?: Set<string>;
35
+ }
36
+ /** Per-signal contributions for a single tool — used for reasoning + debugging. */
37
+ interface SignalBreakdown {
38
+ lexical: number;
39
+ identity: number;
40
+ semantic: number;
41
+ structural: number;
42
+ framework: number;
43
+ lexicalTokens: string[];
44
+ }
45
+ /**
46
+ * Compute a stable fingerprint for a list of tool definitions. Used to
47
+ * invalidate the BM25 cache when the tool catalog is modified (tests,
48
+ * hot-reload, new deployments).
49
+ *
50
+ * Exported for tests that need to predict cache-hit behaviour.
51
+ */
52
+ export declare function toolDefsFingerprint(toolDefs: ToolDefinition[]): string;
53
+ /**
54
+ * Build (or return cached) BM25 index for a tool catalog. Cache is keyed
55
+ * by fingerprint — subsequent calls with the same shape return instantly.
56
+ */
57
+ export declare function buildToolBM25Index(toolDefs: ToolDefinition[]): BM25Index;
58
+ /** Clear the BM25 cache — for tests and hot-reload. */
59
+ export declare function clearToolBM25Cache(): void;
60
+ /**
61
+ * Render a one-line, human-readable reason explaining why this tool was
62
+ * picked. Falls back to a generic "general match" when no signal dominates.
63
+ */
64
+ export declare function generateReasoning(id: string, query: string, signals: SignalBreakdown): string;
65
+ /**
66
+ * Rank tools against a natural-language query by combining lexical, identity,
67
+ * semantic, structural, and framework signals. Returns up to 10 `ToolRecommendation`
68
+ * entries sorted by raw weighted score, with calibrated confidence values.
69
+ *
70
+ * Gracefully handles missing inputs:
71
+ * - no embeddings → semantic contribution is 0
72
+ * - empty usageFrequency → structural contribution is 0
73
+ * - empty frameworkTools → framework contribution is 0
74
+ */
75
+ export declare function rankTools(ctx: ToolRankerContext): ToolRecommendation[];
76
+ /** Absolute path to the on-disk tool-embedding cache. */
77
+ export declare function getToolEmbeddingCachePath(): string;
78
+ /**
79
+ * Fetch (or compute) embeddings for every tool in `defs`. Uses the on-disk
80
+ * cache when the fingerprint matches; otherwise regenerates via the configured
81
+ * embedding provider and persists the result.
82
+ *
83
+ * Returns:
84
+ * - `Map<toolName, number[]>` on success
85
+ * - `null` when no embedding provider is configured (no API key) or the
86
+ * provider call fails — callers should degrade to non-semantic ranking.
87
+ */
88
+ export declare function getToolEmbeddings(defs: ToolDefinition[]): Promise<Map<string, number[]> | null>;
89
+ export {};
90
+ //# sourceMappingURL=tool-ranker.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tool-ranker.d.ts","sourceRoot":"","sources":["../../src/search/tool-ranker.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAOH,OAAO,EAA4C,KAAK,SAAS,EAAE,MAAM,WAAW,CAAC;AAMrF,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAM3D,MAAM,WAAW,kBAAkB;IACjC,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;IAClB,gBAAgB,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC1C,SAAS,EAAE,OAAO,CAAC;CACpB;AAED,MAAM,WAAW,iBAAiB;IAChC,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,cAAc,EAAE,CAAC;IAC3B,UAAU,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,GAAG,IAAI,CAAC;IACzC,cAAc,EAAE,MAAM,EAAE,GAAG,IAAI,CAAC;IAChC,cAAc,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACpC,cAAc,EAAE,MAAM,EAAE,CAAC;IACzB;;;;OAIG;IACH,aAAa,CAAC,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;CAC7B;AAED,mFAAmF;AACnF,UAAU,eAAe;IACvB,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;IAClB,aAAa,EAAE,MAAM,EAAE,CAAC;CACzB;AAqCD;;;;;;GAMG;AACH,wBAAgB,mBAAmB,CAAC,QAAQ,EAAE,cAAc,EAAE,GAAG,MAAM,CAatE;AA0BD;;;GAGG;AACH,wBAAgB,kBAAkB,CAAC,QAAQ,EAAE,cAAc,EAAE,GAAG,SAAS,CAUxE;AAED,uDAAuD;AACvD,wBAAgB,kBAAkB,IAAI,IAAI,CAEzC;AAuFD;;;GAGG;AACH,wBAAgB,iBAAiB,CAC/B,EAAE,EAAE,MAAM,EACV,KAAK,EAAE,MAAM,EACb,OAAO,EAAE,eAAe,GACvB,MAAM,CA+BR;AAgDD;;;;;;;;;GASG;AACH,wBAAgB,SAAS,CAAC,GAAG,EAAE,iBAAiB,GAAG,kBAAkB,EAAE,CA2FtE;AAaD,yDAAyD;AACzD,wBAAgB,yBAAyB,IAAI,MAAM,CAElD;AAiCD;;;;;;;;;GASG;AACH,wBAAsB,iBAAiB,CACrC,IAAI,EAAE,cAAc,EAAE,GACrB,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,GAAG,IAAI,CAAC,CAuDvC"}
@@ -0,0 +1,420 @@
1
+ /**
2
+ * Tool-ranker — ranks MCP tool definitions against a natural-language query
3
+ * using BM25 (lexical), exact-name (identity), embedding cosine (semantic),
4
+ * usage frequency (structural), and framework-match (framework) signals.
5
+ *
6
+ * Used by the `plan_turn` / tool-recommendation meta tools to surface the
7
+ * most relevant tools for an agent's current intent.
8
+ *
9
+ * All signals are optional — semantic and structural gracefully degrade to
10
+ * zero when the corresponding input is unavailable (e.g. no embedding API
11
+ * key, fresh session with no usage history).
12
+ */
13
+ import { createHash } from "node:crypto";
14
+ import { readFile } from "node:fs/promises";
15
+ import { homedir } from "node:os";
16
+ import { join } from "node:path";
17
+ import { buildBM25Index, searchBM25, tokenizeText } from "./bm25.js";
18
+ import { batchEmbed } from "../storage/embedding-store.js";
19
+ import { createEmbeddingProvider } from "./semantic.js";
20
+ import { loadConfig } from "../config.js";
21
+ import { atomicWriteFile } from "../storage/_shared.js";
22
+ // ---------------------------------------------------------------------------
23
+ // Signal weights
24
+ // ---------------------------------------------------------------------------
25
+ const W_LEXICAL = 1.0;
26
+ const W_IDENTITY = 2.0;
27
+ const W_SEMANTIC = 0.8;
28
+ const W_STRUCTURAL = 0.4;
29
+ const W_FRAMEWORK = 0.6;
30
+ const BM25_TOP_K = 50;
31
+ const MAX_RECOMMENDATIONS = 10;
32
+ // Field weights for the synthetic tool BM25 index. We keep this separate from
33
+ // the global code-symbol weights because for tools, `signature` holds the
34
+ // description and `docstring` holds the searchHint — name is still king.
35
+ const TOOL_FIELD_WEIGHTS = {
36
+ name: 5.0,
37
+ signature: 2.5,
38
+ docstring: 2.0,
39
+ body: 0.0,
40
+ comments: 0.0,
41
+ };
42
+ let bm25Cache = null;
43
+ /**
44
+ * Compute a stable fingerprint for a list of tool definitions. Used to
45
+ * invalidate the BM25 cache when the tool catalog is modified (tests,
46
+ * hot-reload, new deployments).
47
+ *
48
+ * Exported for tests that need to predict cache-hit behaviour.
49
+ */
50
+ export function toolDefsFingerprint(toolDefs) {
51
+ // Stable subset: name, description, searchHint, category. Schema handler
52
+ // is not stringifiable and not relevant to ranking.
53
+ const subset = toolDefs.map((d) => [
54
+ d.name,
55
+ d.description,
56
+ d.searchHint ?? "",
57
+ d.category ?? "",
58
+ ]);
59
+ return createHash("sha1")
60
+ .update(JSON.stringify(subset))
61
+ .digest("hex")
62
+ .slice(0, 16);
63
+ }
64
+ /**
65
+ * Map a `ToolDefinition` to a synthetic `CodeSymbol` so we can reuse the
66
+ * existing BM25 index and scoring pipeline.
67
+ *
68
+ * - id / name → tool name
69
+ * - signature → description (BM25 will tokenise it)
70
+ * - docstring → searchHint keywords
71
+ * - file → "__tools__/{category}.tool"
72
+ */
73
+ function toolToSymbol(def) {
74
+ const category = def.category ?? "uncategorized";
75
+ return {
76
+ id: def.name,
77
+ repo: "__tools__",
78
+ name: def.name,
79
+ kind: "function",
80
+ file: `__tools__/${category}.tool`,
81
+ start_line: 1,
82
+ end_line: 1,
83
+ signature: def.description,
84
+ docstring: def.searchHint ?? "",
85
+ };
86
+ }
87
+ /**
88
+ * Build (or return cached) BM25 index for a tool catalog. Cache is keyed
89
+ * by fingerprint — subsequent calls with the same shape return instantly.
90
+ */
91
+ export function buildToolBM25Index(toolDefs) {
92
+ const fingerprint = toolDefsFingerprint(toolDefs);
93
+ if (bm25Cache && bm25Cache.fingerprint === fingerprint) {
94
+ return bm25Cache.index;
95
+ }
96
+ const symbols = toolDefs.map(toolToSymbol);
97
+ const index = buildBM25Index(symbols);
98
+ bm25Cache = { fingerprint, index };
99
+ return index;
100
+ }
101
+ /** Clear the BM25 cache — for tests and hot-reload. */
102
+ export function clearToolBM25Cache() {
103
+ bm25Cache = null;
104
+ }
105
+ // ---------------------------------------------------------------------------
106
+ // Helpers — signal computation
107
+ // ---------------------------------------------------------------------------
108
+ /**
109
+ * Compute BM25 lexical score and matched tokens for each tool.
110
+ * Returns a map from tool name → { score (normalised 0..1), matches }.
111
+ */
112
+ function computeLexical(query, index) {
113
+ const results = searchBM25(index, query, BM25_TOP_K, TOOL_FIELD_WEIGHTS);
114
+ const out = new Map();
115
+ if (results.length === 0)
116
+ return out;
117
+ const top = results[0]?.score ?? 0;
118
+ if (top <= 0)
119
+ return out;
120
+ for (const r of results) {
121
+ const normalised = r.score / top;
122
+ out.set(r.symbol.id, {
123
+ score: normalised,
124
+ matches: r.matches ?? [],
125
+ });
126
+ }
127
+ return out;
128
+ }
129
+ /**
130
+ * Identity signal — tool name appears verbatim in the query (case-insensitive).
131
+ * Returns 1.0 for an exact substring match, else 0.
132
+ */
133
+ function computeIdentity(query, toolName) {
134
+ const q = query.toLowerCase();
135
+ const n = toolName.toLowerCase();
136
+ if (!n)
137
+ return 0;
138
+ // Whole-name appearance
139
+ if (q.includes(n))
140
+ return 1;
141
+ // snake_case → space-separated variant (e.g. "find dead code" vs "find_dead_code")
142
+ const spaced = n.replace(/_/g, " ");
143
+ if (q.includes(spaced))
144
+ return 1;
145
+ return 0;
146
+ }
147
+ /**
148
+ * Cosine similarity between two equal-length vectors.
149
+ * Returns 0 when lengths differ (defensive — caller guarantees equality).
150
+ */
151
+ function cosine(a, b) {
152
+ if (a.length !== b.length || a.length === 0)
153
+ return 0;
154
+ let dot = 0;
155
+ let nA = 0;
156
+ let nB = 0;
157
+ for (let i = 0; i < a.length; i++) {
158
+ const ai = a[i] ?? 0;
159
+ const bi = b[i] ?? 0;
160
+ dot += ai * bi;
161
+ nA += ai * ai;
162
+ nB += bi * bi;
163
+ }
164
+ const denom = Math.sqrt(nA) * Math.sqrt(nB);
165
+ return denom > 0 ? dot / denom : 0;
166
+ }
167
+ /**
168
+ * Structural signal — normalised usage frequency.
169
+ * Returns value / max(values), clamped to [0..1].
170
+ */
171
+ function normaliseUsage(usage, toolName) {
172
+ if (usage.size === 0)
173
+ return 0;
174
+ const value = usage.get(toolName) ?? 0;
175
+ if (value <= 0)
176
+ return 0;
177
+ let max = 0;
178
+ for (const v of usage.values())
179
+ if (v > max)
180
+ max = v;
181
+ return max > 0 ? Math.min(1, value / max) : 0;
182
+ }
183
+ // ---------------------------------------------------------------------------
184
+ // Task 4 — Reasoning template
185
+ // ---------------------------------------------------------------------------
186
+ /**
187
+ * Render a one-line, human-readable reason explaining why this tool was
188
+ * picked. Falls back to a generic "general match" when no signal dominates.
189
+ */
190
+ export function generateReasoning(id, query, signals) {
191
+ const reasons = [];
192
+ if (signals.identity > 0) {
193
+ reasons.push("exact name match");
194
+ }
195
+ if (signals.lexical > 0.01 && signals.lexicalTokens.length > 0) {
196
+ const top = signals.lexicalTokens.slice(0, 3).join(", ");
197
+ reasons.push(`keywords: ${top}`);
198
+ }
199
+ if (signals.semantic >= 0.55) {
200
+ reasons.push("semantic similarity");
201
+ }
202
+ if (signals.structural >= 0.5) {
203
+ reasons.push("high usage frequency");
204
+ }
205
+ if (signals.framework > 0) {
206
+ reasons.push("relevant to project stack");
207
+ }
208
+ if (reasons.length === 0) {
209
+ // Fall back — still mention what was attempted.
210
+ const stem = query.trim().slice(0, 30) || id;
211
+ return `general match for "${stem}"`;
212
+ }
213
+ return reasons.join("; ");
214
+ }
215
+ // ---------------------------------------------------------------------------
216
+ // Confidence calibration
217
+ // ---------------------------------------------------------------------------
218
+ const VAGUE_WORDS = new Set([
219
+ "help", "code", "find", "search", "what", "how", "show", "look",
220
+ ]);
221
+ /**
222
+ * Apply calibration rules that cap confidence for vague or ambiguous queries.
223
+ * Returns the (possibly reduced) confidence for the top recommendation and
224
+ * by extension all downstream confidences (scaled proportionally).
225
+ */
226
+ function calibrationCap(query, tokens, topScore, secondScore) {
227
+ const trimmed = query.trim();
228
+ const wordCount = trimmed.split(/\s+/).filter(Boolean).length;
229
+ // Rule 1 — vague query (all tokens in VAGUE_WORDS, or very short)
230
+ const allVague = tokens.length > 0 && tokens.every((t) => VAGUE_WORDS.has(t));
231
+ if (trimmed.length < 10 || allVague) {
232
+ return 0.5;
233
+ }
234
+ // Rule 2 — single-keyword query
235
+ if (wordCount === 1 || tokens.length <= 1) {
236
+ return 0.6;
237
+ }
238
+ // Rule 3 — low discrimination: top and runner-up are indistinguishable
239
+ if (topScore > 0 && topScore - secondScore < 0.1) {
240
+ return 0.4;
241
+ }
242
+ return 1.0; // no cap
243
+ }
244
+ // ---------------------------------------------------------------------------
245
+ // Task 2 + 3 — rankTools
246
+ // ---------------------------------------------------------------------------
247
+ /**
248
+ * Rank tools against a natural-language query by combining lexical, identity,
249
+ * semantic, structural, and framework signals. Returns up to 10 `ToolRecommendation`
250
+ * entries sorted by raw weighted score, with calibrated confidence values.
251
+ *
252
+ * Gracefully handles missing inputs:
253
+ * - no embeddings → semantic contribution is 0
254
+ * - empty usageFrequency → structural contribution is 0
255
+ * - empty frameworkTools → framework contribution is 0
256
+ */
257
+ export function rankTools(ctx) {
258
+ const { query, toolDefs, embeddings, queryEmbedding, usageFrequency, frameworkTools } = ctx;
259
+ const coreToolNames = ctx.coreToolNames ?? new Set();
260
+ if (toolDefs.length === 0 || !query.trim())
261
+ return [];
262
+ const queryTokens = tokenizeText(query);
263
+ const frameworkSet = new Set(frameworkTools);
264
+ // --- Lexical (BM25) -------------------------------------------------
265
+ const index = buildToolBM25Index(toolDefs);
266
+ const lexical = computeLexical(query, index);
267
+ // --- Semantic (iterate ALL tools, not just BM25 candidates) --------
268
+ const semantic = new Map();
269
+ if (embeddings && queryEmbedding && queryEmbedding.length > 0) {
270
+ for (const def of toolDefs) {
271
+ const vec = embeddings.get(def.name);
272
+ if (!vec || vec.length === 0)
273
+ continue;
274
+ const sim = cosine(queryEmbedding, vec);
275
+ if (sim > 0)
276
+ semantic.set(def.name, sim);
277
+ }
278
+ }
279
+ const scored = [];
280
+ for (const def of toolDefs) {
281
+ const lex = lexical.get(def.name);
282
+ const lexScore = lex?.score ?? 0;
283
+ const lexTokens = lex?.matches ?? [];
284
+ const idScore = computeIdentity(query, def.name);
285
+ const semScore = semantic.get(def.name) ?? 0;
286
+ const strScore = normaliseUsage(usageFrequency, def.name);
287
+ const frameworkScore = frameworkSet.has(def.name) ? 1 : 0;
288
+ const raw = W_LEXICAL * lexScore +
289
+ W_IDENTITY * idScore +
290
+ W_SEMANTIC * semScore +
291
+ W_STRUCTURAL * strScore +
292
+ W_FRAMEWORK * frameworkScore;
293
+ if (raw <= 0)
294
+ continue;
295
+ scored.push({
296
+ def,
297
+ raw,
298
+ signals: {
299
+ lexical: lexScore,
300
+ identity: idScore,
301
+ semantic: semScore,
302
+ structural: strScore,
303
+ framework: frameworkScore,
304
+ lexicalTokens: lexTokens,
305
+ },
306
+ });
307
+ }
308
+ scored.sort((a, b) => b.raw - a.raw);
309
+ const top = scored.slice(0, MAX_RECOMMENDATIONS);
310
+ if (top.length === 0)
311
+ return [];
312
+ // --- Confidence normalisation + calibration ------------------------
313
+ const topRaw = top[0]?.raw ?? 0;
314
+ const secondRaw = top[1]?.raw ?? 0;
315
+ const cap = calibrationCap(query, queryTokens, topRaw, secondRaw);
316
+ const recommendations = top.map((s) => {
317
+ // Normalise raw → 0..1 via division by topRaw, then apply cap.
318
+ const normalised = topRaw > 0 ? s.raw / topRaw : 0;
319
+ const confidence = Math.max(0, Math.min(cap, normalised * cap));
320
+ const reasoning = generateReasoning(s.def.name, query, s.signals);
321
+ const isHidden = !coreToolNames.has(s.def.name);
322
+ const rec = {
323
+ name: s.def.name,
324
+ confidence: Math.round(confidence * 1000) / 1000,
325
+ reasoning,
326
+ is_hidden: isHidden,
327
+ };
328
+ return rec;
329
+ });
330
+ return recommendations;
331
+ }
332
+ // ---------------------------------------------------------------------------
333
+ // Task 5 — Tool-embedding cache
334
+ // ---------------------------------------------------------------------------
335
+ const TOOL_EMBEDDING_CACHE_KEY = "__tool_descriptions__";
336
+ /** Absolute path to the on-disk tool-embedding cache. */
337
+ export function getToolEmbeddingCachePath() {
338
+ return join(homedir(), ".codesift", "tool-embeddings.ndjson");
339
+ }
340
+ async function readToolEmbeddingCache(path) {
341
+ try {
342
+ const raw = await readFile(path, "utf-8");
343
+ const parsed = JSON.parse(raw);
344
+ if (typeof parsed === "object" &&
345
+ parsed !== null &&
346
+ typeof parsed["fingerprint"] === "string" &&
347
+ typeof parsed["embeddings"] === "object") {
348
+ return parsed;
349
+ }
350
+ return null;
351
+ }
352
+ catch {
353
+ return null;
354
+ }
355
+ }
356
+ async function writeToolEmbeddingCache(path, cache) {
357
+ try {
358
+ await atomicWriteFile(path, JSON.stringify(cache));
359
+ }
360
+ catch {
361
+ // Cache write failures are non-fatal — ranker still works, just slower next call.
362
+ }
363
+ }
364
+ /**
365
+ * Fetch (or compute) embeddings for every tool in `defs`. Uses the on-disk
366
+ * cache when the fingerprint matches; otherwise regenerates via the configured
367
+ * embedding provider and persists the result.
368
+ *
369
+ * Returns:
370
+ * - `Map<toolName, number[]>` on success
371
+ * - `null` when no embedding provider is configured (no API key) or the
372
+ * provider call fails — callers should degrade to non-semantic ranking.
373
+ */
374
+ export async function getToolEmbeddings(defs) {
375
+ if (defs.length === 0)
376
+ return new Map();
377
+ const config = loadConfig();
378
+ if (!config.embeddingProvider)
379
+ return null;
380
+ const fingerprint = toolDefsFingerprint(defs);
381
+ const cachePath = getToolEmbeddingCachePath();
382
+ const cached = await readToolEmbeddingCache(cachePath);
383
+ if (cached && cached.fingerprint === fingerprint) {
384
+ const m = new Map();
385
+ for (const [k, v] of Object.entries(cached.embeddings)) {
386
+ if (Array.isArray(v))
387
+ m.set(k, v);
388
+ }
389
+ return m;
390
+ }
391
+ // Regenerate via provider
392
+ try {
393
+ const provider = createEmbeddingProvider(config.embeddingProvider, config);
394
+ const texts = new Map();
395
+ for (const d of defs) {
396
+ const text = [d.name, d.description, d.searchHint ?? ""]
397
+ .filter(Boolean)
398
+ .join("\n");
399
+ texts.set(d.name, text);
400
+ }
401
+ const existing = new Map();
402
+ const result = await batchEmbed(texts, existing, provider.embed.bind(provider), config.embeddingBatchSize, TOOL_EMBEDDING_CACHE_KEY);
403
+ const out = new Map();
404
+ const recordForDisk = {};
405
+ for (const [name, vec] of result) {
406
+ const asArray = Array.from(vec);
407
+ out.set(name, asArray);
408
+ recordForDisk[name] = asArray;
409
+ }
410
+ await writeToolEmbeddingCache(cachePath, {
411
+ fingerprint,
412
+ embeddings: recordForDisk,
413
+ });
414
+ return out;
415
+ }
416
+ catch {
417
+ return null;
418
+ }
419
+ }
420
+ //# sourceMappingURL=tool-ranker.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tool-ranker.js","sourceRoot":"","sources":["../../src/search/tool-ranker.ts"],"names":[],"mappings":"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"}
package/dist/server.js CHANGED
@@ -7,7 +7,7 @@ import { autoDiscoverConversations } from "./tools/conversation-tools.js";
7
7
  import { autoIndexCurrentRepo } from "./tools/index-tools.js";
8
8
  import { CODESIFT_INSTRUCTIONS } from "./instructions.js";
9
9
  import { setupHooksForPlatform } from "./cli/setup.js";
10
- import { detectPlatform } from "./cli/platform.js";
10
+ import { detectPlatform, detectPlatformFromClientInfo } from "./cli/platform.js";
11
11
  // Re-export for test compatibility
12
12
  export { buildResponseHint, resetSessionState } from "./server-helpers.js";
13
13
  export { resetSession } from "./storage/session-state.js";
@@ -48,6 +48,23 @@ async function autoEnableFrameworkToolsFromPackageJson(cwd) {
48
48
  }
49
49
  async function main() {
50
50
  const transport = new StdioServerTransport();
51
+ const envPlatform = detectPlatform();
52
+ let hooksInstalledFor = null;
53
+ const installHooks = (platform, reason) => {
54
+ if (platform === "unknown" || hooksInstalledFor !== null)
55
+ return;
56
+ hooksInstalledFor = platform;
57
+ setupHooksForPlatform(platform).catch((err) => {
58
+ console.error(`[codesift] hook auto-install failed (${reason}:${platform}):`, err);
59
+ });
60
+ };
61
+ server.server.oninitialized = () => {
62
+ if (hooksInstalledFor !== null || envPlatform !== "unknown")
63
+ return;
64
+ const clientName = server.server.getClientVersion()?.name ?? "";
65
+ const clientPlatform = detectPlatformFromClientInfo(clientName);
66
+ installHooks(clientPlatform === "unknown" ? "claude" : clientPlatform, clientName || "fallback");
67
+ };
51
68
  await server.connect(transport);
52
69
  console.error("CodeSift MCP server started");
53
70
  // Synchronous framework detection from package.json (runs before transport messages flow)
@@ -61,19 +78,8 @@ async function main() {
61
78
  console.error("[codesift] conversation auto-discovery failed:", err);
62
79
  });
63
80
  // Auto-install hooks for the detected platform (idempotent)
64
- const envPlatform = detectPlatform();
65
81
  if (envPlatform !== "unknown") {
66
- setupHooksForPlatform(envPlatform).catch((err) => {
67
- console.error(`[codesift] hook auto-install failed (${envPlatform}):`, err);
68
- });
69
- }
70
- else {
71
- // Env detection failed — try clientInfo after MCP initialize.
72
- // The transport emits an internal event, but we can also just try
73
- // all safe platforms (Claude is the most common, always install).
74
- setupHooksForPlatform("claude").catch((err) => {
75
- console.error("[codesift] hook auto-install failed (claude fallback):", err);
76
- });
82
+ installHooks(envPlatform, "env");
77
83
  }
78
84
  }
79
85
  main().catch((err) => {
@@ -1 +1 @@
1
- {"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"usage-tracker.d.ts","sourceRoot":"","sources":["../../src/storage/usage-tracker.ts"],"names":[],"mappings":"AAeA,MAAM,WAAW,UAAU;IACzB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACtC,UAAU,EAAE,MAAM,CAAC;IACnB,aAAa,EAAE,MAAM,CAAC;IACtB,aAAa,EAAE,MAAM,CAAC;IACtB,UAAU,EAAE,MAAM,CAAC;CACpB;AAMD,wBAAgB,YAAY,IAAI,MAAM,CAGrC;AA2BD;;;GAGG;AACH,wBAAgB,gBAAgB,CAC9B,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC5B,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CA+BzB;AAMD;;;GAGG;AACH,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,OAAO,GAAG,MAAM,CAqBzD;AAQD,wBAAgB,oBAAoB,IAAI,MAAM,CAE7C;AAED,wBAAgB,UAAU,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAE/C;AAID;;;GAGG;AACH,wBAAsB,UAAU,CAAC,KAAK,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC,CAiBjE;AAED;;;GAGG;AACH,wBAAgB,aAAa,CAC3B,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC7B,UAAU,EAAE,MAAM,EAClB,UAAU,EAAE,OAAO,EACnB,SAAS,EAAE,MAAM,GAChB,IAAI,CAcN;AAED;;GAEG;AACH,wBAAgB,YAAY,IAAI,MAAM,CAErC"}
1
+ {"version":3,"file":"usage-tracker.d.ts","sourceRoot":"","sources":["../../src/storage/usage-tracker.ts"],"names":[],"mappings":"AAeA,MAAM,WAAW,UAAU;IACzB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACtC,UAAU,EAAE,MAAM,CAAC;IACnB,aAAa,EAAE,MAAM,CAAC;IACtB,aAAa,EAAE,MAAM,CAAC;IACtB,UAAU,EAAE,MAAM,CAAC;CACpB;AAMD,wBAAgB,YAAY,IAAI,MAAM,CAGrC;AA8BD;;;GAGG;AACH,wBAAgB,gBAAgB,CAC9B,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC5B,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CA+BzB;AAMD;;;GAGG;AACH,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,OAAO,GAAG,MAAM,CAqBzD;AAQD,wBAAgB,oBAAoB,IAAI,MAAM,CAE7C;AAED,wBAAgB,UAAU,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAE/C;AAID;;;GAGG;AACH,wBAAsB,UAAU,CAAC,KAAK,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC,CAiBjE;AAED;;;GAGG;AACH,wBAAgB,aAAa,CAC3B,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC7B,UAAU,EAAE,MAAM,EAClB,UAAU,EAAE,OAAO,EACnB,SAAS,EAAE,MAAM,GAChB,IAAI,CAcN;AAED;;GAEG;AACH,wBAAgB,YAAY,IAAI,MAAM,CAErC"}
@@ -18,7 +18,7 @@ export function getUsagePath() {
18
18
  // ---------------------------------------------------------------------------
19
19
  /** Per-tool field extraction schema: [key, expectedType] pairs */
20
20
  const TOOL_ARG_FIELDS = {
21
- search_symbols: [["kind", "string"], ["top_k", "number"], ["file_pattern", "string"], ["include_source", "boolean"]],
21
+ search_symbols: [["kind", "string"], ["top_k", "number"], ["file_pattern", "string"], ["decorator", "string"], ["include_source", "boolean"]],
22
22
  search_text: [["regex", "boolean"], ["context_lines", "number"], ["file_pattern", "string"], ["max_results", "number"], ["group_by_file", "boolean"], ["auto_group", "boolean"]],
23
23
  get_file_tree: [["path_prefix", "string"], ["name_pattern", "string"], ["depth", "number"]],
24
24
  get_file_outline: [["file_path", "string"]],
@@ -31,6 +31,9 @@ const TOOL_ARG_FIELDS = {
31
31
  get_knowledge_map: [["focus", "string"], ["depth", "number"]],
32
32
  diff_outline: [["since", "string"], ["until", "string"]],
33
33
  changed_symbols: [["since", "string"], ["until", "string"]],
34
+ resolve_constant_value: [["symbol_name", "string"], ["file_pattern", "string"], ["max_depth", "number"]],
35
+ effective_django_view_security: [["path", "string"], ["symbol_name", "string"], ["file_pattern", "string"], ["settings_file", "string"]],
36
+ taint_trace: [["framework", "string"], ["file_pattern", "string"], ["max_depth", "number"], ["max_traces", "number"]],
34
37
  index_folder: [["path", "string"], ["incremental", "boolean"]],
35
38
  index_repo: [["url", "string"], ["branch", "string"]],
36
39
  generate_claude_md: [["output_path", "string"]],