aidex-graphra 1.0.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 (59) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +463 -0
  3. package/dist/chunker.d.ts +3 -0
  4. package/dist/chunker.d.ts.map +1 -0
  5. package/dist/chunker.js +116 -0
  6. package/dist/chunker.js.map +1 -0
  7. package/dist/cli.d.ts +3 -0
  8. package/dist/cli.d.ts.map +1 -0
  9. package/dist/cli.js +821 -0
  10. package/dist/cli.js.map +1 -0
  11. package/dist/graph.d.ts +9 -0
  12. package/dist/graph.d.ts.map +1 -0
  13. package/dist/graph.js +97 -0
  14. package/dist/graph.js.map +1 -0
  15. package/dist/init.d.ts +27 -0
  16. package/dist/init.d.ts.map +1 -0
  17. package/dist/init.js +306 -0
  18. package/dist/init.js.map +1 -0
  19. package/dist/mcp.d.ts +13 -0
  20. package/dist/mcp.d.ts.map +1 -0
  21. package/dist/mcp.js +19 -0
  22. package/dist/mcp.js.map +1 -0
  23. package/dist/mcpServer.d.ts +14 -0
  24. package/dist/mcpServer.d.ts.map +1 -0
  25. package/dist/mcpServer.js +373 -0
  26. package/dist/mcpServer.js.map +1 -0
  27. package/dist/neuralEmbedder.d.ts +21 -0
  28. package/dist/neuralEmbedder.d.ts.map +1 -0
  29. package/dist/neuralEmbedder.js +98 -0
  30. package/dist/neuralEmbedder.js.map +1 -0
  31. package/dist/scanner.d.ts +3 -0
  32. package/dist/scanner.d.ts.map +1 -0
  33. package/dist/scanner.js +43 -0
  34. package/dist/scanner.js.map +1 -0
  35. package/dist/search.d.ts +37 -0
  36. package/dist/search.d.ts.map +1 -0
  37. package/dist/search.js +252 -0
  38. package/dist/search.js.map +1 -0
  39. package/dist/signatureExtractor.d.ts +25 -0
  40. package/dist/signatureExtractor.d.ts.map +1 -0
  41. package/dist/signatureExtractor.js +173 -0
  42. package/dist/signatureExtractor.js.map +1 -0
  43. package/dist/storage.d.ts +59 -0
  44. package/dist/storage.d.ts.map +1 -0
  45. package/dist/storage.js +322 -0
  46. package/dist/storage.js.map +1 -0
  47. package/dist/tokenBudget.d.ts +52 -0
  48. package/dist/tokenBudget.d.ts.map +1 -0
  49. package/dist/tokenBudget.js +175 -0
  50. package/dist/tokenBudget.js.map +1 -0
  51. package/dist/types.d.ts +62 -0
  52. package/dist/types.d.ts.map +1 -0
  53. package/dist/types.js +6 -0
  54. package/dist/types.js.map +1 -0
  55. package/dist/utils/hash.d.ts +6 -0
  56. package/dist/utils/hash.d.ts.map +1 -0
  57. package/dist/utils/hash.js +45 -0
  58. package/dist/utils/hash.js.map +1 -0
  59. package/package.json +69 -0
@@ -0,0 +1,322 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ var __importDefault = (this && this.__importDefault) || function (mod) {
36
+ return (mod && mod.__esModule) ? mod : { "default": mod };
37
+ };
38
+ Object.defineProperty(exports, "__esModule", { value: true });
39
+ exports.getDb = getDb;
40
+ exports.closeDb = closeDb;
41
+ exports.upsertChunk = upsertChunk;
42
+ exports.upsertChunks = upsertChunks;
43
+ exports.getChunk = getChunk;
44
+ exports.getAllChunks = getAllChunks;
45
+ exports.getChunkHash = getChunkHash;
46
+ exports.getChunkCount = getChunkCount;
47
+ exports.upsertEmbedding = upsertEmbedding;
48
+ exports.upsertEmbeddings = upsertEmbeddings;
49
+ exports.getEmbedding = getEmbedding;
50
+ exports.getAllEmbeddings = getAllEmbeddings;
51
+ exports.saveGraph = saveGraph;
52
+ exports.loadGraph = loadGraph;
53
+ exports.setMeta = setMeta;
54
+ exports.getMeta = getMeta;
55
+ exports.getFileMtime = getFileMtime;
56
+ exports.upsertFile = upsertFile;
57
+ exports.getTrackedFiles = getTrackedFiles;
58
+ exports.removeFile = removeFile;
59
+ exports.removeChunksForFile = removeChunksForFile;
60
+ exports.getChunksWithoutEmbeddings = getChunksWithoutEmbeddings;
61
+ exports.clearAll = clearAll;
62
+ const better_sqlite3_1 = __importDefault(require("better-sqlite3"));
63
+ const fs = __importStar(require("fs"));
64
+ const path = __importStar(require("path"));
65
+ /**
66
+ * SQLite-based storage for Graphra.
67
+ * Replaces the bloated chunks.json with a compact, fast database.
68
+ *
69
+ * Tables:
70
+ * chunks — id, file, type, name, signature, code, hash, summary
71
+ * embeddings — chunk_id, vector (binary float32 blob)
72
+ * graph — source_file, target_file
73
+ * meta — key, value (for vocabulary, version, etc.)
74
+ */
75
+ const CACHE_DIR = ".graphra";
76
+ const DB_FILE = path.join(CACHE_DIR, "graphra.db");
77
+ let _db = null;
78
+ /** Get or create the database connection */
79
+ function getDb() {
80
+ if (_db)
81
+ return _db;
82
+ if (!fs.existsSync(CACHE_DIR)) {
83
+ fs.mkdirSync(CACHE_DIR, { recursive: true });
84
+ }
85
+ _db = new better_sqlite3_1.default(DB_FILE);
86
+ _db.pragma("journal_mode = WAL");
87
+ _db.pragma("synchronous = NORMAL");
88
+ // Create tables
89
+ _db.exec(`
90
+ CREATE TABLE IF NOT EXISTS chunks (
91
+ id TEXT PRIMARY KEY,
92
+ file TEXT NOT NULL,
93
+ type TEXT NOT NULL,
94
+ name TEXT NOT NULL,
95
+ signature TEXT NOT NULL DEFAULT '',
96
+ code TEXT NOT NULL,
97
+ hash TEXT NOT NULL,
98
+ summary TEXT NOT NULL DEFAULT ''
99
+ );
100
+
101
+ CREATE TABLE IF NOT EXISTS embeddings (
102
+ chunk_id TEXT PRIMARY KEY,
103
+ vector BLOB,
104
+ FOREIGN KEY (chunk_id) REFERENCES chunks(id)
105
+ );
106
+
107
+ CREATE TABLE IF NOT EXISTS graph (
108
+ source_file TEXT NOT NULL,
109
+ target_file TEXT NOT NULL,
110
+ PRIMARY KEY (source_file, target_file)
111
+ );
112
+
113
+ CREATE TABLE IF NOT EXISTS meta (
114
+ key TEXT PRIMARY KEY,
115
+ value TEXT NOT NULL
116
+ );
117
+
118
+ CREATE TABLE IF NOT EXISTS files (
119
+ path TEXT PRIMARY KEY,
120
+ mtime REAL NOT NULL,
121
+ hash TEXT NOT NULL
122
+ );
123
+
124
+ CREATE INDEX IF NOT EXISTS idx_chunks_file ON chunks(file);
125
+ CREATE INDEX IF NOT EXISTS idx_chunks_name ON chunks(name);
126
+ CREATE INDEX IF NOT EXISTS idx_graph_source ON graph(source_file);
127
+ CREATE INDEX IF NOT EXISTS idx_graph_target ON graph(target_file);
128
+ `);
129
+ return _db;
130
+ }
131
+ /** Close the database */
132
+ function closeDb() {
133
+ if (_db) {
134
+ _db.close();
135
+ _db = null;
136
+ }
137
+ }
138
+ // ============================================
139
+ // Chunk Storage
140
+ // ============================================
141
+ /** Upsert a chunk into the database */
142
+ function upsertChunk(chunk) {
143
+ const db = getDb();
144
+ db.prepare(`
145
+ INSERT OR REPLACE INTO chunks (id, file, type, name, signature, code, hash, summary)
146
+ VALUES (?, ?, ?, ?, ?, ?, ?, ?)
147
+ `).run(chunk.id, chunk.file, chunk.type, chunk.name, chunk.signature, chunk.code, chunk.hash ?? "", chunk.summary ?? "");
148
+ }
149
+ /** Batch upsert chunks (much faster) */
150
+ function upsertChunks(chunks) {
151
+ const db = getDb();
152
+ const stmt = db.prepare(`
153
+ INSERT OR REPLACE INTO chunks (id, file, type, name, signature, code, hash, summary)
154
+ VALUES (?, ?, ?, ?, ?, ?, ?, ?)
155
+ `);
156
+ const tx = db.transaction((items) => {
157
+ for (const c of items) {
158
+ stmt.run(c.id, c.file, c.type, c.name, c.signature, c.code, c.hash ?? "", c.summary ?? "");
159
+ }
160
+ });
161
+ tx(chunks);
162
+ }
163
+ /** Get a chunk by ID */
164
+ function getChunk(id) {
165
+ const db = getDb();
166
+ return db.prepare("SELECT * FROM chunks WHERE id = ?").get(id);
167
+ }
168
+ /** Get all chunks */
169
+ function getAllChunks() {
170
+ const db = getDb();
171
+ return db.prepare("SELECT * FROM chunks").all();
172
+ }
173
+ /** Get chunk hash for cache checking */
174
+ function getChunkHash(id) {
175
+ const db = getDb();
176
+ const row = db.prepare("SELECT hash FROM chunks WHERE id = ?").get(id);
177
+ return row?.hash ?? null;
178
+ }
179
+ /** Get chunk count */
180
+ function getChunkCount() {
181
+ const db = getDb();
182
+ return db.prepare("SELECT COUNT(*) as count FROM chunks").get().count;
183
+ }
184
+ // ============================================
185
+ // Embedding Storage (binary float32 blobs)
186
+ // ============================================
187
+ /** Store an embedding vector as a binary blob */
188
+ function upsertEmbedding(chunkId, vector) {
189
+ const db = getDb();
190
+ const buf = Buffer.from(new Float32Array(vector).buffer);
191
+ db.prepare("INSERT OR REPLACE INTO embeddings (chunk_id, vector) VALUES (?, ?)").run(chunkId, buf);
192
+ }
193
+ /** Batch upsert embeddings */
194
+ function upsertEmbeddings(items) {
195
+ const db = getDb();
196
+ const stmt = db.prepare("INSERT OR REPLACE INTO embeddings (chunk_id, vector) VALUES (?, ?)");
197
+ const tx = db.transaction((entries) => {
198
+ for (const { chunkId, vector } of entries) {
199
+ const buf = Buffer.from(new Float32Array(vector).buffer);
200
+ stmt.run(chunkId, buf);
201
+ }
202
+ });
203
+ tx(items);
204
+ }
205
+ /** Get an embedding vector */
206
+ function getEmbedding(chunkId) {
207
+ const db = getDb();
208
+ const row = db.prepare("SELECT vector FROM embeddings WHERE chunk_id = ?").get(chunkId);
209
+ if (!row?.vector)
210
+ return null;
211
+ return Array.from(new Float32Array(row.vector.buffer, row.vector.byteOffset, row.vector.byteLength / 4));
212
+ }
213
+ /** Get all embeddings as a map */
214
+ function getAllEmbeddings() {
215
+ const db = getDb();
216
+ const rows = db.prepare("SELECT chunk_id, vector FROM embeddings").all();
217
+ const map = new Map();
218
+ for (const row of rows) {
219
+ if (row.vector) {
220
+ map.set(row.chunk_id, Array.from(new Float32Array(row.vector.buffer, row.vector.byteOffset, row.vector.byteLength / 4)));
221
+ }
222
+ }
223
+ return map;
224
+ }
225
+ // ============================================
226
+ // Graph Storage
227
+ // ============================================
228
+ /** Save the dependency graph */
229
+ function saveGraph(graph) {
230
+ const db = getDb();
231
+ db.prepare("DELETE FROM graph").run();
232
+ const stmt = db.prepare("INSERT INTO graph (source_file, target_file) VALUES (?, ?)");
233
+ const tx = db.transaction((g) => {
234
+ for (const [source, targets] of Object.entries(g)) {
235
+ for (const target of targets) {
236
+ stmt.run(source, target);
237
+ }
238
+ }
239
+ });
240
+ tx(graph);
241
+ }
242
+ /** Load the dependency graph */
243
+ function loadGraph() {
244
+ const db = getDb();
245
+ const rows = db.prepare("SELECT source_file, target_file FROM graph").all();
246
+ const graph = {};
247
+ for (const row of rows) {
248
+ if (!graph[row.source_file])
249
+ graph[row.source_file] = [];
250
+ graph[row.source_file].push(row.target_file);
251
+ }
252
+ return graph;
253
+ }
254
+ // ============================================
255
+ // Meta Storage
256
+ // ============================================
257
+ function setMeta(key, value) {
258
+ const db = getDb();
259
+ db.prepare("INSERT OR REPLACE INTO meta (key, value) VALUES (?, ?)").run(key, value);
260
+ }
261
+ function getMeta(key) {
262
+ const db = getDb();
263
+ const row = db.prepare("SELECT value FROM meta WHERE key = ?").get(key);
264
+ return row?.value ?? null;
265
+ }
266
+ // ============================================
267
+ // File Tracking (for incremental re-indexing)
268
+ // ============================================
269
+ /** Get stored mtime for a file */
270
+ function getFileMtime(filePath) {
271
+ const db = getDb();
272
+ const row = db.prepare("SELECT mtime FROM files WHERE path = ?").get(filePath);
273
+ return row?.mtime ?? null;
274
+ }
275
+ /** Upsert file tracking info */
276
+ function upsertFile(filePath, mtime, hash) {
277
+ const db = getDb();
278
+ db.prepare("INSERT OR REPLACE INTO files (path, mtime, hash) VALUES (?, ?, ?)").run(filePath, mtime, hash);
279
+ }
280
+ /** Get all tracked file paths */
281
+ function getTrackedFiles() {
282
+ const db = getDb();
283
+ return db.prepare("SELECT path FROM files").all().map((r) => r.path);
284
+ }
285
+ /** Remove a file and all its chunks/embeddings */
286
+ function removeFile(filePath) {
287
+ const db = getDb();
288
+ // Get chunk IDs for this file
289
+ const chunkIds = db.prepare("SELECT id FROM chunks WHERE file = ?").all(filePath).map((r) => r.id);
290
+ // Delete embeddings for those chunks
291
+ if (chunkIds.length > 0) {
292
+ const placeholders = chunkIds.map(() => "?").join(",");
293
+ db.prepare(`DELETE FROM embeddings WHERE chunk_id IN (${placeholders})`).run(...chunkIds);
294
+ }
295
+ // Delete chunks
296
+ db.prepare("DELETE FROM chunks WHERE file = ?").run(filePath);
297
+ // Delete file record
298
+ db.prepare("DELETE FROM files WHERE path = ?").run(filePath);
299
+ }
300
+ /** Remove chunks for a file (before re-inserting updated ones).
301
+ * Uses LIKE matching to handle both relative and absolute paths. */
302
+ function removeChunksForFile(filePath) {
303
+ const db = getDb();
304
+ // Match by exact path OR by path ending (handles relative vs absolute)
305
+ const chunkIds = db.prepare("SELECT id FROM chunks WHERE file = ? OR file LIKE ?").all(filePath, `%${filePath.replace(/\\/g, "/")}`).map((r) => r.id);
306
+ if (chunkIds.length > 0) {
307
+ const placeholders = chunkIds.map(() => "?").join(",");
308
+ db.prepare(`DELETE FROM embeddings WHERE chunk_id IN (${placeholders})`).run(...chunkIds);
309
+ db.prepare(`DELETE FROM chunks WHERE id IN (${placeholders})`).run(...chunkIds);
310
+ }
311
+ }
312
+ /** Get chunk IDs that have no embedding yet */
313
+ function getChunksWithoutEmbeddings() {
314
+ const db = getDb();
315
+ return db.prepare("SELECT c.id FROM chunks c LEFT JOIN embeddings e ON c.id = e.chunk_id WHERE e.chunk_id IS NULL").all().map((r) => r.id);
316
+ }
317
+ /** Clear all data (for full regeneration) */
318
+ function clearAll() {
319
+ const db = getDb();
320
+ db.exec("DELETE FROM embeddings; DELETE FROM chunks; DELETE FROM graph; DELETE FROM meta; DELETE FROM files;");
321
+ }
322
+ //# sourceMappingURL=storage.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"storage.js","sourceRoot":"","sources":["../src/storage.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,52 @@
1
+ /**
2
+ * Token Budget — shared token estimation and packing logic.
3
+ *
4
+ * Used by CLI, REST server, and MCP server to ensure consistent
5
+ * token-aware context packing everywhere.
6
+ */
7
+ /**
8
+ * Estimate token count for a string.
9
+ *
10
+ * Uses a refined heuristic based on OpenAI's tokenizer patterns:
11
+ * - Code tokens average ~3.5 chars (shorter than English prose ~4.3)
12
+ * - Identifiers like `getUserSession` count as 2-3 tokens
13
+ * - Punctuation (brackets, colons, commas) each count as 1 token
14
+ * - Whitespace is mostly free (merged with adjacent tokens)
15
+ *
16
+ * Accuracy: within ~15% of tiktoken for code, without the dependency.
17
+ */
18
+ export declare function estimateTokens(text: string): number;
19
+ /** Get the recommended token budget for a model */
20
+ export declare function getTokenBudget(model?: string): number;
21
+ export interface PackableEntry {
22
+ text: string;
23
+ score: number;
24
+ source: string;
25
+ [key: string]: any;
26
+ }
27
+ export interface PackResult {
28
+ entries: PackableEntry[];
29
+ totalTokens: number;
30
+ budgetUsed: number;
31
+ dropped: number;
32
+ }
33
+ /**
34
+ * Pack entries into a token budget, prioritizing by score.
35
+ *
36
+ * Strategy:
37
+ * 1. Sort by score (highest first) — most relevant entries get priority
38
+ * 2. Graph entries get a 1.5x score boost (architecture is always important)
39
+ * 3. Greedily add entries until budget is exhausted
40
+ * 4. Report how much budget was used and how many entries were dropped
41
+ */
42
+ export declare function packEntries(entries: PackableEntry[], maxTokens: number): PackResult;
43
+ /**
44
+ * Pack a raw text output into a token budget.
45
+ * Truncates lines from the bottom if over budget.
46
+ */
47
+ export declare function packText(text: string, maxTokens: number): {
48
+ text: string;
49
+ tokens: number;
50
+ truncated: boolean;
51
+ };
52
+ //# sourceMappingURL=tokenBudget.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tokenBudget.d.ts","sourceRoot":"","sources":["../src/tokenBudget.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAMH;;;;;;;;;;GAUG;AACH,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CA4BnD;AAyDD,mDAAmD;AACnD,wBAAgB,cAAc,CAAC,KAAK,CAAC,EAAE,MAAM,GAAG,MAAM,CAOrD;AAMD,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,CAAC;CACpB;AAED,MAAM,WAAW,UAAU;IACzB,OAAO,EAAE,aAAa,EAAE,CAAC;IACzB,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,MAAM,CAAC;CACjB;AAED;;;;;;;;GAQG;AACH,wBAAgB,WAAW,CACzB,OAAO,EAAE,aAAa,EAAE,EACxB,SAAS,EAAE,MAAM,GAChB,UAAU,CA4BZ;AAED;;;GAGG;AACH,wBAAgB,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,OAAO,CAAA;CAAE,CAqB9G"}
@@ -0,0 +1,175 @@
1
+ "use strict";
2
+ /**
3
+ * Token Budget — shared token estimation and packing logic.
4
+ *
5
+ * Used by CLI, REST server, and MCP server to ensure consistent
6
+ * token-aware context packing everywhere.
7
+ */
8
+ Object.defineProperty(exports, "__esModule", { value: true });
9
+ exports.estimateTokens = estimateTokens;
10
+ exports.getTokenBudget = getTokenBudget;
11
+ exports.packEntries = packEntries;
12
+ exports.packText = packText;
13
+ // ============================================
14
+ // Token Estimation
15
+ // ============================================
16
+ /**
17
+ * Estimate token count for a string.
18
+ *
19
+ * Uses a refined heuristic based on OpenAI's tokenizer patterns:
20
+ * - Code tokens average ~3.5 chars (shorter than English prose ~4.3)
21
+ * - Identifiers like `getUserSession` count as 2-3 tokens
22
+ * - Punctuation (brackets, colons, commas) each count as 1 token
23
+ * - Whitespace is mostly free (merged with adjacent tokens)
24
+ *
25
+ * Accuracy: within ~15% of tiktoken for code, without the dependency.
26
+ */
27
+ function estimateTokens(text) {
28
+ if (!text)
29
+ return 0;
30
+ // Count code-specific token patterns
31
+ let tokens = 0;
32
+ // Split on whitespace to get "words"
33
+ const words = text.split(/\s+/).filter((w) => w.length > 0);
34
+ for (const word of words) {
35
+ if (word.length <= 1) {
36
+ tokens += 1; // Single chars (punctuation, operators)
37
+ }
38
+ else if (word.length <= 4) {
39
+ tokens += 1; // Short words/identifiers
40
+ }
41
+ else if (word.length <= 10) {
42
+ tokens += 2; // Medium identifiers
43
+ }
44
+ else if (word.length <= 20) {
45
+ tokens += 3; // Long identifiers like "getUserSessionDetails"
46
+ }
47
+ else {
48
+ tokens += Math.ceil(word.length / 6); // Very long strings
49
+ }
50
+ }
51
+ // Add overhead for structural tokens (newlines, indentation)
52
+ const newlines = (text.match(/\n/g) || []).length;
53
+ tokens += Math.ceil(newlines * 0.5);
54
+ return Math.max(tokens, 1);
55
+ }
56
+ // ============================================
57
+ // Model-Aware Token Budgets
58
+ // ============================================
59
+ /**
60
+ * Pre-configured token budgets for context injection.
61
+ * These are NOT the model's full context window — they're the
62
+ * recommended amount of codebase context to inject alongside
63
+ * the user's prompt and conversation history.
64
+ *
65
+ * Rule of thumb: use ~5-10% of the model's context window for
66
+ * codebase context, leaving room for conversation + response.
67
+ */
68
+ const MODEL_TOKEN_BUDGETS = {
69
+ // OpenAI
70
+ "gpt-4": 6000,
71
+ "gpt-4o": 8000,
72
+ "gpt-4o-mini": 4000,
73
+ "gpt-4-turbo": 8000,
74
+ "gpt-3.5-turbo": 3000,
75
+ "o1": 8000,
76
+ "o1-mini": 4000,
77
+ "o3": 10000,
78
+ "o3-mini": 6000,
79
+ // Anthropic
80
+ "claude-3-opus": 10000,
81
+ "claude-3-sonnet": 8000,
82
+ "claude-3-haiku": 4000,
83
+ "claude-3.5-sonnet": 10000,
84
+ "claude-4-opus": 12000,
85
+ "claude-4-sonnet": 10000,
86
+ // Google
87
+ "gemini-pro": 6000,
88
+ "gemini-1.5-pro": 10000,
89
+ "gemini-2": 10000,
90
+ // Open source
91
+ "llama-3-8b": 2000,
92
+ "llama-3-70b": 4000,
93
+ "llama-3.1-405b": 6000,
94
+ "mistral-7b": 2000,
95
+ "mixtral": 4000,
96
+ "codellama-34b": 3000,
97
+ "deepseek-coder": 4000,
98
+ "deepseek-v2": 6000,
99
+ "qwen-2.5-coder": 4000,
100
+ "phi-3": 2000,
101
+ "starcoder2": 3000,
102
+ // Default
103
+ "default": 4000,
104
+ };
105
+ /** Get the recommended token budget for a model */
106
+ function getTokenBudget(model) {
107
+ if (!model)
108
+ return MODEL_TOKEN_BUDGETS["default"];
109
+ const lower = model.toLowerCase();
110
+ for (const [key, budget] of Object.entries(MODEL_TOKEN_BUDGETS)) {
111
+ if (lower.includes(key))
112
+ return budget;
113
+ }
114
+ return MODEL_TOKEN_BUDGETS["default"];
115
+ }
116
+ /**
117
+ * Pack entries into a token budget, prioritizing by score.
118
+ *
119
+ * Strategy:
120
+ * 1. Sort by score (highest first) — most relevant entries get priority
121
+ * 2. Graph entries get a 1.5x score boost (architecture is always important)
122
+ * 3. Greedily add entries until budget is exhausted
123
+ * 4. Report how much budget was used and how many entries were dropped
124
+ */
125
+ function packEntries(entries, maxTokens) {
126
+ // Boost graph entries and sort by score
127
+ const scored = entries.map((e) => ({
128
+ ...e,
129
+ _sortScore: e.source === "graph" ? e.score * 1.5 : e.score,
130
+ }));
131
+ scored.sort((a, b) => b._sortScore - a._sortScore);
132
+ const packed = [];
133
+ let totalTokens = 0;
134
+ let dropped = 0;
135
+ for (const entry of scored) {
136
+ const entryTokens = estimateTokens(entry.text);
137
+ if (totalTokens + entryTokens > maxTokens) {
138
+ dropped++;
139
+ continue; // Skip but keep trying smaller entries
140
+ }
141
+ packed.push(entry);
142
+ totalTokens += entryTokens;
143
+ }
144
+ return {
145
+ entries: packed,
146
+ totalTokens,
147
+ budgetUsed: Math.round((totalTokens / maxTokens) * 100),
148
+ dropped,
149
+ };
150
+ }
151
+ /**
152
+ * Pack a raw text output into a token budget.
153
+ * Truncates lines from the bottom if over budget.
154
+ */
155
+ function packText(text, maxTokens) {
156
+ const tokens = estimateTokens(text);
157
+ if (tokens <= maxTokens) {
158
+ return { text, tokens, truncated: false };
159
+ }
160
+ // Truncate line by line from the bottom
161
+ const lines = text.split("\n");
162
+ let packed = "";
163
+ let count = 0;
164
+ for (const line of lines) {
165
+ const lineTokens = estimateTokens(line);
166
+ if (count + lineTokens > maxTokens - 5) { // Reserve 5 tokens for truncation notice
167
+ break;
168
+ }
169
+ packed += line + "\n";
170
+ count += lineTokens;
171
+ }
172
+ packed += `\n... (truncated, ${tokens - count} tokens omitted)`;
173
+ return { text: packed, tokens: count + 5, truncated: true };
174
+ }
175
+ //# sourceMappingURL=tokenBudget.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tokenBudget.js","sourceRoot":"","sources":["../src/tokenBudget.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,62 @@
1
+ /** Configuration for file scanning */
2
+ export interface ScanConfig {
3
+ include: string[];
4
+ ignore: string[];
5
+ }
6
+ /** A code chunk extracted from AST parsing */
7
+ export interface Chunk {
8
+ /** Unique identifier: file#name */
9
+ id: string;
10
+ /** Source file path */
11
+ file: string;
12
+ /** Type of code element */
13
+ type: "function" | "class" | "method" | "arrow-function" | "export" | "interface" | "type-alias" | "constant";
14
+ /** Name of the code element */
15
+ name: string;
16
+ /** Raw source code */
17
+ code: string;
18
+ /** Actual code signature (declaration line) — Aider-style */
19
+ signature?: string;
20
+ /** MD5 hash of the code (for cache invalidation) */
21
+ hash?: string;
22
+ /** Text summary (local or AI-generated) */
23
+ summary?: string;
24
+ /** Embedding vector */
25
+ embedding?: number[];
26
+ }
27
+ /** Cached chunk data stored in .graphra/ (legacy, kept for migration) */
28
+ export interface ChunkCache {
29
+ [chunkId: string]: {
30
+ hash: string;
31
+ summary: string;
32
+ embedding: number[];
33
+ };
34
+ }
35
+ /** Dependency graph: file → list of imported files */
36
+ export interface DependencyGraph {
37
+ [file: string]: string[];
38
+ }
39
+ /** Context output assembled for prompt building */
40
+ export interface ContextResult {
41
+ /** Actual code signatures (Aider-style) — the primary context */
42
+ entries: {
43
+ chunkId: string;
44
+ file: string;
45
+ name: string;
46
+ signature: string;
47
+ summary: string;
48
+ importance: number;
49
+ }[];
50
+ }
51
+ /** Final prompt structure */
52
+ export interface PromptData {
53
+ arch: string;
54
+ context: string;
55
+ task: string;
56
+ }
57
+ /** Search result from hybrid search */
58
+ export interface SearchResult {
59
+ chunk: Chunk;
60
+ score: number;
61
+ }
62
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAIA,sCAAsC;AACtC,MAAM,WAAW,UAAU;IACzB,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,MAAM,EAAE,MAAM,EAAE,CAAC;CAClB;AAED,8CAA8C;AAC9C,MAAM,WAAW,KAAK;IACpB,mCAAmC;IACnC,EAAE,EAAE,MAAM,CAAC;IACX,uBAAuB;IACvB,IAAI,EAAE,MAAM,CAAC;IACb,2BAA2B;IAC3B,IAAI,EAAE,UAAU,GAAG,OAAO,GAAG,QAAQ,GAAG,gBAAgB,GAAG,QAAQ,GAAG,WAAW,GAAG,YAAY,GAAG,UAAU,CAAC;IAC9G,+BAA+B;IAC/B,IAAI,EAAE,MAAM,CAAC;IACb,sBAAsB;IACtB,IAAI,EAAE,MAAM,CAAC;IACb,6DAA6D;IAC7D,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,oDAAoD;IACpD,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,2CAA2C;IAC3C,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,uBAAuB;IACvB,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC;CACtB;AAED,yEAAyE;AACzE,MAAM,WAAW,UAAU;IACzB,CAAC,OAAO,EAAE,MAAM,GAAG;QACjB,IAAI,EAAE,MAAM,CAAC;QACb,OAAO,EAAE,MAAM,CAAC;QAChB,SAAS,EAAE,MAAM,EAAE,CAAC;KACrB,CAAC;CACH;AAED,sDAAsD;AACtD,MAAM,WAAW,eAAe;IAC9B,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC;CAC1B;AAED,mDAAmD;AACnD,MAAM,WAAW,aAAa;IAC5B,iEAAiE;IACjE,OAAO,EAAE;QACP,OAAO,EAAE,MAAM,CAAC;QAChB,IAAI,EAAE,MAAM,CAAC;QACb,IAAI,EAAE,MAAM,CAAC;QACb,SAAS,EAAE,MAAM,CAAC;QAClB,OAAO,EAAE,MAAM,CAAC;QAChB,UAAU,EAAE,MAAM,CAAC;KACpB,EAAE,CAAC;CACL;AAED,6BAA6B;AAC7B,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;CACd;AAED,uCAAuC;AACvC,MAAM,WAAW,YAAY;IAC3B,KAAK,EAAE,KAAK,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;CACf"}
package/dist/types.js ADDED
@@ -0,0 +1,6 @@
1
+ "use strict";
2
+ // ============================================
3
+ // Graphra — Core Type Definitions (v2)
4
+ // ============================================
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":";AAAA,+CAA+C;AAC/C,uCAAuC;AACvC,+CAA+C"}
@@ -0,0 +1,6 @@
1
+ /**
2
+ * Generate an MD5 hash of the given content.
3
+ * Used for cache invalidation of chunk summaries.
4
+ */
5
+ export declare function md5(content: string): string;
6
+ //# sourceMappingURL=hash.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hash.d.ts","sourceRoot":"","sources":["../../src/utils/hash.ts"],"names":[],"mappings":"AAEA;;;GAGG;AACH,wBAAgB,GAAG,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAE3C"}