@phmotad/fire-code 0.2.7 → 0.2.9

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 (101) hide show
  1. package/dist/cli/commands/index-cmd.d.ts +1 -0
  2. package/dist/cli/commands/index-cmd.d.ts.map +1 -1
  3. package/dist/cli/commands/index-cmd.js +83 -14
  4. package/dist/cli/commands/index-cmd.js.map +1 -1
  5. package/dist/cli/commands/install.d.ts.map +1 -1
  6. package/dist/cli/commands/install.js +290 -171
  7. package/dist/cli/commands/install.js.map +1 -1
  8. package/dist/core/ExecutionEngine.d.ts +3 -1
  9. package/dist/core/ExecutionEngine.d.ts.map +1 -1
  10. package/dist/core/ExecutionEngine.js +36 -17
  11. package/dist/core/ExecutionEngine.js.map +1 -1
  12. package/dist/db/DatabaseManager.d.ts +4 -0
  13. package/dist/db/DatabaseManager.d.ts.map +1 -1
  14. package/dist/db/DatabaseManager.js +13 -0
  15. package/dist/db/DatabaseManager.js.map +1 -1
  16. package/dist/db/schema.d.ts +1 -1
  17. package/dist/db/schema.d.ts.map +1 -1
  18. package/dist/db/schema.js +20 -0
  19. package/dist/db/schema.js.map +1 -1
  20. package/dist/git/GitManager.d.ts +10 -0
  21. package/dist/git/GitManager.d.ts.map +1 -1
  22. package/dist/git/GitManager.js +46 -0
  23. package/dist/git/GitManager.js.map +1 -1
  24. package/dist/graph/GraphStore.d.ts +6 -1
  25. package/dist/graph/GraphStore.d.ts.map +1 -1
  26. package/dist/graph/InMemoryGraphStore.d.ts +1 -0
  27. package/dist/graph/InMemoryGraphStore.d.ts.map +1 -1
  28. package/dist/graph/InMemoryGraphStore.js +13 -2
  29. package/dist/graph/InMemoryGraphStore.js.map +1 -1
  30. package/dist/graph/SQLiteGraphStore.d.ts.map +1 -1
  31. package/dist/graph/SQLiteGraphStore.js +8 -2
  32. package/dist/graph/SQLiteGraphStore.js.map +1 -1
  33. package/dist/indexing/ASTParser.d.ts +1 -1
  34. package/dist/indexing/ASTParser.d.ts.map +1 -1
  35. package/dist/indexing/ASTParser.js +7 -1
  36. package/dist/indexing/ASTParser.js.map +1 -1
  37. package/dist/indexing/EmbeddingGenerator.d.ts.map +1 -1
  38. package/dist/indexing/EmbeddingGenerator.js +2 -25
  39. package/dist/indexing/EmbeddingGenerator.js.map +1 -1
  40. package/dist/indexing/FileScanner.d.ts.map +1 -1
  41. package/dist/indexing/FileScanner.js +2 -1
  42. package/dist/indexing/FileScanner.js.map +1 -1
  43. package/dist/indexing/GitIndexer.d.ts +4 -0
  44. package/dist/indexing/GitIndexer.d.ts.map +1 -0
  45. package/dist/indexing/GitIndexer.js +59 -0
  46. package/dist/indexing/GitIndexer.js.map +1 -0
  47. package/dist/indexing/GraphBuilder.d.ts.map +1 -1
  48. package/dist/indexing/GraphBuilder.js +21 -1
  49. package/dist/indexing/GraphBuilder.js.map +1 -1
  50. package/dist/indexing/Indexer.d.ts +3 -2
  51. package/dist/indexing/Indexer.d.ts.map +1 -1
  52. package/dist/indexing/Indexer.js +25 -6
  53. package/dist/indexing/Indexer.js.map +1 -1
  54. package/dist/mcp/server.d.ts.map +1 -1
  55. package/dist/mcp/server.js +20 -7
  56. package/dist/mcp/server.js.map +1 -1
  57. package/dist/mcp/tools/execute.d.ts +3 -0
  58. package/dist/mcp/tools/execute.d.ts.map +1 -1
  59. package/dist/mcp/tools/execute.js +2 -0
  60. package/dist/mcp/tools/execute.js.map +1 -1
  61. package/dist/mcp/tools/find_similar.d.ts +17 -0
  62. package/dist/mcp/tools/find_similar.d.ts.map +1 -0
  63. package/dist/mcp/tools/find_similar.js +95 -0
  64. package/dist/mcp/tools/find_similar.js.map +1 -0
  65. package/dist/mcp/tools/get_context.d.ts +3 -0
  66. package/dist/mcp/tools/get_context.d.ts.map +1 -1
  67. package/dist/mcp/tools/get_context.js +68 -7
  68. package/dist/mcp/tools/get_context.js.map +1 -1
  69. package/dist/mcp/tools/search_code.d.ts.map +1 -1
  70. package/dist/mcp/tools/search_code.js +22 -4
  71. package/dist/mcp/tools/search_code.js.map +1 -1
  72. package/dist/mcp/tools/smart_search.d.ts.map +1 -1
  73. package/dist/mcp/tools/smart_search.js +122 -29
  74. package/dist/mcp/tools/smart_search.js.map +1 -1
  75. package/dist/memory/HybridMemory.d.ts +4 -0
  76. package/dist/memory/HybridMemory.d.ts.map +1 -1
  77. package/dist/memory/HybridMemory.js +120 -29
  78. package/dist/memory/HybridMemory.js.map +1 -1
  79. package/dist/utils/modelManager.d.ts +37 -0
  80. package/dist/utils/modelManager.d.ts.map +1 -0
  81. package/dist/utils/modelManager.js +90 -0
  82. package/dist/utils/modelManager.js.map +1 -0
  83. package/dist/utils/workerPool.d.ts +8 -0
  84. package/dist/utils/workerPool.d.ts.map +1 -0
  85. package/dist/utils/workerPool.js +75 -0
  86. package/dist/utils/workerPool.js.map +1 -0
  87. package/dist/vector/MemoryVectorStore.d.ts.map +1 -1
  88. package/dist/vector/MemoryVectorStore.js +19 -13
  89. package/dist/vector/MemoryVectorStore.js.map +1 -1
  90. package/dist/vector/SQLiteVectorStore.d.ts +13 -0
  91. package/dist/vector/SQLiteVectorStore.d.ts.map +1 -0
  92. package/dist/vector/SQLiteVectorStore.js +111 -0
  93. package/dist/vector/SQLiteVectorStore.js.map +1 -0
  94. package/dist/vector/VectorStore.d.ts +0 -1
  95. package/dist/vector/VectorStore.d.ts.map +1 -1
  96. package/dist/workers/embeddingWorker.d.ts +2 -0
  97. package/dist/workers/embeddingWorker.d.ts.map +1 -0
  98. package/dist/workers/embeddingWorker.js +42 -0
  99. package/dist/workers/embeddingWorker.js.map +1 -0
  100. package/package.json +3 -1
  101. package/plugin/.claude-plugin/plugin.json +1 -1
@@ -1 +1 @@
1
- {"version":3,"file":"execute.d.ts","sourceRoot":"","sources":["../../../src/mcp/tools/execute.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAC5D,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,gCAAgC,CAAC;AAIlE,eAAO,MAAM,kBAAkB;;;;;;;;;;;;;;;EAO7B,CAAC;AAEH,MAAM,MAAM,YAAY,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,kBAAkB,CAAC,CAAC;AAE9D,wBAAsB,WAAW,CAC/B,KAAK,EAAE,YAAY,EACnB,MAAM,EAAE,cAAc,EACtB,QAAQ,EAAE,WAAW,EACrB,GAAG,EAAE,MAAM,GACV,OAAO,CAAC,MAAM,CAAC,CAyBjB"}
1
+ {"version":3,"file":"execute.d.ts","sourceRoot":"","sources":["../../../src/mcp/tools/execute.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAC5D,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,gCAAgC,CAAC;AAIlE,eAAO,MAAM,kBAAkB;;;;;;;;;;;;;;;;;;EAU7B,CAAC;AAEH,MAAM,MAAM,YAAY,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,kBAAkB,CAAC,CAAC;AAE9D,wBAAsB,WAAW,CAC/B,KAAK,EAAE,YAAY,EACnB,MAAM,EAAE,cAAc,EACtB,QAAQ,EAAE,WAAW,EACrB,GAAG,EAAE,MAAM,GACV,OAAO,CAAC,MAAM,CAAC,CA0BjB"}
@@ -10,6 +10,7 @@ exports.ExecuteInputSchema = zod_1.z.object({
10
10
  type: zod_1.z.enum(['feature', 'fix', 'refactor', 'docs']).optional().describe('Task type (auto-detected if omitted)'),
11
11
  mode: zod_1.z.enum(['safe', 'aggressive']).optional().describe('Execution mode'),
12
12
  agent: zod_1.z.enum(['supervisor', 'dev', 'review']).optional().describe('Agent role — sets branch prefix: firecode/supervisor/*, firecode/dev/*, firecode/review/*'),
13
+ scaffold: zod_1.z.boolean().optional().describe('Scaffold mode: create branch and surface relevant context, then return control to the host agent for implementation. Use this instead of the default sub-agent when you want to implement the task yourself.'),
13
14
  });
14
15
  async function executeTool(input, config, provider, cwd) {
15
16
  try {
@@ -20,6 +21,7 @@ async function executeTool(input, config, provider, cwd) {
20
21
  mode: input.mode,
21
22
  cwd,
22
23
  agentRole: input.agent,
24
+ scaffoldOnly: input.scaffold,
23
25
  });
24
26
  return JSON.stringify({
25
27
  success: result.success,
@@ -1 +1 @@
1
- {"version":3,"file":"execute.js","sourceRoot":"","sources":["../../../src/mcp/tools/execute.ts"],"names":[],"mappings":";;;AAkBA,kCA8BC;AAhDD,6BAAwB;AACxB,sEAAgE;AAIhE,qDAAwD;AAE3C,QAAA,kBAAkB,GAAG,OAAC,CAAC,MAAM,CAAC;IACzC,IAAI,EAAE,OAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,uCAAuC,CAAC;IACzE,IAAI,EAAE,OAAC,CAAC,IAAI,CAAC,CAAC,SAAS,EAAE,KAAK,EAAE,UAAU,EAAE,MAAM,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,sCAAsC,CAAC;IAChH,IAAI,EAAE,OAAC,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,YAAY,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,gBAAgB,CAAC;IAC1E,KAAK,EAAE,OAAC,CAAC,IAAI,CAAC,CAAC,YAAY,EAAE,KAAK,EAAE,QAAQ,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAChE,2FAA2F,CAC5F;CACF,CAAC,CAAC;AAII,KAAK,UAAU,WAAW,CAC/B,KAAmB,EACnB,MAAsB,EACtB,QAAqB,EACrB,GAAW;IAEX,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,IAAI,oCAAe,CAAC,MAAM,EAAE,QAAQ,EAAE,GAAG,CAAC,CAAC;QAC1D,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,GAAG,CAAC;YAC9B,IAAI,EAAE,KAAK,CAAC,IAAI;YAChB,IAAI,EAAE,KAAK,CAAC,IAAI;YAChB,IAAI,EAAE,KAAK,CAAC,IAAI;YAChB,GAAG;YACH,SAAS,EAAE,KAAK,CAAC,KAA8B;SAChD,CAAC,CAAC;QAEH,OAAO,IAAI,CAAC,SAAS,CAAC;YACpB,OAAO,EAAE,MAAM,CAAC,OAAO;YACvB,MAAM,EAAE,MAAM,CAAC,MAAM;YACrB,WAAW,EAAE,MAAM,CAAC,WAAW;YAC/B,OAAO,EAAE,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,SAAS,EAAE,CAAC,CAAC,SAAS,EAAE,CAAC,CAAC;YAC9E,MAAM,EAAE,MAAM,CAAC,MAAM;YACrB,MAAM,EAAE,MAAM,CAAC,MAAM;YACrB,UAAU,EAAE,MAAM,CAAC,UAAU;YAC7B,KAAK,EAAE,MAAM,CAAC,KAAK;SACpB,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;IACd,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,MAAM,CAAC,GAAG,IAAA,2BAAe,EAAC,GAAG,CAAC,CAAC;QAC/B,OAAO,IAAI,CAAC,SAAS,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,CAAC,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;IACrF,CAAC;AACH,CAAC"}
1
+ {"version":3,"file":"execute.js","sourceRoot":"","sources":["../../../src/mcp/tools/execute.ts"],"names":[],"mappings":";;;AAqBA,kCA+BC;AApDD,6BAAwB;AACxB,sEAAgE;AAIhE,qDAAwD;AAE3C,QAAA,kBAAkB,GAAG,OAAC,CAAC,MAAM,CAAC;IACzC,IAAI,EAAE,OAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,uCAAuC,CAAC;IACzE,IAAI,EAAE,OAAC,CAAC,IAAI,CAAC,CAAC,SAAS,EAAE,KAAK,EAAE,UAAU,EAAE,MAAM,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,sCAAsC,CAAC;IAChH,IAAI,EAAE,OAAC,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,YAAY,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,gBAAgB,CAAC;IAC1E,KAAK,EAAE,OAAC,CAAC,IAAI,CAAC,CAAC,YAAY,EAAE,KAAK,EAAE,QAAQ,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAChE,2FAA2F,CAC5F;IACD,QAAQ,EAAE,OAAC,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CACvC,8MAA8M,CAC/M;CACF,CAAC,CAAC;AAII,KAAK,UAAU,WAAW,CAC/B,KAAmB,EACnB,MAAsB,EACtB,QAAqB,EACrB,GAAW;IAEX,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,IAAI,oCAAe,CAAC,MAAM,EAAE,QAAQ,EAAE,GAAG,CAAC,CAAC;QAC1D,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,GAAG,CAAC;YAC9B,IAAI,EAAE,KAAK,CAAC,IAAI;YAChB,IAAI,EAAE,KAAK,CAAC,IAAI;YAChB,IAAI,EAAE,KAAK,CAAC,IAAI;YAChB,GAAG;YACH,SAAS,EAAE,KAAK,CAAC,KAA8B;YAC/C,YAAY,EAAE,KAAK,CAAC,QAAQ;SAC7B,CAAC,CAAC;QAEH,OAAO,IAAI,CAAC,SAAS,CAAC;YACpB,OAAO,EAAE,MAAM,CAAC,OAAO;YACvB,MAAM,EAAE,MAAM,CAAC,MAAM;YACrB,WAAW,EAAE,MAAM,CAAC,WAAW;YAC/B,OAAO,EAAE,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,SAAS,EAAE,CAAC,CAAC,SAAS,EAAE,CAAC,CAAC;YAC9E,MAAM,EAAE,MAAM,CAAC,MAAM;YACrB,MAAM,EAAE,MAAM,CAAC,MAAM;YACrB,UAAU,EAAE,MAAM,CAAC,UAAU;YAC7B,KAAK,EAAE,MAAM,CAAC,KAAK;SACpB,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;IACd,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,MAAM,CAAC,GAAG,IAAA,2BAAe,EAAC,GAAG,CAAC,CAAC;QAC/B,OAAO,IAAI,CAAC,SAAS,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,CAAC,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;IACrF,CAAC;AACH,CAAC"}
@@ -0,0 +1,17 @@
1
+ import { z } from 'zod';
2
+ export declare const FindSimilarInputSchema: z.ZodObject<{
3
+ description: z.ZodString;
4
+ type: z.ZodDefault<z.ZodOptional<z.ZodEnum<["function", "class", "any"]>>>;
5
+ k: z.ZodDefault<z.ZodOptional<z.ZodNumber>>;
6
+ }, "strip", z.ZodTypeAny, {
7
+ type: "function" | "class" | "any";
8
+ description: string;
9
+ k: number;
10
+ }, {
11
+ description: string;
12
+ type?: "function" | "class" | "any" | undefined;
13
+ k?: number | undefined;
14
+ }>;
15
+ export type FindSimilarInput = z.infer<typeof FindSimilarInputSchema>;
16
+ export declare function findSimilarTool(input: FindSimilarInput, cwd: string): Promise<string>;
17
+ //# sourceMappingURL=find_similar.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"find_similar.d.ts","sourceRoot":"","sources":["../../../src/mcp/tools/find_similar.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAQxB,eAAO,MAAM,sBAAsB;;;;;;;;;;;;EAQjC,CAAC;AAEH,MAAM,MAAM,gBAAgB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,sBAAsB,CAAC,CAAC;AAStE,wBAAsB,eAAe,CAAC,KAAK,EAAE,gBAAgB,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAgF3F"}
@@ -0,0 +1,95 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.FindSimilarInputSchema = void 0;
4
+ exports.findSimilarTool = findSimilarTool;
5
+ const zod_1 = require("zod");
6
+ const fs_1 = require("fs");
7
+ const path_1 = require("path");
8
+ const DatabaseManager_js_1 = require("../../db/DatabaseManager.js");
9
+ const errors_js_1 = require("../../utils/errors.js");
10
+ const paths_js_1 = require("../../utils/paths.js");
11
+ exports.FindSimilarInputSchema = zod_1.z.object({
12
+ description: zod_1.z.string().min(1).describe('Describe what you want to implement — in natural language or as a symbol name'),
13
+ type: zod_1.z.enum(['function', 'class', 'any']).optional().default('any').describe('Restrict to a specific symbol type'),
14
+ k: zod_1.z.number().int().positive().optional().default(5).describe('Max results to return'),
15
+ });
16
+ function getProjectName(cwd) {
17
+ try {
18
+ const pkg = JSON.parse((0, fs_1.readFileSync)(require('path').join(cwd, 'package.json'), 'utf8'));
19
+ return pkg.name ?? (0, path_1.basename)(cwd);
20
+ }
21
+ catch {
22
+ return (0, path_1.basename)(cwd);
23
+ }
24
+ }
25
+ async function findSimilarTool(input, cwd) {
26
+ try {
27
+ const firedotDir = (0, paths_js_1.getFireCodeDir)(cwd);
28
+ if (!(0, fs_1.existsSync)(firedotDir)) {
29
+ return 'Projeto não indexado. Execute `fire-code index` primeiro.';
30
+ }
31
+ const project = getProjectName(cwd);
32
+ const db = DatabaseManager_js_1.DatabaseManager.getInstance(firedotDir);
33
+ const vectorStore = db.getVectorStore(project);
34
+ const graphStore = db.getGraphStore(project);
35
+ // 1. Symbol lookup in graph — extract keywords and search by name
36
+ const keywords = input.description
37
+ .split(/\W+/)
38
+ .filter(w => w.length > 2)
39
+ .slice(0, 5);
40
+ const graphMatches = [];
41
+ const seen = new Set();
42
+ for (const keyword of keywords) {
43
+ const nodeType = input.type === 'class' ? 'function' : 'function';
44
+ const nodes = graphStore.query({ type: nodeType, label: keyword });
45
+ for (const node of nodes) {
46
+ if (node.type === 'function' && !seen.has(node.id)) {
47
+ seen.add(node.id);
48
+ graphMatches.push(node);
49
+ }
50
+ }
51
+ }
52
+ // 2. Vector/text search for semantically similar code chunks
53
+ const vectorResults = vectorStore.size() > 0
54
+ ? await vectorStore.search(input.description, input.k)
55
+ : [];
56
+ const lines = [
57
+ '# Código Similar Encontrado\n',
58
+ '> Verifique se estas implementações já atendem sua necessidade antes de criar algo novo.\n',
59
+ ];
60
+ let found = false;
61
+ if (graphMatches.length > 0) {
62
+ found = true;
63
+ lines.push('## Símbolos por Nome (grafo)\n');
64
+ for (const fn of graphMatches.slice(0, input.k)) {
65
+ const params = fn.parameters.join(', ');
66
+ const ret = fn.returnType ? `: ${fn.returnType}` : '';
67
+ const cls = fn.parentClass ? ` ← \`${fn.parentClass}\`` : '';
68
+ const relPath = fn.filePath.replace(/\\/g, '/');
69
+ lines.push(`### \`${fn.label}(${params})${ret}\`${cls}`);
70
+ lines.push(`📍 ${relPath}:${fn.line} ${fn.isExported ? '(exportado)' : '(interno)'}\n`);
71
+ }
72
+ }
73
+ const relevantVec = vectorResults.filter(r => r.score > 0.05);
74
+ if (relevantVec.length > 0) {
75
+ found = true;
76
+ lines.push('## Código Similar por Conteúdo (busca semântica)\n');
77
+ for (const r of relevantVec) {
78
+ const path = String(r.document.metadata.relativePath ?? r.document.metadata.path ?? 'unknown');
79
+ lines.push(`### ${path} (relevância: ${(r.score * 100).toFixed(0)}%)`);
80
+ lines.push('```');
81
+ lines.push(r.document.text.slice(0, 400).trimEnd());
82
+ lines.push('```\n');
83
+ }
84
+ }
85
+ if (!found) {
86
+ lines.push('✅ Nenhum código similar encontrado — pode implementar com segurança.');
87
+ }
88
+ return lines.join('\n');
89
+ }
90
+ catch (err) {
91
+ const e = (0, errors_js_1.toFireCodeError)(err);
92
+ return `Erro em find_similar: ${e.message}`;
93
+ }
94
+ }
95
+ //# sourceMappingURL=find_similar.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"find_similar.js","sourceRoot":"","sources":["../../../src/mcp/tools/find_similar.ts"],"names":[],"mappings":"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"}
@@ -3,14 +3,17 @@ export declare const GetContextInputSchema: z.ZodObject<{
3
3
  query: z.ZodString;
4
4
  k: z.ZodDefault<z.ZodOptional<z.ZodNumber>>;
5
5
  includeGraph: z.ZodDefault<z.ZodOptional<z.ZodBoolean>>;
6
+ includeGitDiff: z.ZodOptional<z.ZodBoolean>;
6
7
  }, "strip", z.ZodTypeAny, {
7
8
  query: string;
8
9
  k: number;
9
10
  includeGraph: boolean;
11
+ includeGitDiff?: boolean | undefined;
10
12
  }, {
11
13
  query: string;
12
14
  k?: number | undefined;
13
15
  includeGraph?: boolean | undefined;
16
+ includeGitDiff?: boolean | undefined;
14
17
  }>;
15
18
  export type GetContextInput = z.infer<typeof GetContextInputSchema>;
16
19
  export declare function getContextTool(input: GetContextInput, cwd: string): Promise<string>;
@@ -1 +1 @@
1
- {"version":3,"file":"get_context.d.ts","sourceRoot":"","sources":["../../../src/mcp/tools/get_context.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAUxB,eAAO,MAAM,qBAAqB;;;;;;;;;;;;EAIhC,CAAC;AAEH,MAAM,MAAM,eAAe,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,qBAAqB,CAAC,CAAC;AASpE,wBAAsB,cAAc,CAAC,KAAK,EAAE,eAAe,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAuBzF"}
1
+ {"version":3,"file":"get_context.d.ts","sourceRoot":"","sources":["../../../src/mcp/tools/get_context.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAWxB,eAAO,MAAM,qBAAqB;;;;;;;;;;;;;;;EAKhC,CAAC;AAEH,MAAM,MAAM,eAAe,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,qBAAqB,CAAC,CAAC;AAsCpE,wBAAsB,cAAc,CAAC,KAAK,EAAE,eAAe,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAqDzF"}
@@ -7,14 +7,16 @@ const path_1 = require("path");
7
7
  const HybridMemory_js_1 = require("../../memory/HybridMemory.js");
8
8
  const FallbackMemory_js_1 = require("../../memory/FallbackMemory.js");
9
9
  const DatabaseManager_js_1 = require("../../db/DatabaseManager.js");
10
- const MemoryVectorStore_js_1 = require("../../vector/MemoryVectorStore.js");
10
+ const GitManager_js_1 = require("../../git/GitManager.js");
11
11
  const errors_js_1 = require("../../utils/errors.js");
12
12
  const fs_1 = require("fs");
13
13
  const paths_js_1 = require("../../utils/paths.js");
14
+ const defaults_js_1 = require("../../config/defaults.js");
14
15
  exports.GetContextInputSchema = zod_1.z.object({
15
16
  query: zod_1.z.string().min(1).describe('Query to retrieve relevant context for'),
16
17
  k: zod_1.z.number().int().positive().optional().default(5).describe('Number of results to return'),
17
18
  includeGraph: zod_1.z.boolean().optional().default(true).describe('Include structural graph context'),
19
+ includeGitDiff: zod_1.z.boolean().optional().describe('Include uncommitted git diff in context (default: true)'),
18
20
  });
19
21
  function getProjectName(cwd) {
20
22
  try {
@@ -25,22 +27,81 @@ function getProjectName(cwd) {
25
27
  return (0, path_1.basename)(cwd);
26
28
  }
27
29
  }
30
+ async function getWorkingDiff(cwd) {
31
+ try {
32
+ const defaults = (0, defaults_js_1.getDefaults)();
33
+ const git = new GitManager_js_1.GitManager(cwd, defaults.git);
34
+ if (!(await git.isRepo()))
35
+ return '';
36
+ return await git.getWorkingDiff(2000);
37
+ }
38
+ catch {
39
+ return '';
40
+ }
41
+ }
42
+ async function buildStaleWarning(cwd, db, project) {
43
+ try {
44
+ const defaults = (0, defaults_js_1.getDefaults)();
45
+ const git = new GitManager_js_1.GitManager(cwd, defaults.git);
46
+ if (!(await git.isRepo()))
47
+ return '';
48
+ const [currentHead, indexedHead] = await Promise.all([
49
+ git.getHeadHash(),
50
+ Promise.resolve(db.getProjectMeta(project, 'indexed_at_hash')),
51
+ ]);
52
+ if (currentHead && indexedHead && currentHead !== indexedHead) {
53
+ return `> **Warning:** Index is stale. Indexed at \`${indexedHead.slice(0, 8)}\`, current HEAD is \`${currentHead.slice(0, 8)}\`. Run \`npx firecode index\` for accurate context.\n\n`;
54
+ }
55
+ return '';
56
+ }
57
+ catch {
58
+ return '';
59
+ }
60
+ }
28
61
  async function getContextTool(input, cwd) {
29
62
  try {
30
63
  const firedotDir = (0, paths_js_1.getFireCodeDir)(cwd);
31
- const vectorsPath = (0, paths_js_1.getVectorsPath)(cwd);
32
- if (!(0, fs_1.existsSync)(firedotDir) || !(0, fs_1.existsSync)(vectorsPath)) {
64
+ const diffPromise = input.includeGitDiff !== false ? getWorkingDiff(cwd) : Promise.resolve('');
65
+ if (!(0, fs_1.existsSync)(firedotDir)) {
33
66
  const fallback = new FallbackMemory_js_1.FallbackMemory(cwd);
34
- const ctx = await fallback.retrieve(input.query, input.k);
67
+ const [ctx, diff] = await Promise.all([
68
+ fallback.retrieve(input.query, input.k),
69
+ diffPromise,
70
+ ]);
71
+ if (diff)
72
+ return ctx.combined + `\n## Uncommitted Changes\n\`\`\`diff\n${diff}\n\`\`\`\n`;
35
73
  return ctx.combined;
36
74
  }
37
75
  const project = getProjectName(cwd);
38
76
  const db = DatabaseManager_js_1.DatabaseManager.getInstance(firedotDir);
39
77
  const graphStore = db.getGraphStore(project);
40
- const vectorStore = MemoryVectorStore_js_1.MemoryVectorStore.deserialize((0, fs_1.readFileSync)(vectorsPath, 'utf8'));
78
+ const vectorStore = db.getVectorStore(project);
79
+ if (vectorStore.size() === 0) {
80
+ const fallback = new FallbackMemory_js_1.FallbackMemory(cwd);
81
+ const [ctx, diff] = await Promise.all([
82
+ fallback.retrieve(input.query, input.k),
83
+ diffPromise,
84
+ ]);
85
+ if (diff)
86
+ return ctx.combined + `\n## Uncommitted Changes\n\`\`\`diff\n${diff}\n\`\`\`\n`;
87
+ return ctx.combined;
88
+ }
41
89
  const memory = new HybridMemory_js_1.HybridMemory(vectorStore, graphStore);
42
- const ctx = await memory.retrieve(input.query, { k: input.k, includeGraph: input.includeGraph });
43
- return ctx.combined;
90
+ const [ctx, workingDiff, staleWarning] = await Promise.all([
91
+ memory.retrieve(input.query, { k: input.k, includeGraph: input.includeGraph }),
92
+ diffPromise,
93
+ buildStaleWarning(cwd, db, project),
94
+ ]);
95
+ // Re-retrieve with working diff if there's something uncommitted
96
+ if (workingDiff) {
97
+ const ctxWithDiff = await memory.retrieve(input.query, {
98
+ k: input.k,
99
+ includeGraph: input.includeGraph,
100
+ workingDiff,
101
+ });
102
+ return staleWarning + ctxWithDiff.combined;
103
+ }
104
+ return staleWarning + ctx.combined;
44
105
  }
45
106
  catch (err) {
46
107
  const e = (0, errors_js_1.toFireCodeError)(err);
@@ -1 +1 @@
1
- {"version":3,"file":"get_context.js","sourceRoot":"","sources":["../../../src/mcp/tools/get_context.ts"],"names":[],"mappings":";;;AAyBA,wCAuBC;AAhDD,6BAAwB;AACxB,+BAAgC;AAChC,kEAA4D;AAC5D,sEAAgE;AAChE,oEAA8D;AAC9D,4EAAsE;AACtE,qDAAwD;AACxD,2BAA8C;AAC9C,mDAAsE;AAEzD,QAAA,qBAAqB,GAAG,OAAC,CAAC,MAAM,CAAC;IAC5C,KAAK,EAAE,OAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,wCAAwC,CAAC;IAC3E,CAAC,EAAE,OAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,6BAA6B,CAAC;IAC5F,YAAY,EAAE,OAAC,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAC,kCAAkC,CAAC;CAChG,CAAC,CAAC;AAIH,SAAS,cAAc,CAAC,GAAW;IACjC,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,IAAA,iBAAY,EAAC,OAAO,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,GAAG,EAAE,cAAc,CAAC,EAAE,MAAM,CAAC,CAAsB,CAAC;QAC7G,OAAO,GAAG,CAAC,IAAI,IAAI,IAAA,eAAQ,EAAC,GAAG,CAAC,CAAC;IACnC,CAAC;IAAC,MAAM,CAAC;QAAC,OAAO,IAAA,eAAQ,EAAC,GAAG,CAAC,CAAC;IAAC,CAAC;AACnC,CAAC;AAEM,KAAK,UAAU,cAAc,CAAC,KAAsB,EAAE,GAAW;IACtE,IAAI,CAAC;QACH,MAAM,UAAU,GAAG,IAAA,yBAAc,EAAC,GAAG,CAAC,CAAC;QACvC,MAAM,WAAW,GAAG,IAAA,yBAAc,EAAC,GAAG,CAAC,CAAC;QAExC,IAAI,CAAC,IAAA,eAAU,EAAC,UAAU,CAAC,IAAI,CAAC,IAAA,eAAU,EAAC,WAAW,CAAC,EAAE,CAAC;YACxD,MAAM,QAAQ,GAAG,IAAI,kCAAc,CAAC,GAAG,CAAC,CAAC;YACzC,MAAM,GAAG,GAAG,MAAM,QAAQ,CAAC,QAAQ,CAAC,KAAK,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC;YAC1D,OAAO,GAAG,CAAC,QAAQ,CAAC;QACtB,CAAC;QAED,MAAM,OAAO,GAAG,cAAc,CAAC,GAAG,CAAC,CAAC;QACpC,MAAM,EAAE,GAAG,oCAAe,CAAC,WAAW,CAAC,UAAU,CAAC,CAAC;QACnD,MAAM,UAAU,GAAG,EAAE,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC;QAC7C,MAAM,WAAW,GAAG,wCAAiB,CAAC,WAAW,CAAC,IAAA,iBAAY,EAAC,WAAW,EAAE,MAAM,CAAC,CAAC,CAAC;QACrF,MAAM,MAAM,GAAG,IAAI,8BAAY,CAAC,WAAW,EAAE,UAAU,CAAC,CAAC;QAEzD,MAAM,GAAG,GAAG,MAAM,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,KAAK,EAAE,EAAE,CAAC,EAAE,KAAK,CAAC,CAAC,EAAE,YAAY,EAAE,KAAK,CAAC,YAAY,EAAE,CAAC,CAAC;QACjG,OAAO,GAAG,CAAC,QAAQ,CAAC;IACtB,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,MAAM,CAAC,GAAG,IAAA,2BAAe,EAAC,GAAG,CAAC,CAAC;QAC/B,OAAO,6BAA6B,CAAC,CAAC,OAAO,EAAE,CAAC;IAClD,CAAC;AACH,CAAC"}
1
+ {"version":3,"file":"get_context.js","sourceRoot":"","sources":["../../../src/mcp/tools/get_context.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"search_code.d.ts","sourceRoot":"","sources":["../../../src/mcp/tools/search_code.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAOxB,eAAO,MAAM,qBAAqB;;;;;;;;;EAGhC,CAAC;AAEH,MAAM,MAAM,eAAe,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,qBAAqB,CAAC,CAAC;AAEpE,wBAAsB,cAAc,CAAC,KAAK,EAAE,eAAe,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAyBzF"}
1
+ {"version":3,"file":"search_code.d.ts","sourceRoot":"","sources":["../../../src/mcp/tools/search_code.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AASxB,eAAO,MAAM,qBAAqB;;;;;;;;;EAGhC,CAAC;AAEH,MAAM,MAAM,eAAe,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,qBAAqB,CAAC,CAAC;AASpE,wBAAsB,cAAc,CAAC,KAAK,EAAE,eAAe,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAkCzF"}
@@ -3,24 +3,42 @@ Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.SearchCodeInputSchema = void 0;
4
4
  exports.searchCodeTool = searchCodeTool;
5
5
  const zod_1 = require("zod");
6
- const MemoryVectorStore_js_1 = require("../../vector/MemoryVectorStore.js");
6
+ const DatabaseManager_js_1 = require("../../db/DatabaseManager.js");
7
7
  const FallbackMemory_js_1 = require("../../memory/FallbackMemory.js");
8
8
  const errors_js_1 = require("../../utils/errors.js");
9
9
  const fs_1 = require("fs");
10
10
  const paths_js_1 = require("../../utils/paths.js");
11
+ const path_1 = require("path");
12
+ const fs_2 = require("fs");
11
13
  exports.SearchCodeInputSchema = zod_1.z.object({
12
14
  query: zod_1.z.string().min(1).describe('Semantic search query for code'),
13
15
  k: zod_1.z.number().int().positive().optional().default(5).describe('Number of results'),
14
16
  });
17
+ function getProjectName(cwd) {
18
+ try {
19
+ const pkg = JSON.parse((0, fs_2.readFileSync)(require('path').join(cwd, 'package.json'), 'utf8'));
20
+ return pkg.name ?? (0, path_1.basename)(cwd);
21
+ }
22
+ catch {
23
+ return (0, path_1.basename)(cwd);
24
+ }
25
+ }
15
26
  async function searchCodeTool(input, cwd) {
16
27
  try {
17
- const vectorsPath = (0, paths_js_1.getVectorsPath)(cwd);
18
- if (!(0, fs_1.existsSync)(vectorsPath)) {
28
+ const firedotDir = (0, paths_js_1.getFireCodeDir)(cwd);
29
+ if (!(0, fs_1.existsSync)(firedotDir)) {
30
+ const fallback = new FallbackMemory_js_1.FallbackMemory(cwd);
31
+ const ctx = await fallback.retrieve(input.query, input.k);
32
+ return ctx.combined;
33
+ }
34
+ const project = getProjectName(cwd);
35
+ const db = DatabaseManager_js_1.DatabaseManager.getInstance(firedotDir);
36
+ const vectorStore = db.getVectorStore(project);
37
+ if (vectorStore.size() === 0) {
19
38
  const fallback = new FallbackMemory_js_1.FallbackMemory(cwd);
20
39
  const ctx = await fallback.retrieve(input.query, input.k);
21
40
  return ctx.combined;
22
41
  }
23
- const vectorStore = MemoryVectorStore_js_1.MemoryVectorStore.deserialize((0, fs_1.readFileSync)(vectorsPath, 'utf8'));
24
42
  const results = await vectorStore.search(input.query, input.k);
25
43
  if (results.length === 0)
26
44
  return 'No results found.';
@@ -1 +1 @@
1
- {"version":3,"file":"search_code.js","sourceRoot":"","sources":["../../../src/mcp/tools/search_code.ts"],"names":[],"mappings":";;;AAcA,wCAyBC;AAvCD,6BAAwB;AACxB,4EAAsE;AACtE,sEAAgE;AAChE,qDAAwD;AACxD,2BAA8C;AAC9C,mDAAsD;AAEzC,QAAA,qBAAqB,GAAG,OAAC,CAAC,MAAM,CAAC;IAC5C,KAAK,EAAE,OAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,gCAAgC,CAAC;IACnE,CAAC,EAAE,OAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,mBAAmB,CAAC;CACnF,CAAC,CAAC;AAII,KAAK,UAAU,cAAc,CAAC,KAAsB,EAAE,GAAW;IACtE,IAAI,CAAC;QACH,MAAM,WAAW,GAAG,IAAA,yBAAc,EAAC,GAAG,CAAC,CAAC;QAExC,IAAI,CAAC,IAAA,eAAU,EAAC,WAAW,CAAC,EAAE,CAAC;YAC7B,MAAM,QAAQ,GAAG,IAAI,kCAAc,CAAC,GAAG,CAAC,CAAC;YACzC,MAAM,GAAG,GAAG,MAAM,QAAQ,CAAC,QAAQ,CAAC,KAAK,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC;YAC1D,OAAO,GAAG,CAAC,QAAQ,CAAC;QACtB,CAAC;QAED,MAAM,WAAW,GAAG,wCAAiB,CAAC,WAAW,CAAC,IAAA,iBAAY,EAAC,WAAW,EAAE,MAAM,CAAC,CAAC,CAAC;QACrF,MAAM,OAAO,GAAG,MAAM,WAAW,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC;QAE/D,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO,mBAAmB,CAAC;QAErD,MAAM,KAAK,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE;YACjC,MAAM,IAAI,GAAG,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,YAAY,IAAI,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,IAAI,SAAS,CAAC;YACvF,OAAO,aAAa,CAAC,GAAG,CAAC,KAAK,IAAI,YAAY,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,UAAU,CAAC;QACxH,CAAC,CAAC,CAAC;QAEH,OAAO,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IAC5B,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,MAAM,CAAC,GAAG,IAAA,2BAAe,EAAC,GAAG,CAAC,CAAC;QAC/B,OAAO,yBAAyB,CAAC,CAAC,OAAO,EAAE,CAAC;IAC9C,CAAC;AACH,CAAC"}
1
+ {"version":3,"file":"search_code.js","sourceRoot":"","sources":["../../../src/mcp/tools/search_code.ts"],"names":[],"mappings":";;;AAuBA,wCAkCC;AAzDD,6BAAwB;AACxB,oEAA8D;AAC9D,sEAAgE;AAChE,qDAAwD;AACxD,2BAAgC;AAChC,mDAAsD;AACtD,+BAAgC;AAChC,2BAAkC;AAErB,QAAA,qBAAqB,GAAG,OAAC,CAAC,MAAM,CAAC;IAC5C,KAAK,EAAE,OAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,gCAAgC,CAAC;IACnE,CAAC,EAAE,OAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,mBAAmB,CAAC;CACnF,CAAC,CAAC;AAIH,SAAS,cAAc,CAAC,GAAW;IACjC,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,IAAA,iBAAY,EAAC,OAAO,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,GAAG,EAAE,cAAc,CAAC,EAAE,MAAM,CAAC,CAAsB,CAAC;QAC7G,OAAO,GAAG,CAAC,IAAI,IAAI,IAAA,eAAQ,EAAC,GAAG,CAAC,CAAC;IACnC,CAAC;IAAC,MAAM,CAAC;QAAC,OAAO,IAAA,eAAQ,EAAC,GAAG,CAAC,CAAC;IAAC,CAAC;AACnC,CAAC;AAEM,KAAK,UAAU,cAAc,CAAC,KAAsB,EAAE,GAAW;IACtE,IAAI,CAAC;QACH,MAAM,UAAU,GAAG,IAAA,yBAAc,EAAC,GAAG,CAAC,CAAC;QAEvC,IAAI,CAAC,IAAA,eAAU,EAAC,UAAU,CAAC,EAAE,CAAC;YAC5B,MAAM,QAAQ,GAAG,IAAI,kCAAc,CAAC,GAAG,CAAC,CAAC;YACzC,MAAM,GAAG,GAAG,MAAM,QAAQ,CAAC,QAAQ,CAAC,KAAK,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC;YAC1D,OAAO,GAAG,CAAC,QAAQ,CAAC;QACtB,CAAC;QAED,MAAM,OAAO,GAAG,cAAc,CAAC,GAAG,CAAC,CAAC;QACpC,MAAM,EAAE,GAAG,oCAAe,CAAC,WAAW,CAAC,UAAU,CAAC,CAAC;QACnD,MAAM,WAAW,GAAG,EAAE,CAAC,cAAc,CAAC,OAAO,CAAC,CAAC;QAE/C,IAAI,WAAW,CAAC,IAAI,EAAE,KAAK,CAAC,EAAE,CAAC;YAC7B,MAAM,QAAQ,GAAG,IAAI,kCAAc,CAAC,GAAG,CAAC,CAAC;YACzC,MAAM,GAAG,GAAG,MAAM,QAAQ,CAAC,QAAQ,CAAC,KAAK,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC;YAC1D,OAAO,GAAG,CAAC,QAAQ,CAAC;QACtB,CAAC;QAED,MAAM,OAAO,GAAG,MAAM,WAAW,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC;QAE/D,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO,mBAAmB,CAAC;QAErD,MAAM,KAAK,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE;YACjC,MAAM,IAAI,GAAG,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,YAAY,IAAI,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,IAAI,SAAS,CAAC;YACvF,OAAO,aAAa,CAAC,GAAG,CAAC,KAAK,IAAI,YAAY,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,UAAU,CAAC;QACxH,CAAC,CAAC,CAAC;QAEH,OAAO,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IAC5B,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,MAAM,CAAC,GAAG,IAAA,2BAAe,EAAC,GAAG,CAAC,CAAC;QAC/B,OAAO,yBAAyB,CAAC,CAAC,OAAO,EAAE,CAAC;IAC9C,CAAC;AACH,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"smart_search.d.ts","sourceRoot":"","sources":["../../../src/mcp/tools/smart_search.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAKxB,eAAO,MAAM,sBAAsB;;;;;;;;;;;;;;;EAKjC,CAAC;AAEH,MAAM,MAAM,gBAAgB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,sBAAsB,CAAC,CAAC;AA4DtE,wBAAsB,eAAe,CAAC,KAAK,EAAE,gBAAgB,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAmE3F"}
1
+ {"version":3,"file":"smart_search.d.ts","sourceRoot":"","sources":["../../../src/mcp/tools/smart_search.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAOxB,eAAO,MAAM,sBAAsB;;;;;;;;;;;;;;;EAKjC,CAAC;AAEH,MAAM,MAAM,gBAAgB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,sBAAsB,CAAC,CAAC;AAuHtE,wBAAsB,eAAe,CAAC,KAAK,EAAE,gBAAgB,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAgG3F"}
@@ -5,7 +5,8 @@ exports.smartSearchTool = smartSearchTool;
5
5
  const zod_1 = require("zod");
6
6
  const path_1 = require("path");
7
7
  const fs_1 = require("fs");
8
- const path_2 = require("path");
8
+ const DatabaseManager_js_1 = require("../../db/DatabaseManager.js");
9
+ const paths_js_1 = require("../../utils/paths.js");
9
10
  exports.SmartSearchInputSchema = zod_1.z.object({
10
11
  query: zod_1.z.string().describe('Search term — matches symbol names, file names, and content'),
11
12
  path: zod_1.z.string().optional().describe('Root directory to search (default: cwd)'),
@@ -14,6 +15,15 @@ exports.SmartSearchInputSchema = zod_1.z.object({
14
15
  });
15
16
  const SKIP_DIRS = new Set(['node_modules', '.git', 'dist', 'build', '.firecode', 'coverage', '.next']);
16
17
  const CODE_EXTS = new Set(['.ts', '.tsx', '.js', '.jsx', '.mts', '.cts', '.py', '.go', '.rs', '.java', '.cs', '.rb', '.php', '.swift', '.kt', '.md']);
18
+ function getProjectName(rootDir) {
19
+ try {
20
+ const pkg = JSON.parse((0, fs_1.readFileSync)((0, path_1.join)(rootDir, 'package.json'), 'utf8'));
21
+ return pkg.name ?? (0, path_1.basename)(rootDir);
22
+ }
23
+ catch {
24
+ return (0, path_1.basename)(rootDir);
25
+ }
26
+ }
17
27
  function walkFiles(dir, filePattern) {
18
28
  const files = [];
19
29
  function walk(current) {
@@ -27,7 +37,7 @@ function walkFiles(dir, filePattern) {
27
37
  for (const entry of entries) {
28
38
  if (SKIP_DIRS.has(entry))
29
39
  continue;
30
- const full = (0, path_2.join)(current, entry);
40
+ const full = (0, path_1.join)(current, entry);
31
41
  let stat;
32
42
  try {
33
43
  stat = (0, fs_1.statSync)(full);
@@ -38,7 +48,7 @@ function walkFiles(dir, filePattern) {
38
48
  if (stat.isDirectory()) {
39
49
  walk(full);
40
50
  }
41
- else if (CODE_EXTS.has((0, path_2.extname)(entry))) {
51
+ else if (CODE_EXTS.has((0, path_1.extname)(entry))) {
42
52
  if (!filePattern || full.includes(filePattern)) {
43
53
  files.push(full);
44
54
  }
@@ -48,35 +58,89 @@ function walkFiles(dir, filePattern) {
48
58
  walk(dir);
49
59
  return files;
50
60
  }
51
- function scoreMatch(line, query) {
52
- const lq = query.toLowerCase();
61
+ function scoreMatch(line, queryToken) {
62
+ const lq = queryToken.toLowerCase();
53
63
  const ll = line.toLowerCase();
54
- // Exact symbol match (function name, class name)
64
+ // Exact symbol declaration
55
65
  const symMatch = line.match(/(?:function|class|interface|type|const|let|var)\s+(\w+)/);
56
- if (symMatch && symMatch[1].toLowerCase().includes(lq))
66
+ if (symMatch && symMatch[1].toLowerCase() === lq)
57
67
  return 100;
68
+ if (symMatch && symMatch[1].toLowerCase().includes(lq))
69
+ return 80;
70
+ // Method declaration (handles class methods: ` methodName(`)
71
+ const methodMatch = line.match(/^\s+(?:async\s+|static\s+|private\s+|public\s+|protected\s+)*(\w+)\s*\(/);
72
+ if (methodMatch && methodMatch[1].toLowerCase() === lq)
73
+ return 90;
58
74
  // Export match
59
75
  if (line.includes('export') && ll.includes(lq))
60
- return 80;
76
+ return 70;
61
77
  // Import match
62
78
  if (line.includes('import') && ll.includes(lq))
63
- return 60;
79
+ return 50;
64
80
  // General content
65
81
  if (ll.includes(lq))
66
- return 40;
82
+ return 30;
67
83
  return 0;
68
84
  }
85
+ /** Query the indexed graph for exact symbol matches (fast, precise). */
86
+ function graphSymbolSearch(tokens, rootDir) {
87
+ const firedotDir = (0, paths_js_1.getFireCodeDir)(rootDir);
88
+ if (!(0, fs_1.existsSync)(firedotDir))
89
+ return [];
90
+ try {
91
+ const project = getProjectName(rootDir);
92
+ const db = DatabaseManager_js_1.DatabaseManager.getInstance(firedotDir);
93
+ const graphStore = db.getGraphStore(project);
94
+ const results = [];
95
+ for (const token of tokens) {
96
+ if (token.length < 2)
97
+ continue;
98
+ // Exact function/method match
99
+ const fnNodes = graphStore.query({ type: 'function', label: token, exact: true });
100
+ for (const node of fnNodes) {
101
+ const filePath = node.filePath.replace(/\\/g, '/');
102
+ const label = node.parentClass ? `${node.parentClass}.${node.label}` : node.label;
103
+ results.push({
104
+ file: filePath,
105
+ line: node.line,
106
+ kind: 'graph',
107
+ match: `${label}(${node.parameters.join(', ')})${node.returnType ? ': ' + node.returnType : ''}`,
108
+ context: `defined at L${node.line}${node.parentClass ? ` [class: ${node.parentClass}]` : ''}`,
109
+ });
110
+ }
111
+ // Exact file name match
112
+ const fileNodes = graphStore.query({ type: 'file', label: token, exact: true });
113
+ for (const node of fileNodes) {
114
+ results.push({
115
+ file: (node.path ?? node.label).replace(/\\/g, '/'),
116
+ line: 0,
117
+ kind: 'graph',
118
+ match: node.label,
119
+ context: `file (exports: ${node.exports.slice(0, 4).join(', ')})`,
120
+ });
121
+ }
122
+ }
123
+ return results;
124
+ }
125
+ catch {
126
+ return [];
127
+ }
128
+ }
69
129
  async function smartSearchTool(input, cwd) {
70
130
  const rootDir = (0, path_1.resolve)(input.path ?? cwd);
71
131
  if (!(0, fs_1.existsSync)(rootDir)) {
72
132
  return JSON.stringify({ error: `Directory not found: ${rootDir}` });
73
133
  }
74
- const files = walkFiles(rootDir, input.file_pattern);
75
- const results = [];
76
- const query = input.query.toLowerCase();
134
+ // Split query into individual tokens for multi-symbol queries
135
+ const tokens = input.query.split(/[\s,]+/).filter(t => t.length > 1);
77
136
  const maxResults = input.max_results ?? 20;
137
+ // ── 1. Graph-based symbol lookup (highest precision) ─────────────────────
138
+ const graphResults = graphSymbolSearch(tokens, rootDir);
139
+ // ── 2. File scan (catches anything not yet indexed) ───────────────────────
140
+ const files = walkFiles(rootDir, input.file_pattern);
141
+ const fileResults = [];
78
142
  for (const filePath of files) {
79
- if (results.length >= maxResults * 3)
143
+ if (fileResults.length >= maxResults * 4)
80
144
  break;
81
145
  let content;
82
146
  try {
@@ -85,47 +149,76 @@ async function smartSearchTool(input, cwd) {
85
149
  catch {
86
150
  continue;
87
151
  }
88
- const relPath = (0, path_2.relative)(rootDir, filePath);
89
- // File name match
90
- if (relPath.toLowerCase().includes(query)) {
91
- results.push({ file: relPath, line: 0, kind: 'symbol', match: relPath, context: `file: ${relPath}` });
152
+ const relPath = (0, path_1.relative)(rootDir, filePath).replace(/\\/g, '/');
153
+ // File name match against any token
154
+ const fileNameLower = relPath.toLowerCase();
155
+ if (tokens.some(t => fileNameLower.includes(t.toLowerCase()))) {
156
+ fileResults.push({ file: relPath, line: 0, kind: 'symbol', match: relPath, context: `file: ${relPath}` });
92
157
  }
93
158
  const lines = content.split('\n');
94
159
  for (let i = 0; i < lines.length; i++) {
95
- const score = scoreMatch(lines[i], query);
96
- if (score > 0) {
160
+ // Score against each token, take highest
161
+ let bestScore = 0;
162
+ for (const token of tokens) {
163
+ const s = scoreMatch(lines[i], token);
164
+ if (s > bestScore)
165
+ bestScore = s;
166
+ }
167
+ if (bestScore > 0) {
97
168
  const ctx = lines.slice(Math.max(0, i - 1), i + 2).join('\n');
98
- results.push({
169
+ fileResults.push({
99
170
  file: relPath,
100
171
  line: i + 1,
101
- kind: score >= 80 ? 'symbol' : 'content',
172
+ kind: bestScore >= 70 ? 'symbol' : 'content',
102
173
  match: lines[i].trim().slice(0, 120),
103
174
  context: ctx,
104
175
  });
105
176
  }
106
177
  }
107
178
  }
108
- // Sort: symbols first, then by file name
109
- results.sort((a, b) => {
179
+ // Sort file results: symbols first, then by file name
180
+ fileResults.sort((a, b) => {
110
181
  if (a.kind !== b.kind)
111
182
  return a.kind === 'symbol' ? -1 : 1;
112
183
  return a.file.localeCompare(b.file);
113
184
  });
114
- const top = results.slice(0, maxResults);
185
+ // ── 3. Merge: graph results first (deduplicated by file+line) ────────────
186
+ const seen = new Set();
187
+ const merged = [];
188
+ for (const r of graphResults) {
189
+ const key = `${r.file}:${r.line}`;
190
+ if (!seen.has(key)) {
191
+ seen.add(key);
192
+ merged.push(r);
193
+ }
194
+ }
195
+ for (const r of fileResults) {
196
+ const key = `${r.file}:${r.line}`;
197
+ if (!seen.has(key)) {
198
+ seen.add(key);
199
+ merged.push(r);
200
+ }
201
+ }
202
+ const top = merged.slice(0, maxResults);
115
203
  if (top.length === 0) {
116
204
  return `No results for "${input.query}" in ${rootDir}`;
117
205
  }
118
- const lines = [`# Search: "${input.query}" — ${top.length} results (${files.length} files scanned)\n`];
206
+ const outputLines = [
207
+ `# Search: "${input.query}" — ${top.length} results (${graphResults.length} from index, ${files.length} files scanned)\n`,
208
+ ];
119
209
  let lastFile = '';
120
210
  for (const r of top) {
121
211
  if (r.file !== lastFile) {
122
- lines.push(`\n## ${r.file}`);
212
+ outputLines.push(`\n## ${r.file}`);
123
213
  lastFile = r.file;
124
214
  }
125
215
  if (r.line > 0) {
126
- lines.push(` L${r.line} [${r.kind}] ${r.match}`);
216
+ outputLines.push(` L${r.line} [${r.kind}] ${r.match}`);
217
+ }
218
+ else if (r.kind === 'graph') {
219
+ outputLines.push(` [${r.kind}] ${r.match} — ${r.context}`);
127
220
  }
128
221
  }
129
- return lines.join('\n');
222
+ return outputLines.join('\n');
130
223
  }
131
224
  //# sourceMappingURL=smart_search.js.map