@phmotad/fire-code 0.2.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 (248) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +379 -0
  3. package/dist/agents/BaseAgent.d.ts +32 -0
  4. package/dist/agents/BaseAgent.d.ts.map +1 -0
  5. package/dist/agents/BaseAgent.js +19 -0
  6. package/dist/agents/BaseAgent.js.map +1 -0
  7. package/dist/agents/CodeAgent.d.ts +7 -0
  8. package/dist/agents/CodeAgent.d.ts.map +1 -0
  9. package/dist/agents/CodeAgent.js +130 -0
  10. package/dist/agents/CodeAgent.js.map +1 -0
  11. package/dist/cli/commands/corpus.d.ts +20 -0
  12. package/dist/cli/commands/corpus.d.ts.map +1 -0
  13. package/dist/cli/commands/corpus.js +60 -0
  14. package/dist/cli/commands/corpus.js.map +1 -0
  15. package/dist/cli/commands/daemon.d.ts +5 -0
  16. package/dist/cli/commands/daemon.d.ts.map +1 -0
  17. package/dist/cli/commands/daemon.js +79 -0
  18. package/dist/cli/commands/daemon.js.map +1 -0
  19. package/dist/cli/commands/dev.d.ts +2 -0
  20. package/dist/cli/commands/dev.d.ts.map +1 -0
  21. package/dist/cli/commands/dev.js +20 -0
  22. package/dist/cli/commands/dev.js.map +1 -0
  23. package/dist/cli/commands/index-cmd.d.ts +6 -0
  24. package/dist/cli/commands/index-cmd.d.ts.map +1 -0
  25. package/dist/cli/commands/index-cmd.js +57 -0
  26. package/dist/cli/commands/index-cmd.js.map +1 -0
  27. package/dist/cli/commands/init.d.ts +2 -0
  28. package/dist/cli/commands/init.d.ts.map +1 -0
  29. package/dist/cli/commands/init.js +173 -0
  30. package/dist/cli/commands/init.js.map +1 -0
  31. package/dist/cli/commands/install.d.ts +8 -0
  32. package/dist/cli/commands/install.d.ts.map +1 -0
  33. package/dist/cli/commands/install.js +154 -0
  34. package/dist/cli/commands/install.js.map +1 -0
  35. package/dist/cli/commands/observe.d.ts +19 -0
  36. package/dist/cli/commands/observe.d.ts.map +1 -0
  37. package/dist/cli/commands/observe.js +86 -0
  38. package/dist/cli/commands/observe.js.map +1 -0
  39. package/dist/cli/index.d.ts +3 -0
  40. package/dist/cli/index.d.ts.map +1 -0
  41. package/dist/cli/index.js +162 -0
  42. package/dist/cli/index.js.map +1 -0
  43. package/dist/config/defaults.d.ts +3 -0
  44. package/dist/config/defaults.d.ts.map +1 -0
  45. package/dist/config/defaults.js +8 -0
  46. package/dist/config/defaults.js.map +1 -0
  47. package/dist/config/loader.d.ts +3 -0
  48. package/dist/config/loader.d.ts.map +1 -0
  49. package/dist/config/loader.js +96 -0
  50. package/dist/config/loader.js.map +1 -0
  51. package/dist/config/types.d.ts +436 -0
  52. package/dist/config/types.d.ts.map +1 -0
  53. package/dist/config/types.js +73 -0
  54. package/dist/config/types.js.map +1 -0
  55. package/dist/core/ExecutionEngine.d.ts +26 -0
  56. package/dist/core/ExecutionEngine.d.ts.map +1 -0
  57. package/dist/core/ExecutionEngine.js +102 -0
  58. package/dist/core/ExecutionEngine.js.map +1 -0
  59. package/dist/core/TaskRouter.d.ts +3 -0
  60. package/dist/core/TaskRouter.d.ts.map +1 -0
  61. package/dist/core/TaskRouter.js +29 -0
  62. package/dist/core/TaskRouter.js.map +1 -0
  63. package/dist/daemon/DaemonClient.d.ts +8 -0
  64. package/dist/daemon/DaemonClient.d.ts.map +1 -0
  65. package/dist/daemon/DaemonClient.js +61 -0
  66. package/dist/daemon/DaemonClient.js.map +1 -0
  67. package/dist/daemon/DaemonServer.d.ts +17 -0
  68. package/dist/daemon/DaemonServer.d.ts.map +1 -0
  69. package/dist/daemon/DaemonServer.js +235 -0
  70. package/dist/daemon/DaemonServer.js.map +1 -0
  71. package/dist/db/DatabaseManager.d.ts +79 -0
  72. package/dist/db/DatabaseManager.d.ts.map +1 -0
  73. package/dist/db/DatabaseManager.js +212 -0
  74. package/dist/db/DatabaseManager.js.map +1 -0
  75. package/dist/db/schema.d.ts +2 -0
  76. package/dist/db/schema.d.ts.map +1 -0
  77. package/dist/db/schema.js +127 -0
  78. package/dist/db/schema.js.map +1 -0
  79. package/dist/git/CommitFormatter.d.ts +19 -0
  80. package/dist/git/CommitFormatter.d.ts.map +1 -0
  81. package/dist/git/CommitFormatter.js +47 -0
  82. package/dist/git/CommitFormatter.js.map +1 -0
  83. package/dist/git/GitManager.d.ts +28 -0
  84. package/dist/git/GitManager.d.ts.map +1 -0
  85. package/dist/git/GitManager.js +147 -0
  86. package/dist/git/GitManager.js.map +1 -0
  87. package/dist/graph/GraphStore.d.ts +54 -0
  88. package/dist/graph/GraphStore.d.ts.map +1 -0
  89. package/dist/graph/GraphStore.js +3 -0
  90. package/dist/graph/GraphStore.js.map +1 -0
  91. package/dist/graph/InMemoryGraphStore.d.ts +16 -0
  92. package/dist/graph/InMemoryGraphStore.d.ts.map +1 -0
  93. package/dist/graph/InMemoryGraphStore.js +75 -0
  94. package/dist/graph/InMemoryGraphStore.js.map +1 -0
  95. package/dist/graph/SQLiteGraphStore.d.ts +31 -0
  96. package/dist/graph/SQLiteGraphStore.d.ts.map +1 -0
  97. package/dist/graph/SQLiteGraphStore.js +158 -0
  98. package/dist/graph/SQLiteGraphStore.js.map +1 -0
  99. package/dist/index.d.ts +16 -0
  100. package/dist/index.d.ts.map +1 -0
  101. package/dist/index.js +32 -0
  102. package/dist/index.js.map +1 -0
  103. package/dist/indexing/ASTParser.d.ts +32 -0
  104. package/dist/indexing/ASTParser.d.ts.map +1 -0
  105. package/dist/indexing/ASTParser.js +185 -0
  106. package/dist/indexing/ASTParser.js.map +1 -0
  107. package/dist/indexing/EmbeddingGenerator.d.ts +15 -0
  108. package/dist/indexing/EmbeddingGenerator.d.ts.map +1 -0
  109. package/dist/indexing/EmbeddingGenerator.js +66 -0
  110. package/dist/indexing/EmbeddingGenerator.js.map +1 -0
  111. package/dist/indexing/FileScanner.d.ts +10 -0
  112. package/dist/indexing/FileScanner.d.ts.map +1 -0
  113. package/dist/indexing/FileScanner.js +58 -0
  114. package/dist/indexing/FileScanner.js.map +1 -0
  115. package/dist/indexing/GraphBuilder.d.ts +4 -0
  116. package/dist/indexing/GraphBuilder.d.ts.map +1 -0
  117. package/dist/indexing/GraphBuilder.js +51 -0
  118. package/dist/indexing/GraphBuilder.js.map +1 -0
  119. package/dist/indexing/Indexer.d.ts +13 -0
  120. package/dist/indexing/Indexer.d.ts.map +1 -0
  121. package/dist/indexing/Indexer.js +68 -0
  122. package/dist/indexing/Indexer.js.map +1 -0
  123. package/dist/mcp/server.d.ts +2 -0
  124. package/dist/mcp/server.d.ts.map +1 -0
  125. package/dist/mcp/server.js +155 -0
  126. package/dist/mcp/server.js.map +1 -0
  127. package/dist/mcp/tools/corpus_search.d.ts +14 -0
  128. package/dist/mcp/tools/corpus_search.d.ts.map +1 -0
  129. package/dist/mcp/tools/corpus_search.js +33 -0
  130. package/dist/mcp/tools/corpus_search.js.map +1 -0
  131. package/dist/mcp/tools/execute.d.ts +19 -0
  132. package/dist/mcp/tools/execute.d.ts.map +1 -0
  133. package/dist/mcp/tools/execute.js +38 -0
  134. package/dist/mcp/tools/execute.js.map +1 -0
  135. package/dist/mcp/tools/get_context.d.ts +17 -0
  136. package/dist/mcp/tools/get_context.d.ts.map +1 -0
  137. package/dist/mcp/tools/get_context.js +50 -0
  138. package/dist/mcp/tools/get_context.js.map +1 -0
  139. package/dist/mcp/tools/get_graph.d.ts +26 -0
  140. package/dist/mcp/tools/get_graph.d.ts.map +1 -0
  141. package/dist/mcp/tools/get_graph.js +68 -0
  142. package/dist/mcp/tools/get_graph.js.map +1 -0
  143. package/dist/mcp/tools/observations.d.ts +23 -0
  144. package/dist/mcp/tools/observations.d.ts.map +1 -0
  145. package/dist/mcp/tools/observations.js +72 -0
  146. package/dist/mcp/tools/observations.js.map +1 -0
  147. package/dist/mcp/tools/search_code.d.ts +14 -0
  148. package/dist/mcp/tools/search_code.d.ts.map +1 -0
  149. package/dist/mcp/tools/search_code.js +38 -0
  150. package/dist/mcp/tools/search_code.js.map +1 -0
  151. package/dist/mcp/tools/smart_outline.d.ts +14 -0
  152. package/dist/mcp/tools/smart_outline.d.ts.map +1 -0
  153. package/dist/mcp/tools/smart_outline.js +99 -0
  154. package/dist/mcp/tools/smart_outline.js.map +1 -0
  155. package/dist/mcp/tools/smart_search.d.ts +20 -0
  156. package/dist/mcp/tools/smart_search.d.ts.map +1 -0
  157. package/dist/mcp/tools/smart_search.js +131 -0
  158. package/dist/mcp/tools/smart_search.js.map +1 -0
  159. package/dist/memory/FallbackMemory.d.ts +9 -0
  160. package/dist/memory/FallbackMemory.d.ts.map +1 -0
  161. package/dist/memory/FallbackMemory.js +70 -0
  162. package/dist/memory/FallbackMemory.js.map +1 -0
  163. package/dist/memory/HybridMemory.d.ts +20 -0
  164. package/dist/memory/HybridMemory.d.ts.map +1 -0
  165. package/dist/memory/HybridMemory.js +74 -0
  166. package/dist/memory/HybridMemory.js.map +1 -0
  167. package/dist/providers/AgentSDKProvider.d.ts +13 -0
  168. package/dist/providers/AgentSDKProvider.d.ts.map +1 -0
  169. package/dist/providers/AgentSDKProvider.js +64 -0
  170. package/dist/providers/AgentSDKProvider.js.map +1 -0
  171. package/dist/providers/AnthropicProvider.d.ts +11 -0
  172. package/dist/providers/AnthropicProvider.d.ts.map +1 -0
  173. package/dist/providers/AnthropicProvider.js +61 -0
  174. package/dist/providers/AnthropicProvider.js.map +1 -0
  175. package/dist/providers/LLMProvider.d.ts +12 -0
  176. package/dist/providers/LLMProvider.d.ts.map +1 -0
  177. package/dist/providers/LLMProvider.js +3 -0
  178. package/dist/providers/LLMProvider.js.map +1 -0
  179. package/dist/providers/OllamaProvider.d.ts +11 -0
  180. package/dist/providers/OllamaProvider.d.ts.map +1 -0
  181. package/dist/providers/OllamaProvider.js +71 -0
  182. package/dist/providers/OllamaProvider.js.map +1 -0
  183. package/dist/providers/OpenAIProvider.d.ts +11 -0
  184. package/dist/providers/OpenAIProvider.d.ts.map +1 -0
  185. package/dist/providers/OpenAIProvider.js +63 -0
  186. package/dist/providers/OpenAIProvider.js.map +1 -0
  187. package/dist/providers/OpenRouterProvider.d.ts +12 -0
  188. package/dist/providers/OpenRouterProvider.d.ts.map +1 -0
  189. package/dist/providers/OpenRouterProvider.js +89 -0
  190. package/dist/providers/OpenRouterProvider.js.map +1 -0
  191. package/dist/providers/ProviderFactory.d.ts +4 -0
  192. package/dist/providers/ProviderFactory.d.ts.map +1 -0
  193. package/dist/providers/ProviderFactory.js +27 -0
  194. package/dist/providers/ProviderFactory.js.map +1 -0
  195. package/dist/services/CorpusService.d.ts +27 -0
  196. package/dist/services/CorpusService.d.ts.map +1 -0
  197. package/dist/services/CorpusService.js +142 -0
  198. package/dist/services/CorpusService.js.map +1 -0
  199. package/dist/services/ObservationService.d.ts +17 -0
  200. package/dist/services/ObservationService.d.ts.map +1 -0
  201. package/dist/services/ObservationService.js +101 -0
  202. package/dist/services/ObservationService.js.map +1 -0
  203. package/dist/services/SessionService.d.ts +10 -0
  204. package/dist/services/SessionService.d.ts.map +1 -0
  205. package/dist/services/SessionService.js +38 -0
  206. package/dist/services/SessionService.js.map +1 -0
  207. package/dist/services/SummarizationService.d.ts +8 -0
  208. package/dist/services/SummarizationService.d.ts.map +1 -0
  209. package/dist/services/SummarizationService.js +65 -0
  210. package/dist/services/SummarizationService.js.map +1 -0
  211. package/dist/utils/errors.d.ts +26 -0
  212. package/dist/utils/errors.d.ts.map +1 -0
  213. package/dist/utils/errors.js +72 -0
  214. package/dist/utils/errors.js.map +1 -0
  215. package/dist/utils/logger.d.ts +4 -0
  216. package/dist/utils/logger.d.ts.map +1 -0
  217. package/dist/utils/logger.js +16 -0
  218. package/dist/utils/logger.js.map +1 -0
  219. package/dist/utils/paths.d.ts +10 -0
  220. package/dist/utils/paths.d.ts.map +1 -0
  221. package/dist/utils/paths.js +43 -0
  222. package/dist/utils/paths.js.map +1 -0
  223. package/dist/utils/privacy.d.ts +5 -0
  224. package/dist/utils/privacy.d.ts.map +1 -0
  225. package/dist/utils/privacy.js +39 -0
  226. package/dist/utils/privacy.js.map +1 -0
  227. package/dist/utils/zodToJsonSchema.d.ts +23 -0
  228. package/dist/utils/zodToJsonSchema.d.ts.map +1 -0
  229. package/dist/utils/zodToJsonSchema.js +52 -0
  230. package/dist/utils/zodToJsonSchema.js.map +1 -0
  231. package/dist/vector/MemoryVectorStore.d.ts +16 -0
  232. package/dist/vector/MemoryVectorStore.d.ts.map +1 -0
  233. package/dist/vector/MemoryVectorStore.js +97 -0
  234. package/dist/vector/MemoryVectorStore.js.map +1 -0
  235. package/dist/vector/VectorStore.d.ts +19 -0
  236. package/dist/vector/VectorStore.d.ts.map +1 -0
  237. package/dist/vector/VectorStore.js +3 -0
  238. package/dist/vector/VectorStore.js.map +1 -0
  239. package/dist/vector/VectraVectorStore.d.ts +23 -0
  240. package/dist/vector/VectraVectorStore.d.ts.map +1 -0
  241. package/dist/vector/VectraVectorStore.js +93 -0
  242. package/dist/vector/VectraVectorStore.js.map +1 -0
  243. package/examples/firecode.config.example.ts +87 -0
  244. package/package.json +111 -0
  245. package/plugin/.claude-plugin/plugin.json +17 -0
  246. package/plugin/hooks/hooks.json +86 -0
  247. package/plugin/scripts/context-inject.js +208 -0
  248. package/plugin/scripts/smart-install.js +33 -0
@@ -0,0 +1,97 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.MemoryVectorStore = void 0;
4
+ const logger_js_1 = require("../utils/logger.js");
5
+ let pipelineCache = null;
6
+ async function getEmbedding(text) {
7
+ try {
8
+ if (!pipelineCache) {
9
+ const { pipeline } = await import('@xenova/transformers');
10
+ pipelineCache = (await pipeline('feature-extraction', 'Xenova/all-MiniLM-L6-v2'));
11
+ }
12
+ const output = await pipelineCache([text], { pooling: 'mean', normalize: true });
13
+ return Array.from(output.data[0]);
14
+ }
15
+ catch {
16
+ // Fallback: zero vector of dim 384
17
+ return new Array(384).fill(0);
18
+ }
19
+ }
20
+ function cosineSimilarity(a, b) {
21
+ if (a.length !== b.length)
22
+ return 0;
23
+ let dot = 0, normA = 0, normB = 0;
24
+ for (let i = 0; i < a.length; i++) {
25
+ dot += a[i] * b[i];
26
+ normA += a[i] * a[i];
27
+ normB += b[i] * b[i];
28
+ }
29
+ const denom = Math.sqrt(normA) * Math.sqrt(normB);
30
+ return denom === 0 ? 0 : dot / denom;
31
+ }
32
+ // Text-only fallback using TF-IDF-like term overlap
33
+ function textSimilarity(query, text) {
34
+ const queryTerms = new Set(query.toLowerCase().split(/\W+/).filter(Boolean));
35
+ const textTerms = text.toLowerCase().split(/\W+/).filter(Boolean);
36
+ if (queryTerms.size === 0 || textTerms.length === 0)
37
+ return 0;
38
+ const matches = textTerms.filter((t) => queryTerms.has(t)).length;
39
+ return matches / (queryTerms.size + textTerms.length - matches);
40
+ }
41
+ class MemoryVectorStore {
42
+ documents = new Map();
43
+ useEmbeddings = true;
44
+ constructor(opts) {
45
+ if (opts?.useEmbeddings === false)
46
+ this.useEmbeddings = false;
47
+ }
48
+ async add(documents) {
49
+ for (const doc of documents) {
50
+ this.documents.set(doc.id, doc);
51
+ }
52
+ logger_js_1.logger.debug({ count: documents.length }, 'Documents added to vector store');
53
+ }
54
+ async search(query, k = 5) {
55
+ const docs = Array.from(this.documents.values());
56
+ if (docs.length === 0)
57
+ return [];
58
+ const docsWithEmbeddings = docs.filter((d) => d.embedding && d.embedding.length > 0);
59
+ let scored;
60
+ if (this.useEmbeddings && docsWithEmbeddings.length > 0) {
61
+ const queryEmbedding = await getEmbedding(query);
62
+ scored = docsWithEmbeddings.map((doc) => ({
63
+ document: doc,
64
+ score: cosineSimilarity(queryEmbedding, doc.embedding),
65
+ }));
66
+ }
67
+ else {
68
+ scored = docs.map((doc) => ({
69
+ document: doc,
70
+ score: textSimilarity(query, doc.text),
71
+ }));
72
+ }
73
+ return scored.sort((a, b) => b.score - a.score).slice(0, k);
74
+ }
75
+ async delete(ids) {
76
+ for (const id of ids)
77
+ this.documents.delete(id);
78
+ }
79
+ async clear() {
80
+ this.documents.clear();
81
+ }
82
+ size() {
83
+ return this.documents.size;
84
+ }
85
+ serialize() {
86
+ return JSON.stringify(Array.from(this.documents.values()));
87
+ }
88
+ static deserialize(data) {
89
+ const store = new MemoryVectorStore();
90
+ const docs = JSON.parse(data);
91
+ for (const doc of docs)
92
+ store.documents.set(doc.id, doc);
93
+ return store;
94
+ }
95
+ }
96
+ exports.MemoryVectorStore = MemoryVectorStore;
97
+ //# sourceMappingURL=MemoryVectorStore.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"MemoryVectorStore.js","sourceRoot":"","sources":["../../src/vector/MemoryVectorStore.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,19 @@
1
+ export interface Document {
2
+ id: string;
3
+ text: string;
4
+ metadata: Record<string, unknown>;
5
+ embedding?: number[];
6
+ }
7
+ export interface ScoredDocument {
8
+ document: Document;
9
+ score: number;
10
+ }
11
+ export interface VectorStore {
12
+ add(documents: Document[]): Promise<void>;
13
+ search(query: string, k?: number): Promise<ScoredDocument[]>;
14
+ delete(ids: string[]): Promise<void>;
15
+ clear(): Promise<void>;
16
+ size(): number;
17
+ serialize(): string;
18
+ }
19
+ //# sourceMappingURL=VectorStore.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"VectorStore.d.ts","sourceRoot":"","sources":["../../src/vector/VectorStore.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,QAAQ;IACvB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAClC,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC;CACtB;AAED,MAAM,WAAW,cAAc;IAC7B,QAAQ,EAAE,QAAQ,CAAC;IACnB,KAAK,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,WAAW;IAC1B,GAAG,CAAC,SAAS,EAAE,QAAQ,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC1C,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE,CAAC,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,EAAE,CAAC,CAAC;IAC7D,MAAM,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACrC,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IACvB,IAAI,IAAI,MAAM,CAAC;IACf,SAAS,IAAI,MAAM,CAAC;CACrB"}
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=VectorStore.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"VectorStore.js","sourceRoot":"","sources":["../../src/vector/VectorStore.ts"],"names":[],"mappings":""}
@@ -0,0 +1,23 @@
1
+ import type { Document, ScoredDocument, VectorStore } from './VectorStore.js';
2
+ type EmbedFn = (text: string) => Promise<number[]>;
3
+ /**
4
+ * Vectra-backed vector store — uses HNSW for fast ANN search,
5
+ * persists to disk, survives restarts.
6
+ */
7
+ export declare class VectraVectorStore implements VectorStore {
8
+ private dirPath;
9
+ private index;
10
+ private ready;
11
+ private embedFn;
12
+ constructor(dirPath: string, embedFn?: EmbedFn);
13
+ private ensureReady;
14
+ add(documents: Document[]): Promise<void>;
15
+ search(query: string, k?: number): Promise<ScoredDocument[]>;
16
+ delete(ids: string[]): Promise<void>;
17
+ clear(): Promise<void>;
18
+ size(): number;
19
+ serialize(): string;
20
+ static deserialize(_data: string): VectraVectorStore;
21
+ }
22
+ export {};
23
+ //# sourceMappingURL=VectraVectorStore.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"VectraVectorStore.d.ts","sourceRoot":"","sources":["../../src/vector/VectraVectorStore.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,QAAQ,EAAE,cAAc,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAG9E,KAAK,OAAO,GAAG,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;AAkBnD;;;GAGG;AACH,qBAAa,iBAAkB,YAAW,WAAW;IAKvC,OAAO,CAAC,OAAO;IAJ3B,OAAO,CAAC,KAAK,CAAc;IAC3B,OAAO,CAAC,KAAK,CAAS;IACtB,OAAO,CAAC,OAAO,CAAU;gBAEL,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,OAAO;YAIxC,WAAW;IAUnB,GAAG,CAAC,SAAS,EAAE,QAAQ,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IAazC,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE,CAAC,SAAI,GAAG,OAAO,CAAC,cAAc,EAAE,CAAC;IAcvD,MAAM,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IAOpC,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAM5B,IAAI,IAAI,MAAM;IAMd,SAAS,IAAI,MAAM;IACnB,MAAM,CAAC,WAAW,CAAC,KAAK,EAAE,MAAM,GAAG,iBAAiB;CAGrD"}
@@ -0,0 +1,93 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.VectraVectorStore = void 0;
4
+ const vectra_1 = require("vectra");
5
+ const fs_1 = require("fs");
6
+ const logger_js_1 = require("../utils/logger.js");
7
+ // Lazy embed function — same model as MemoryVectorStore
8
+ let pipelineCache = null;
9
+ async function embed(text) {
10
+ try {
11
+ if (!pipelineCache) {
12
+ const { pipeline } = await import('@xenova/transformers');
13
+ pipelineCache = (await pipeline('feature-extraction', 'Xenova/all-MiniLM-L6-v2'));
14
+ }
15
+ const output = await pipelineCache([text], { pooling: 'mean', normalize: true });
16
+ return Array.from(output.data[0]);
17
+ }
18
+ catch {
19
+ return new Array(384).fill(0);
20
+ }
21
+ }
22
+ /**
23
+ * Vectra-backed vector store — uses HNSW for fast ANN search,
24
+ * persists to disk, survives restarts.
25
+ */
26
+ class VectraVectorStore {
27
+ dirPath;
28
+ index;
29
+ ready = false;
30
+ embedFn;
31
+ constructor(dirPath, embedFn) {
32
+ this.dirPath = dirPath;
33
+ this.embedFn = embedFn ?? embed;
34
+ }
35
+ async ensureReady() {
36
+ if (this.ready)
37
+ return;
38
+ if (!(0, fs_1.existsSync)(this.dirPath))
39
+ (0, fs_1.mkdirSync)(this.dirPath, { recursive: true });
40
+ this.index = new vectra_1.LocalIndex(this.dirPath);
41
+ if (!await this.index.isIndexCreated()) {
42
+ await this.index.createIndex();
43
+ }
44
+ this.ready = true;
45
+ }
46
+ async add(documents) {
47
+ await this.ensureReady();
48
+ for (const doc of documents) {
49
+ const vector = doc.embedding?.length ? doc.embedding : await this.embedFn(doc.text);
50
+ await this.index.upsertItem({
51
+ id: doc.id,
52
+ vector,
53
+ metadata: { text: doc.text, ...doc.metadata },
54
+ });
55
+ }
56
+ logger_js_1.logger.debug({ count: documents.length }, 'Vectra: documents upserted');
57
+ }
58
+ async search(query, k = 5) {
59
+ await this.ensureReady();
60
+ const queryVector = await this.embedFn(query);
61
+ const results = await this.index.queryItems(queryVector, query, k);
62
+ return results.map(r => ({
63
+ document: {
64
+ id: r.item.id,
65
+ text: r.item.metadata?.text ?? '',
66
+ metadata: r.item.metadata,
67
+ },
68
+ score: r.score,
69
+ }));
70
+ }
71
+ async delete(ids) {
72
+ await this.ensureReady();
73
+ for (const id of ids) {
74
+ await this.index.deleteItem(id);
75
+ }
76
+ }
77
+ async clear() {
78
+ await this.ensureReady();
79
+ await this.index.deleteIndex();
80
+ await this.index.createIndex();
81
+ }
82
+ size() {
83
+ // Vectra doesn't expose sync count — return 0 as safe default
84
+ return 0;
85
+ }
86
+ // Legacy compat (no-ops — vectra persists automatically)
87
+ serialize() { return '{}'; }
88
+ static deserialize(_data) {
89
+ throw new Error('Use VectraVectorStore constructor directly');
90
+ }
91
+ }
92
+ exports.VectraVectorStore = VectraVectorStore;
93
+ //# sourceMappingURL=VectraVectorStore.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"VectraVectorStore.js","sourceRoot":"","sources":["../../src/vector/VectraVectorStore.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,87 @@
1
+ import type { FireCodeConfig } from '@phmotad/fire-code';
2
+
3
+ const config: FireCodeConfig = {
4
+ project: {
5
+ name: 'my-project',
6
+ // 'legacy' for existing messy projects, 'standard' for greenfield
7
+ mode: 'standard',
8
+ },
9
+
10
+ llm: {
11
+ // Providers: 'openrouter' | 'anthropic' | 'openai' | 'ollama'
12
+ provider: 'openrouter',
13
+ model: 'deepseek/deepseek-coder',
14
+ apiKey: process.env.OPENROUTER_API_KEY,
15
+ maxTokens: 4096,
16
+ temperature: 0.2,
17
+ },
18
+
19
+ embeddings: {
20
+ // 'local' uses @xenova/transformers (all-MiniLM-L6-v2, runs offline)
21
+ provider: 'local',
22
+ model: 'Xenova/all-MiniLM-L6-v2',
23
+ },
24
+
25
+ vectorStore: {
26
+ // 'memory' = in-process, 'qdrant' = external Qdrant server
27
+ provider: 'memory',
28
+ collection: 'fire-code',
29
+ },
30
+
31
+ graphStore: {
32
+ // 'memory' = in-process, 'neo4j' = external Neo4j
33
+ provider: 'memory',
34
+ },
35
+
36
+ memory: {
37
+ // 'auto' = uses vector+graph if indexed, falls back to text search
38
+ // 'hybrid' = always uses both (requires index)
39
+ // 'vector' = vector-only
40
+ // 'graph' = graph-only
41
+ strategy: 'auto',
42
+ maxResults: 10,
43
+ },
44
+
45
+ git: {
46
+ enabled: true,
47
+ autoBranch: true,
48
+ branchPrefix: 'firecode/',
49
+ // 'reuse' = checkout existing branch
50
+ // 'increment' = create branch-2, branch-3...
51
+ // 'fail' = error if branch exists
52
+ branchStrategy: 'reuse',
53
+ autoCommit: true,
54
+ commitFormat: 'conventional',
55
+ includeMetadata: true,
56
+ // 'stash' = auto-stash dirty files (recommended)
57
+ // 'commit' = auto-commit dirty files
58
+ // 'fail' = block if dirty
59
+ // 'ignore' = proceed anyway
60
+ workingTree: 'stash',
61
+ enforcePattern: false,
62
+ },
63
+
64
+ execution: {
65
+ // 'safe' = validate before applying changes
66
+ // 'aggressive' = apply changes directly
67
+ mode: 'safe',
68
+ dryRun: false,
69
+ // 'fail' = error on conflict (recommended)
70
+ // 'overwrite' = overwrite conflicting files
71
+ // 'merge' = attempt merge
72
+ conflictStrategy: 'fail',
73
+ validateSyntax: true,
74
+ validateBuild: false,
75
+ },
76
+
77
+ indexing: {
78
+ // 'lazy' = index on-demand (recommended for large repos)
79
+ // 'full' = index everything upfront
80
+ mode: 'lazy',
81
+ include: ['**/*.ts', '**/*.tsx', '**/*.js', '**/*.jsx'],
82
+ exclude: ['node_modules/**', 'dist/**', '.firecode/**', '**/*.test.*'],
83
+ maxFileSize: 500_000,
84
+ },
85
+ };
86
+
87
+ export default config;
package/package.json ADDED
@@ -0,0 +1,111 @@
1
+ {
2
+ "name": "@phmotad/fire-code",
3
+ "version": "0.2.0",
4
+ "description": "Intelligent MCP execution engine for AI coding agents — persistent memory, context-aware, Git-traceable",
5
+ "keywords": [
6
+ "mcp",
7
+ "ai",
8
+ "coding-agent",
9
+ "claude",
10
+ "claude-code",
11
+ "llm",
12
+ "typescript",
13
+ "memory",
14
+ "vector",
15
+ "graph",
16
+ "git",
17
+ "plugin"
18
+ ],
19
+ "author": "FireCode Contributors",
20
+ "license": "MIT",
21
+ "repository": {
22
+ "type": "git",
23
+ "url": "https://github.com/phmotad/fire-code.git"
24
+ },
25
+ "homepage": "https://github.com/phmotad/fire-code#readme",
26
+ "bugs": {
27
+ "url": "https://github.com/phmotad/fire-code/issues"
28
+ },
29
+ "main": "dist/index.js",
30
+ "types": "dist/index.d.ts",
31
+ "bin": {
32
+ "fire-code": "dist/cli/index.js"
33
+ },
34
+ "exports": {
35
+ ".": {
36
+ "types": "./dist/index.d.ts",
37
+ "import": "./dist/index.js"
38
+ }
39
+ },
40
+ "files": [
41
+ "dist",
42
+ "plugin/.claude-plugin",
43
+ "plugin/hooks",
44
+ "plugin/scripts",
45
+ "examples",
46
+ "LICENSE",
47
+ "README.md"
48
+ ],
49
+ "scripts": {
50
+ "build": "tsc -p tsconfig.build.json",
51
+ "build:watch": "tsc -p tsconfig.build.json --watch",
52
+ "dev": "tsx src/cli/index.ts dev",
53
+ "start": "node dist/cli/index.js",
54
+ "test": "jest",
55
+ "test:unit": "jest --testPathPattern=__tests__/unit",
56
+ "test:integration": "jest --testPathPattern=__tests__/integration",
57
+ "test:coverage": "jest --coverage",
58
+ "lint": "tsc --noEmit",
59
+ "prepublishOnly": "npm run build && npm test",
60
+ "benchmark": "cross-env LOG_LEVEL=silent npx tsx --tsconfig tsconfig.json scripts/benchmark.ts"
61
+ },
62
+ "dependencies": {
63
+ "@anthropic-ai/claude-agent-sdk": "^0.2.114",
64
+ "@anthropic-ai/sdk": "^0.30.0",
65
+ "@modelcontextprotocol/sdk": "^1.0.0",
66
+ "@types/better-sqlite3": "^7.6.13",
67
+ "@types/express": "^5.0.6",
68
+ "@xenova/transformers": "^2.17.2",
69
+ "axios": "^1.7.0",
70
+ "better-sqlite3": "^12.9.0",
71
+ "chalk": "^5.3.0",
72
+ "commander": "^12.1.0",
73
+ "express": "^5.2.1",
74
+ "glob": "^11.0.0",
75
+ "graphology": "^0.26.0",
76
+ "graphology-pagerank": "^1.1.0",
77
+ "graphology-shortest-path": "^2.1.0",
78
+ "graphology-traversal": "^0.3.1",
79
+ "graphology-types": "^0.24.8",
80
+ "inquirer": "^9.3.0",
81
+ "openai": "^4.67.0",
82
+ "ora": "^8.1.0",
83
+ "pino": "^9.5.0",
84
+ "simple-git": "^3.27.0",
85
+ "tree-sitter": "^0.25.0",
86
+ "tree-sitter-go": "^0.25.0",
87
+ "tree-sitter-javascript": "^0.25.0",
88
+ "tree-sitter-python": "^0.25.0",
89
+ "tree-sitter-rust": "^0.24.0",
90
+ "tree-sitter-typescript": "^0.23.2",
91
+ "ts-morph": "^23.0.0",
92
+ "vectra": "^0.14.0",
93
+ "zod": "^3.23.0"
94
+ },
95
+ "devDependencies": {
96
+ "@types/inquirer": "^9.0.0",
97
+ "@types/jest": "^29.5.0",
98
+ "@types/node": "^20.0.0",
99
+ "cross-env": "^10.1.0",
100
+ "jest": "^29.7.0",
101
+ "pino-pretty": "^11.3.0",
102
+ "ts-jest": "^29.2.0",
103
+ "ts-node": "^10.9.2",
104
+ "tsup": "^8.3.0",
105
+ "tsx": "^4.19.0",
106
+ "typescript": "^5.6.0"
107
+ },
108
+ "engines": {
109
+ "node": ">=20.0.0"
110
+ }
111
+ }
@@ -0,0 +1,17 @@
1
+ {
2
+ "name": "fire-code",
3
+ "version": "0.1.0",
4
+ "description": "Intelligent MCP execution engine for AI coding agents — persistent memory, context-aware, Git-traceable",
5
+ "author": {
6
+ "name": "FireCode Contributors",
7
+ "url": "https://github.com/YOUR_USERNAME/fire-code"
8
+ },
9
+ "license": "MIT",
10
+ "repository": "https://github.com/YOUR_USERNAME/fire-code",
11
+ "mcp": {
12
+ "command": "npx",
13
+ "args": ["fire-code", "dev"],
14
+ "description": "Fire Code MCP server (smart_search, smart_outline, get_context, search_code, get_graph, execute)"
15
+ },
16
+ "hooks": "./hooks/hooks.json"
17
+ }
@@ -0,0 +1,86 @@
1
+ {
2
+ "description": "Fire Code lifecycle hooks — auto-index on file writes, inject memory context on session start",
3
+ "hooks": {
4
+ "Setup": [
5
+ {
6
+ "matcher": "*",
7
+ "hooks": [
8
+ {
9
+ "type": "command",
10
+ "command": "_R=\"${CLAUDE_PLUGIN_ROOT}\"; [ -z \"$_R\" ] && _R=$(ls -dt $HOME/.claude/plugins/cache/*/fire-code/[0-9]*/ 2>/dev/null | head -1); _R=\"${_R%/}\"; [ -z \"$_R\" ] && _R=\"$HOME/.claude/plugins/marketplaces/fire-code/plugin\"; node \"$_R/scripts/smart-install.js\"",
11
+ "timeout": 120
12
+ }
13
+ ]
14
+ }
15
+ ],
16
+ "SessionStart": [
17
+ {
18
+ "matcher": "startup|clear|compact",
19
+ "hooks": [
20
+ {
21
+ "type": "command",
22
+ "command": "_R=\"${CLAUDE_PLUGIN_ROOT}\"; [ -z \"$_R\" ] && _R=$(ls -dt $HOME/.claude/plugins/cache/*/fire-code/[0-9]*/ 2>/dev/null | head -1); _R=\"${_R%/}\"; [ -z \"$_R\" ] && _R=\"$HOME/.claude/plugins/marketplaces/fire-code/plugin\"; node \"$_R/scripts/context-inject.js\" session-start",
23
+ "timeout": 30
24
+ }
25
+ ]
26
+ }
27
+ ],
28
+ "UserPromptSubmit": [
29
+ {
30
+ "hooks": [
31
+ {
32
+ "type": "command",
33
+ "command": "_R=\"${CLAUDE_PLUGIN_ROOT}\"; [ -z \"$_R\" ] && _R=$(ls -dt $HOME/.claude/plugins/cache/*/fire-code/[0-9]*/ 2>/dev/null | head -1); _R=\"${_R%/}\"; [ -z \"$_R\" ] && _R=\"$HOME/.claude/plugins/marketplaces/fire-code/plugin\"; node \"$_R/scripts/context-inject.js\" session-init",
34
+ "timeout": 10
35
+ }
36
+ ]
37
+ }
38
+ ],
39
+ "PreToolUse": [
40
+ {
41
+ "matcher": "Read",
42
+ "hooks": [
43
+ {
44
+ "type": "command",
45
+ "command": "_R=\"${CLAUDE_PLUGIN_ROOT}\"; [ -z \"$_R\" ] && _R=$(ls -dt $HOME/.claude/plugins/cache/*/fire-code/[0-9]*/ 2>/dev/null | head -1); _R=\"${_R%/}\"; [ -z \"$_R\" ] && _R=\"$HOME/.claude/plugins/marketplaces/fire-code/plugin\"; node \"$_R/scripts/context-inject.js\" pre-read",
46
+ "timeout": 5
47
+ }
48
+ ]
49
+ }
50
+ ],
51
+ "PostToolUse": [
52
+ {
53
+ "matcher": "*",
54
+ "hooks": [
55
+ {
56
+ "type": "command",
57
+ "command": "_R=\"${CLAUDE_PLUGIN_ROOT}\"; [ -z \"$_R\" ] && _R=$(ls -dt $HOME/.claude/plugins/cache/*/fire-code/[0-9]*/ 2>/dev/null | head -1); _R=\"${_R%/}\"; [ -z \"$_R\" ] && _R=\"$HOME/.claude/plugins/marketplaces/fire-code/plugin\"; node \"$_R/scripts/context-inject.js\" post-tool",
58
+ "timeout": 60
59
+ }
60
+ ]
61
+ }
62
+ ],
63
+ "Stop": [
64
+ {
65
+ "hooks": [
66
+ {
67
+ "type": "command",
68
+ "command": "_R=\"${CLAUDE_PLUGIN_ROOT}\"; [ -z \"$_R\" ] && _R=$(ls -dt $HOME/.claude/plugins/cache/*/fire-code/[0-9]*/ 2>/dev/null | head -1); _R=\"${_R%/}\"; [ -z \"$_R\" ] && _R=\"$HOME/.claude/plugins/marketplaces/fire-code/plugin\"; node \"$_R/scripts/context-inject.js\" stop",
69
+ "timeout": 30
70
+ }
71
+ ]
72
+ }
73
+ ],
74
+ "SessionEnd": [
75
+ {
76
+ "hooks": [
77
+ {
78
+ "type": "command",
79
+ "command": "_R=\"${CLAUDE_PLUGIN_ROOT}\"; [ -z \"$_R\" ] && _R=$(ls -dt $HOME/.claude/plugins/cache/*/fire-code/[0-9]*/ 2>/dev/null | head -1); _R=\"${_R%/}\"; [ -z \"$_R\" ] && _R=\"$HOME/.claude/plugins/marketplaces/fire-code/plugin\"; node \"$_R/scripts/context-inject.js\" session-end",
80
+ "timeout": 15
81
+ }
82
+ ]
83
+ }
84
+ ]
85
+ }
86
+ }