vemora 0.1.0-alpha.8

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 (242) hide show
  1. package/README.md +716 -0
  2. package/dist/cli.d.ts +16 -0
  3. package/dist/cli.d.ts.map +1 -0
  4. package/dist/cli.js +589 -0
  5. package/dist/cli.js.map +1 -0
  6. package/dist/commands/ask.d.ts +14 -0
  7. package/dist/commands/ask.d.ts.map +1 -0
  8. package/dist/commands/ask.js +136 -0
  9. package/dist/commands/ask.js.map +1 -0
  10. package/dist/commands/audit.d.ts +17 -0
  11. package/dist/commands/audit.d.ts.map +1 -0
  12. package/dist/commands/audit.js +408 -0
  13. package/dist/commands/audit.js.map +1 -0
  14. package/dist/commands/brief.d.ts +14 -0
  15. package/dist/commands/brief.d.ts.map +1 -0
  16. package/dist/commands/brief.js +73 -0
  17. package/dist/commands/brief.js.map +1 -0
  18. package/dist/commands/chat.d.ts +7 -0
  19. package/dist/commands/chat.d.ts.map +1 -0
  20. package/dist/commands/chat.js +161 -0
  21. package/dist/commands/chat.js.map +1 -0
  22. package/dist/commands/context.d.ts +61 -0
  23. package/dist/commands/context.d.ts.map +1 -0
  24. package/dist/commands/context.js +778 -0
  25. package/dist/commands/context.js.map +1 -0
  26. package/dist/commands/deps.d.ts +20 -0
  27. package/dist/commands/deps.d.ts.map +1 -0
  28. package/dist/commands/deps.js +138 -0
  29. package/dist/commands/deps.js.map +1 -0
  30. package/dist/commands/focus.d.ts +6 -0
  31. package/dist/commands/focus.d.ts.map +1 -0
  32. package/dist/commands/focus.js +302 -0
  33. package/dist/commands/focus.js.map +1 -0
  34. package/dist/commands/index.d.ts +10 -0
  35. package/dist/commands/index.d.ts.map +1 -0
  36. package/dist/commands/index.js +366 -0
  37. package/dist/commands/index.js.map +1 -0
  38. package/dist/commands/init-agent.d.ts +23 -0
  39. package/dist/commands/init-agent.d.ts.map +1 -0
  40. package/dist/commands/init-agent.js +447 -0
  41. package/dist/commands/init-agent.js.map +1 -0
  42. package/dist/commands/init.d.ts +2 -0
  43. package/dist/commands/init.d.ts.map +1 -0
  44. package/dist/commands/init.js +122 -0
  45. package/dist/commands/init.js.map +1 -0
  46. package/dist/commands/knowledge.d.ts +8 -0
  47. package/dist/commands/knowledge.d.ts.map +1 -0
  48. package/dist/commands/knowledge.js +98 -0
  49. package/dist/commands/knowledge.js.map +1 -0
  50. package/dist/commands/plan.d.ts +16 -0
  51. package/dist/commands/plan.d.ts.map +1 -0
  52. package/dist/commands/plan.js +535 -0
  53. package/dist/commands/plan.js.map +1 -0
  54. package/dist/commands/query.d.ts +39 -0
  55. package/dist/commands/query.d.ts.map +1 -0
  56. package/dist/commands/query.js +389 -0
  57. package/dist/commands/query.js.map +1 -0
  58. package/dist/commands/remember.d.ts +11 -0
  59. package/dist/commands/remember.d.ts.map +1 -0
  60. package/dist/commands/remember.js +174 -0
  61. package/dist/commands/remember.js.map +1 -0
  62. package/dist/commands/report.d.ts +10 -0
  63. package/dist/commands/report.d.ts.map +1 -0
  64. package/dist/commands/report.js +180 -0
  65. package/dist/commands/report.js.map +1 -0
  66. package/dist/commands/status.d.ts +2 -0
  67. package/dist/commands/status.d.ts.map +1 -0
  68. package/dist/commands/status.js +127 -0
  69. package/dist/commands/status.js.map +1 -0
  70. package/dist/commands/summarize.d.ts +14 -0
  71. package/dist/commands/summarize.d.ts.map +1 -0
  72. package/dist/commands/summarize.js +205 -0
  73. package/dist/commands/summarize.js.map +1 -0
  74. package/dist/commands/triage.d.ts +33 -0
  75. package/dist/commands/triage.d.ts.map +1 -0
  76. package/dist/commands/triage.js +419 -0
  77. package/dist/commands/triage.js.map +1 -0
  78. package/dist/commands/usages.d.ts +14 -0
  79. package/dist/commands/usages.d.ts.map +1 -0
  80. package/dist/commands/usages.js +236 -0
  81. package/dist/commands/usages.js.map +1 -0
  82. package/dist/core/config.d.ts +35 -0
  83. package/dist/core/config.d.ts.map +1 -0
  84. package/dist/core/config.js +140 -0
  85. package/dist/core/config.js.map +1 -0
  86. package/dist/core/types.d.ts +251 -0
  87. package/dist/core/types.d.ts.map +1 -0
  88. package/dist/core/types.js +4 -0
  89. package/dist/core/types.js.map +1 -0
  90. package/dist/embeddings/factory.d.ts +9 -0
  91. package/dist/embeddings/factory.d.ts.map +1 -0
  92. package/dist/embeddings/factory.js +26 -0
  93. package/dist/embeddings/factory.js.map +1 -0
  94. package/dist/embeddings/noop.d.ts +17 -0
  95. package/dist/embeddings/noop.d.ts.map +1 -0
  96. package/dist/embeddings/noop.js +22 -0
  97. package/dist/embeddings/noop.js.map +1 -0
  98. package/dist/embeddings/ollama.d.ts +16 -0
  99. package/dist/embeddings/ollama.d.ts.map +1 -0
  100. package/dist/embeddings/ollama.js +41 -0
  101. package/dist/embeddings/ollama.js.map +1 -0
  102. package/dist/embeddings/openai.d.ts +10 -0
  103. package/dist/embeddings/openai.d.ts.map +1 -0
  104. package/dist/embeddings/openai.js +67 -0
  105. package/dist/embeddings/openai.js.map +1 -0
  106. package/dist/embeddings/provider.d.ts +19 -0
  107. package/dist/embeddings/provider.d.ts.map +1 -0
  108. package/dist/embeddings/provider.js +3 -0
  109. package/dist/embeddings/provider.js.map +1 -0
  110. package/dist/indexer/callgraph.d.ts +16 -0
  111. package/dist/indexer/callgraph.d.ts.map +1 -0
  112. package/dist/indexer/callgraph.js +154 -0
  113. package/dist/indexer/callgraph.js.map +1 -0
  114. package/dist/indexer/chunkBySlidingWindow.d.ts +6 -0
  115. package/dist/indexer/chunkBySlidingWindow.d.ts.map +1 -0
  116. package/dist/indexer/chunkBySlidingWindow.js +30 -0
  117. package/dist/indexer/chunkBySlidingWindow.js.map +1 -0
  118. package/dist/indexer/chunkBySymbols.d.ts +7 -0
  119. package/dist/indexer/chunkBySymbols.d.ts.map +1 -0
  120. package/dist/indexer/chunkBySymbols.js +57 -0
  121. package/dist/indexer/chunkBySymbols.js.map +1 -0
  122. package/dist/indexer/chunker.d.ts +15 -0
  123. package/dist/indexer/chunker.d.ts.map +1 -0
  124. package/dist/indexer/chunker.js +26 -0
  125. package/dist/indexer/chunker.js.map +1 -0
  126. package/dist/indexer/classHeader.d.ts +7 -0
  127. package/dist/indexer/classHeader.d.ts.map +1 -0
  128. package/dist/indexer/classHeader.js +37 -0
  129. package/dist/indexer/classHeader.js.map +1 -0
  130. package/dist/indexer/deps.d.ts +66 -0
  131. package/dist/indexer/deps.d.ts.map +1 -0
  132. package/dist/indexer/deps.js +409 -0
  133. package/dist/indexer/deps.js.map +1 -0
  134. package/dist/indexer/hasher.d.ts +17 -0
  135. package/dist/indexer/hasher.d.ts.map +1 -0
  136. package/dist/indexer/hasher.js +38 -0
  137. package/dist/indexer/hasher.js.map +1 -0
  138. package/dist/indexer/parser.d.ts +18 -0
  139. package/dist/indexer/parser.d.ts.map +1 -0
  140. package/dist/indexer/parser.js +355 -0
  141. package/dist/indexer/parser.js.map +1 -0
  142. package/dist/indexer/scanner.d.ts +18 -0
  143. package/dist/indexer/scanner.d.ts.map +1 -0
  144. package/dist/indexer/scanner.js +37 -0
  145. package/dist/indexer/scanner.js.map +1 -0
  146. package/dist/indexer/strategy.d.ts +11 -0
  147. package/dist/indexer/strategy.d.ts.map +1 -0
  148. package/dist/indexer/strategy.js +15 -0
  149. package/dist/indexer/strategy.js.map +1 -0
  150. package/dist/indexer/tests.d.ts +15 -0
  151. package/dist/indexer/tests.d.ts.map +1 -0
  152. package/dist/indexer/tests.js +68 -0
  153. package/dist/indexer/tests.js.map +1 -0
  154. package/dist/indexer/todos.d.ts +9 -0
  155. package/dist/indexer/todos.d.ts.map +1 -0
  156. package/dist/indexer/todos.js +29 -0
  157. package/dist/indexer/todos.js.map +1 -0
  158. package/dist/llm/anthropic.d.ts +8 -0
  159. package/dist/llm/anthropic.d.ts.map +1 -0
  160. package/dist/llm/anthropic.js +76 -0
  161. package/dist/llm/anthropic.js.map +1 -0
  162. package/dist/llm/factory.d.ts +7 -0
  163. package/dist/llm/factory.d.ts.map +1 -0
  164. package/dist/llm/factory.js +39 -0
  165. package/dist/llm/factory.js.map +1 -0
  166. package/dist/llm/ollama.d.ts +8 -0
  167. package/dist/llm/ollama.d.ts.map +1 -0
  168. package/dist/llm/ollama.js +83 -0
  169. package/dist/llm/ollama.js.map +1 -0
  170. package/dist/llm/openai.d.ts +8 -0
  171. package/dist/llm/openai.d.ts.map +1 -0
  172. package/dist/llm/openai.js +68 -0
  173. package/dist/llm/openai.js.map +1 -0
  174. package/dist/llm/provider.d.ts +29 -0
  175. package/dist/llm/provider.d.ts.map +1 -0
  176. package/dist/llm/provider.js +3 -0
  177. package/dist/llm/provider.js.map +1 -0
  178. package/dist/search/bm25.d.ts +3 -0
  179. package/dist/search/bm25.d.ts.map +1 -0
  180. package/dist/search/bm25.js +102 -0
  181. package/dist/search/bm25.js.map +1 -0
  182. package/dist/search/formatter.d.ts +43 -0
  183. package/dist/search/formatter.d.ts.map +1 -0
  184. package/dist/search/formatter.js +208 -0
  185. package/dist/search/formatter.js.map +1 -0
  186. package/dist/search/hybrid.d.ts +10 -0
  187. package/dist/search/hybrid.d.ts.map +1 -0
  188. package/dist/search/hybrid.js +53 -0
  189. package/dist/search/hybrid.js.map +1 -0
  190. package/dist/search/merge.d.ts +33 -0
  191. package/dist/search/merge.d.ts.map +1 -0
  192. package/dist/search/merge.js +158 -0
  193. package/dist/search/merge.js.map +1 -0
  194. package/dist/search/mmr.d.ts +23 -0
  195. package/dist/search/mmr.d.ts.map +1 -0
  196. package/dist/search/mmr.js +95 -0
  197. package/dist/search/mmr.js.map +1 -0
  198. package/dist/search/rerank.d.ts +15 -0
  199. package/dist/search/rerank.d.ts.map +1 -0
  200. package/dist/search/rerank.js +76 -0
  201. package/dist/search/rerank.js.map +1 -0
  202. package/dist/search/signature.d.ts +42 -0
  203. package/dist/search/signature.d.ts.map +1 -0
  204. package/dist/search/signature.js +112 -0
  205. package/dist/search/signature.js.map +1 -0
  206. package/dist/search/vector.d.ts +41 -0
  207. package/dist/search/vector.d.ts.map +1 -0
  208. package/dist/search/vector.js +185 -0
  209. package/dist/search/vector.js.map +1 -0
  210. package/dist/storage/cache.d.ts +30 -0
  211. package/dist/storage/cache.d.ts.map +1 -0
  212. package/dist/storage/cache.js +160 -0
  213. package/dist/storage/cache.js.map +1 -0
  214. package/dist/storage/knowledge.d.ts +17 -0
  215. package/dist/storage/knowledge.d.ts.map +1 -0
  216. package/dist/storage/knowledge.js +58 -0
  217. package/dist/storage/knowledge.js.map +1 -0
  218. package/dist/storage/repository.d.ts +27 -0
  219. package/dist/storage/repository.d.ts.map +1 -0
  220. package/dist/storage/repository.js +95 -0
  221. package/dist/storage/repository.js.map +1 -0
  222. package/dist/storage/session.d.ts +38 -0
  223. package/dist/storage/session.d.ts.map +1 -0
  224. package/dist/storage/session.js +100 -0
  225. package/dist/storage/session.js.map +1 -0
  226. package/dist/storage/summaries.d.ts +19 -0
  227. package/dist/storage/summaries.d.ts.map +1 -0
  228. package/dist/storage/summaries.js +66 -0
  229. package/dist/storage/summaries.js.map +1 -0
  230. package/dist/storage/usage.d.ts +35 -0
  231. package/dist/storage/usage.d.ts.map +1 -0
  232. package/dist/storage/usage.js +55 -0
  233. package/dist/storage/usage.js.map +1 -0
  234. package/dist/utils/git.d.ts +15 -0
  235. package/dist/utils/git.d.ts.map +1 -0
  236. package/dist/utils/git.js +38 -0
  237. package/dist/utils/git.js.map +1 -0
  238. package/dist/utils/tokenizer.d.ts +24 -0
  239. package/dist/utils/tokenizer.d.ts.map +1 -0
  240. package/dist/utils/tokenizer.js +52 -0
  241. package/dist/utils/tokenizer.js.map +1 -0
  242. package/package.json +71 -0
@@ -0,0 +1,73 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.runBrief = runBrief;
7
+ const chalk_1 = __importDefault(require("chalk"));
8
+ const config_1 = require("../core/config");
9
+ const knowledge_1 = require("../storage/knowledge");
10
+ const summaries_1 = require("../storage/summaries");
11
+ /**
12
+ * Prints a compact session primer (~L0 + L1 in mempalace terms):
13
+ * - Project overview (from vemora summarize)
14
+ * - High-confidence knowledge entries
15
+ *
16
+ * Designed to be run at the start of an LLM session to re-establish context
17
+ * without loading the full index. Optimised for minimal token use.
18
+ */
19
+ async function runBrief(rootDir, options = {}) {
20
+ const config = (0, config_1.loadConfig)(rootDir);
21
+ const summaryStorage = new summaries_1.SummaryStorage(rootDir);
22
+ const knowledgeStorage = new knowledge_1.KnowledgeStorage(rootDir);
23
+ const projectSummary = summaryStorage.loadProjectSummary();
24
+ const allEntries = knowledgeStorage.load();
25
+ const entries = options.all
26
+ ? allEntries
27
+ : allEntries.filter((e) => e.confidence === "high");
28
+ // ── Header ───────────────────────────────────────────────────────────────────
29
+ console.log(chalk_1.default.bold(`# ${config.projectName} — session brief`));
30
+ console.log();
31
+ // ── L0: Project overview ─────────────────────────────────────────────────────
32
+ if (projectSummary) {
33
+ console.log(chalk_1.default.bold("## Overview"));
34
+ console.log(projectSummary.overview);
35
+ console.log();
36
+ }
37
+ else {
38
+ console.log(chalk_1.default.gray("No project overview available. Run `vemora summarize` to generate one."));
39
+ console.log();
40
+ }
41
+ // ── L1: High-confidence knowledge ────────────────────────────────────────────
42
+ if (entries.length > 0) {
43
+ const label = options.all ? "Knowledge" : "Critical knowledge";
44
+ console.log(chalk_1.default.bold(`## ${label} (${entries.length})`));
45
+ console.log();
46
+ const byCategory = new Map();
47
+ for (const e of entries) {
48
+ const list = byCategory.get(e.category) ?? [];
49
+ list.push(e);
50
+ byCategory.set(e.category, list);
51
+ }
52
+ for (const [cat, catEntries] of byCategory) {
53
+ console.log(chalk_1.default.underline(cat));
54
+ for (const e of catEntries) {
55
+ console.log(`- **${e.title}**`);
56
+ // Print body but cap at 120 chars to keep the primer tight
57
+ const body = e.body.length > 120 ? e.body.slice(0, 117) + "…" : e.body;
58
+ console.log(` ${chalk_1.default.gray(body)}`);
59
+ }
60
+ console.log();
61
+ }
62
+ }
63
+ else {
64
+ const hint = options.all
65
+ ? "No knowledge entries found. Use `vemora remember` to add some."
66
+ : "No high-confidence entries found. Use `vemora knowledge list` to review all entries.";
67
+ console.log(chalk_1.default.gray(hint));
68
+ console.log();
69
+ }
70
+ // ── Footer hint ──────────────────────────────────────────────────────────────
71
+ console.log(chalk_1.default.gray(`Tip: run \`vemora knowledge list --root .\` for the full knowledge base.`));
72
+ }
73
+ //# sourceMappingURL=brief.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"brief.js","sourceRoot":"","sources":["../../src/commands/brief.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ export interface ChatOptions {
2
+ provider?: string;
3
+ model?: string;
4
+ topK?: number;
5
+ }
6
+ export declare function runChat(rootDir: string, options?: ChatOptions): Promise<void>;
7
+ //# sourceMappingURL=chat.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"chat.d.ts","sourceRoot":"","sources":["../../src/commands/chat.ts"],"names":[],"mappings":"AAwBA,MAAM,WAAW,WAAW;IAC1B,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED,wBAAsB,OAAO,CAC3B,OAAO,EAAE,MAAM,EACf,OAAO,GAAE,WAAgB,GACxB,OAAO,CAAC,IAAI,CAAC,CAwLf"}
@@ -0,0 +1,161 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.runChat = runChat;
7
+ const chalk_1 = __importDefault(require("chalk"));
8
+ const ora_1 = __importDefault(require("ora"));
9
+ const readline_1 = __importDefault(require("readline"));
10
+ const config_1 = require("../core/config");
11
+ const factory_1 = require("../embeddings/factory");
12
+ const factory_2 = require("../llm/factory");
13
+ const bm25_1 = require("../search/bm25");
14
+ const formatter_1 = require("../search/formatter");
15
+ const hybrid_1 = require("../search/hybrid");
16
+ const rerank_1 = require("../search/rerank");
17
+ const cache_1 = require("../storage/cache");
18
+ const repository_1 = require("../storage/repository");
19
+ const summaries_1 = require("../storage/summaries");
20
+ async function runChat(rootDir, options = {}) {
21
+ const config = (0, config_1.loadConfig)(rootDir);
22
+ const repo = new repository_1.RepositoryStorage(rootDir);
23
+ const cacheStorage = new cache_1.EmbeddingCacheStorage(config.projectId);
24
+ const summaryStorage = new summaries_1.SummaryStorage(rootDir);
25
+ const chunks = repo.loadChunks();
26
+ const symbols = repo.loadSymbols();
27
+ const depGraph = repo.loadDeps();
28
+ const callGraph = repo.loadCallGraph();
29
+ const fileSummaries = summaryStorage.hasFileSummaries()
30
+ ? summaryStorage.loadFileSummaries()
31
+ : {};
32
+ const projectSummary = summaryStorage.loadProjectSummary();
33
+ // Use the provider from CLI options, then from config, then default to openai
34
+ const providerType = (options.provider ||
35
+ config.summarization?.provider ||
36
+ "openai");
37
+ const llmConfig = {
38
+ ...(config.summarization || {}),
39
+ provider: providerType,
40
+ model: config.summarization?.model ?? "gpt-4o-mini",
41
+ };
42
+ if (options.model)
43
+ llmConfig.model = options.model;
44
+ const llm = (0, factory_2.createLLMProvider)(llmConfig);
45
+ const history = [];
46
+ const rl = readline_1.default.createInterface({
47
+ input: process.stdin,
48
+ output: process.stdout,
49
+ prompt: chalk_1.default.blue.bold("You > "),
50
+ });
51
+ console.log(chalk_1.default.bold("\nWelcome to vemora chat!"));
52
+ console.log(chalk_1.default.gray(`Project: ${config.projectName}`));
53
+ console.log(chalk_1.default.gray('Type your question about the codebase. Type "exit" or "quit" to stop.\n'));
54
+ rl.prompt();
55
+ rl.on("line", async (line) => {
56
+ const input = line.trim();
57
+ if (!input) {
58
+ rl.prompt();
59
+ return;
60
+ }
61
+ if (input.toLowerCase() === "exit" || input.toLowerCase() === "quit") {
62
+ rl.close();
63
+ return;
64
+ }
65
+ // 1. Search for context based on user input
66
+ const spinner = (0, ora_1.default)("Searching for context...").start();
67
+ let contextStr = "";
68
+ try {
69
+ let results = [];
70
+ const useKeyword = config.embedding.provider === "none";
71
+ if (useKeyword) {
72
+ results = (0, bm25_1.computeBM25Scores)(input, chunks, symbols, options.topK || 5);
73
+ }
74
+ else {
75
+ const cache = cacheStorage.load();
76
+ if (cache &&
77
+ (cache.chunkIds?.length || Object.keys(cache.embeddings ?? {}).length)) {
78
+ const provider = (0, factory_1.createEmbeddingProvider)(config.embedding);
79
+ const [queryEmbedding] = await provider.embed([input]);
80
+ // Use hybrid search for better quality
81
+ results = await (0, hybrid_1.hybridSearch)(input, queryEmbedding, chunks, cache, symbols, {
82
+ topK: 25, // Get more for reranking
83
+ });
84
+ // Always rerank for chat to ensure best quality
85
+ results = await (0, rerank_1.rerankResults)(input, results, options.topK || 5);
86
+ }
87
+ else {
88
+ results = (0, bm25_1.computeBM25Scores)(input, chunks, symbols, options.topK || 5);
89
+ }
90
+ }
91
+ contextStr = (0, formatter_1.formatMarkdown)(input, results, depGraph, fileSummaries, callGraph, {
92
+ // Pass callGraph here
93
+ format: "markdown",
94
+ topK: options.topK || 5,
95
+ });
96
+ spinner.succeed("Context found");
97
+ }
98
+ catch (err) {
99
+ spinner.fail(`Context search failed: ${err.message}`);
100
+ }
101
+ // 2. Build the prompt
102
+ // We inject the project summary and the specific relevant code found
103
+ const systemPrompt = `You are an expert software engineer assistant.
104
+ You have access to the following project context to help you answer:
105
+
106
+ ${projectSummary ? `PROJECT OVERVIEW:\n${projectSummary.overview}\n\n` : ""}
107
+ RELEVANT CODE CHUNKS:
108
+ ${contextStr}
109
+
110
+ Use this context to provide accurate, specific, and helpful answers about the codebase.
111
+ If the information is not in the context, be honest about it.`;
112
+ // 3. Prepare message history
113
+ // For now, we update the system prompt per message to reflect new context
114
+ // This is a simple implementation; a better one would prune old context
115
+ const currentMessages = [
116
+ { role: "system", content: systemPrompt },
117
+ ...history,
118
+ { role: "user", content: input },
119
+ ];
120
+ // 4. Call LLM
121
+ const llmSpinner = (0, ora_1.default)("LLM is thinking...").start();
122
+ try {
123
+ let fullResponse = "";
124
+ process.stdout.write(`\n${chalk_1.default.green.bold("AI >")} `);
125
+ await llm.chat(currentMessages, {
126
+ model: options.model || config.summarization?.model || "gpt-4o-mini",
127
+ onToken: (token) => {
128
+ if (llmSpinner.isSpinning) {
129
+ llmSpinner.stop();
130
+ }
131
+ process.stdout.write(token);
132
+ fullResponse += token;
133
+ },
134
+ });
135
+ if (llmSpinner.isSpinning) {
136
+ llmSpinner.stop();
137
+ }
138
+ console.log("\n");
139
+ // Update history
140
+ history.push({ role: "user", content: input });
141
+ history.push({ role: "assistant", content: fullResponse });
142
+ // Limit history to last 10 messages to avoid token bloat
143
+ if (history.length > 10) {
144
+ history.splice(0, 2);
145
+ }
146
+ }
147
+ catch (err) {
148
+ if (llmSpinner.isSpinning) {
149
+ llmSpinner.fail(`LLM call failed: ${err.message}`);
150
+ }
151
+ else {
152
+ console.error(chalk_1.default.red(`\nLLM call failed: ${err.message}`));
153
+ }
154
+ }
155
+ rl.prompt();
156
+ }).on("close", () => {
157
+ console.log(chalk_1.default.bold("\nGoodbye!"));
158
+ process.exit(0);
159
+ });
160
+ }
161
+ //# sourceMappingURL=chat.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"chat.js","sourceRoot":"","sources":["../../src/commands/chat.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,61 @@
1
+ import type { CallGraph, Chunk, DependencyGraph, FileSummaryIndex, KnowledgeEntry, SearchResult } from "../core/types";
2
+ export interface ContextOptions {
3
+ /** A natural-language query describing the task */
4
+ query?: string;
5
+ /** A specific file to include in full context */
6
+ file?: string;
7
+ /** Number of search results to pull in (default: 5) */
8
+ topK?: number;
9
+ /** Force keyword search */
10
+ keyword?: boolean;
11
+ /** Output format: markdown (default), plain, or terse (ultra-compact for small models) */
12
+ format?: "markdown" | "plain" | "terse";
13
+ /** Show full code (no line cap) */
14
+ showCode?: boolean;
15
+ /** Use cross-encoder reranking */
16
+ rerank?: boolean;
17
+ /** Use hybrid search (vector + BM25) */
18
+ hybrid?: boolean;
19
+ /** Hybrid weight for vector search (0-1) */
20
+ alpha?: number;
21
+ /**
22
+ * Maximum tokens to include across all retrieved chunks.
23
+ * Applied after retrieval and reranking. The first result is always kept.
24
+ */
25
+ budget?: number;
26
+ /** Apply Maximal Marginal Relevance reranking to reduce redundant results */
27
+ mmr?: boolean;
28
+ /** MMR diversity weight: 0=max diversity, 1=pure relevance (default: 0.5) */
29
+ lambda?: number;
30
+ /** Merge adjacent or overlapping chunks from the same file */
31
+ merge?: boolean;
32
+ /** Max line gap between chunks to still merge them (default: 3) */
33
+ mergeGap?: number;
34
+ /**
35
+ * Emit a structured context block organised by semantic role:
36
+ * Entry Point → Direct Dependencies → Called By → Types & Interfaces → Related Patterns.
37
+ * Reduces token usage and improves LLM comprehension compared to a flat ranked list.
38
+ */
39
+ structured?: boolean;
40
+ /** Filter out chunks already seen in the current session */
41
+ session?: boolean;
42
+ /** Reset the session before this query (implies session tracking) */
43
+ fresh?: boolean;
44
+ }
45
+ export declare function runContext(rootDir: string, options?: ContextOptions): Promise<void>;
46
+ /**
47
+ * Procedural function to build the actual context string.
48
+ * This is separated from runContext to allow for benchmarking and testing.
49
+ *
50
+ * When `options.structured` is true and results are available, delegates to
51
+ * `generateStructuredContextString` which organises output by semantic role
52
+ * (Entry Point → Direct Dependencies → Called By → Types & Interfaces → Related Patterns)
53
+ * instead of a flat ranked list.
54
+ *
55
+ * @param allChunks - Full chunk corpus, required for structured mode dep resolution.
56
+ * Optional for backward compatibility with bench.ts.
57
+ */
58
+ export declare function generateContextString(config: {
59
+ projectName: string;
60
+ }, results: SearchResult[], depGraph: DependencyGraph, callGraph: CallGraph, fileSummaries: FileSummaryIndex, projectOverview: string | null, options: ContextOptions, rootDir: string, allChunks?: Chunk[], knowledgeEntries?: KnowledgeEntry[]): string;
61
+ //# sourceMappingURL=context.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"context.d.ts","sourceRoot":"","sources":["../../src/commands/context.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EACV,SAAS,EACT,KAAK,EACL,eAAe,EACf,gBAAgB,EAChB,cAAc,EACd,YAAY,EACb,MAAM,eAAe,CAAC;AAsBvB,MAAM,WAAW,cAAc;IAC7B,mDAAmD;IACnD,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,iDAAiD;IACjD,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,uDAAuD;IACvD,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,2BAA2B;IAC3B,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,0FAA0F;IAC1F,MAAM,CAAC,EAAE,UAAU,GAAG,OAAO,GAAG,OAAO,CAAC;IACxC,mCAAmC;IACnC,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,kCAAkC;IAClC,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,wCAAwC;IACxC,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,4CAA4C;IAC5C,KAAK,CAAC,EAAE,MAAM,CAAC;IACf;;;OAGG;IACH,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,6EAA6E;IAC7E,GAAG,CAAC,EAAE,OAAO,CAAC;IACd,6EAA6E;IAC7E,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,8DAA8D;IAC9D,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,mEAAmE;IACnE,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB;;;;OAIG;IACH,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,4DAA4D;IAC5D,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,qEAAqE;IACrE,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB;AAID,wBAAsB,UAAU,CAC9B,OAAO,EAAE,MAAM,EACf,OAAO,GAAE,cAAmB,GAC3B,OAAO,CAAC,IAAI,CAAC,CAwMf;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,qBAAqB,CACnC,MAAM,EAAE;IAAE,WAAW,EAAE,MAAM,CAAA;CAAE,EAC/B,OAAO,EAAE,YAAY,EAAE,EACvB,QAAQ,EAAE,eAAe,EACzB,SAAS,EAAE,SAAS,EACpB,aAAa,EAAE,gBAAgB,EAC/B,eAAe,EAAE,MAAM,GAAG,IAAI,EAC9B,OAAO,EAAE,cAAc,EACvB,OAAO,EAAE,MAAM,EACf,SAAS,GAAE,KAAK,EAAO,EACvB,gBAAgB,GAAE,cAAc,EAAO,GACtC,MAAM,CA6VR"}