@milo4jo/contextkit 0.1.2 → 0.3.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 (53) hide show
  1. package/README.md +236 -71
  2. package/dist/commands/index-cmd.d.ts.map +1 -1
  3. package/dist/commands/index-cmd.js +10 -2
  4. package/dist/commands/index-cmd.js.map +1 -1
  5. package/dist/commands/mcp.d.ts +8 -0
  6. package/dist/commands/mcp.d.ts.map +1 -0
  7. package/dist/commands/mcp.js +23 -0
  8. package/dist/commands/mcp.js.map +1 -0
  9. package/dist/commands/watch.d.ts +8 -0
  10. package/dist/commands/watch.d.ts.map +1 -0
  11. package/dist/commands/watch.js +171 -0
  12. package/dist/commands/watch.js.map +1 -0
  13. package/dist/db/index.d.ts.map +1 -1
  14. package/dist/db/index.js +11 -2
  15. package/dist/db/index.js.map +1 -1
  16. package/dist/index.js +7 -1
  17. package/dist/index.js.map +1 -1
  18. package/dist/indexer/discovery.d.ts +7 -0
  19. package/dist/indexer/discovery.d.ts.map +1 -1
  20. package/dist/indexer/discovery.js +9 -0
  21. package/dist/indexer/discovery.js.map +1 -1
  22. package/dist/indexer/index.d.ts +17 -3
  23. package/dist/indexer/index.d.ts.map +1 -1
  24. package/dist/indexer/index.js +135 -24
  25. package/dist/indexer/index.js.map +1 -1
  26. package/dist/mcp/index.d.ts +7 -0
  27. package/dist/mcp/index.d.ts.map +1 -0
  28. package/dist/mcp/index.js +7 -0
  29. package/dist/mcp/index.js.map +1 -0
  30. package/dist/mcp/server.d.ts +20 -0
  31. package/dist/mcp/server.d.ts.map +1 -0
  32. package/dist/mcp/server.js +252 -0
  33. package/dist/mcp/server.js.map +1 -0
  34. package/dist/mcp-server.d.ts +18 -0
  35. package/dist/mcp-server.d.ts.map +1 -0
  36. package/dist/mcp-server.js +22 -0
  37. package/dist/mcp-server.js.map +1 -0
  38. package/dist/selector/budget.d.ts +2 -0
  39. package/dist/selector/budget.d.ts.map +1 -1
  40. package/dist/selector/budget.js +19 -6
  41. package/dist/selector/budget.js.map +1 -1
  42. package/dist/selector/formatter.d.ts.map +1 -1
  43. package/dist/selector/formatter.js +7 -5
  44. package/dist/selector/formatter.js.map +1 -1
  45. package/dist/selector/scoring.d.ts +15 -5
  46. package/dist/selector/scoring.d.ts.map +1 -1
  47. package/dist/selector/scoring.js +193 -19
  48. package/dist/selector/scoring.js.map +1 -1
  49. package/dist/utils/streams.d.ts +4 -0
  50. package/dist/utils/streams.d.ts.map +1 -1
  51. package/dist/utils/streams.js +7 -0
  52. package/dist/utils/streams.js.map +1 -1
  53. package/package.json +18 -6
@@ -0,0 +1,171 @@
1
+ /**
2
+ * Watch Command
3
+ *
4
+ * Watches source directories and auto-reindexes on changes.
5
+ */
6
+ import { Command } from 'commander';
7
+ import chokidar from 'chokidar';
8
+ import { resolve, relative } from 'path';
9
+ import { loadConfig, ensureInitialized } from '../config/index.js';
10
+ import { openDatabase } from '../db/index.js';
11
+ import { indexSources } from '../indexer/index.js';
12
+ import { writeMessage, writeSuccess, writeWarning, writeDim } from '../utils/streams.js';
13
+ import { formatHighlight, formatDim } from '../utils/format.js';
14
+ /** Default debounce time in milliseconds */
15
+ const DEFAULT_DEBOUNCE_MS = 1000;
16
+ export const watchCommand = new Command('watch')
17
+ .description('Watch sources and auto-reindex on changes')
18
+ .option('-d, --debounce <ms>', 'Debounce time in milliseconds', String(DEFAULT_DEBOUNCE_MS))
19
+ .action(async (options) => {
20
+ ensureInitialized();
21
+ const config = loadConfig();
22
+ const debounceMs = parseInt(options.debounce) || DEFAULT_DEBOUNCE_MS;
23
+ if (config.sources.length === 0) {
24
+ writeWarning('No sources configured');
25
+ writeMessage('Add sources first with: contextkit source add <path>');
26
+ process.exit(1);
27
+ }
28
+ const cwd = process.cwd();
29
+ // Build watch patterns from sources
30
+ const watchPaths = [];
31
+ for (const source of config.sources) {
32
+ const sourcePath = resolve(cwd, source.path);
33
+ watchPaths.push(sourcePath);
34
+ }
35
+ writeMessage('');
36
+ writeMessage(`${formatHighlight('👁️ Watching')} ${config.sources.length} source(s) for changes...`);
37
+ writeMessage(formatDim(` Debounce: ${debounceMs}ms`));
38
+ writeMessage('');
39
+ for (const source of config.sources) {
40
+ writeMessage(` • ${source.id}: ${source.path}`);
41
+ }
42
+ writeMessage('');
43
+ writeMessage(formatDim('Press Ctrl+C to stop watching.'));
44
+ writeMessage('');
45
+ // Track pending changes
46
+ const pendingChanges = new Set();
47
+ let debounceTimer = null;
48
+ let isIndexing = false;
49
+ /**
50
+ * Run indexing for pending changes
51
+ */
52
+ async function runIndex() {
53
+ if (isIndexing)
54
+ return;
55
+ if (pendingChanges.size === 0)
56
+ return;
57
+ isIndexing = true;
58
+ const changedFiles = Array.from(pendingChanges);
59
+ pendingChanges.clear();
60
+ const timestamp = new Date().toLocaleTimeString();
61
+ writeMessage(`${formatDim(`[${timestamp}]`)} Detected ${changedFiles.length} change(s), reindexing...`);
62
+ const db = openDatabase();
63
+ try {
64
+ const stats = await indexSources(config.sources, cwd, db, {
65
+ chunkSize: config.settings.chunk_size,
66
+ chunkOverlap: config.settings.chunk_overlap,
67
+ });
68
+ if (stats.filesChanged > 0) {
69
+ writeSuccess(`Indexed ${stats.filesChanged} changed file(s) → ${stats.chunks} chunks`);
70
+ }
71
+ else {
72
+ writeMessage(formatDim('No changes detected.'));
73
+ }
74
+ }
75
+ catch (error) {
76
+ writeWarning(`Index error: ${error instanceof Error ? error.message : String(error)}`);
77
+ }
78
+ finally {
79
+ db.close();
80
+ isIndexing = false;
81
+ // If more changes accumulated while indexing, run again
82
+ if (pendingChanges.size > 0) {
83
+ scheduleIndex();
84
+ }
85
+ }
86
+ }
87
+ /**
88
+ * Schedule an index run with debouncing
89
+ */
90
+ function scheduleIndex() {
91
+ if (debounceTimer) {
92
+ clearTimeout(debounceTimer);
93
+ }
94
+ debounceTimer = setTimeout(runIndex, debounceMs);
95
+ }
96
+ /**
97
+ * Handle file change event
98
+ */
99
+ function handleChange(filePath, eventType) {
100
+ // Get relative path for display
101
+ const relPath = relative(cwd, filePath);
102
+ // Check if file matches any source patterns
103
+ let matchesSource = false;
104
+ for (const source of config.sources) {
105
+ const sourcePath = resolve(cwd, source.path);
106
+ if (filePath.startsWith(sourcePath)) {
107
+ // Check include patterns
108
+ for (const pattern of source.patterns.include) {
109
+ // Simple check - could be more sophisticated
110
+ const ext = pattern.replace('**/*', '').replace('*', '');
111
+ if (filePath.endsWith(ext) || pattern === '**/*') {
112
+ matchesSource = true;
113
+ break;
114
+ }
115
+ }
116
+ // Check exclude patterns
117
+ if (matchesSource) {
118
+ for (const pattern of source.patterns.exclude) {
119
+ if (pattern.includes('node_modules') && filePath.includes('node_modules')) {
120
+ matchesSource = false;
121
+ break;
122
+ }
123
+ if (pattern.includes('.test.') && filePath.includes('.test.')) {
124
+ matchesSource = false;
125
+ break;
126
+ }
127
+ }
128
+ }
129
+ }
130
+ if (matchesSource)
131
+ break;
132
+ }
133
+ if (matchesSource) {
134
+ pendingChanges.add(filePath);
135
+ writeDim(` ${eventType}: ${relPath}`);
136
+ scheduleIndex();
137
+ }
138
+ }
139
+ // Setup file watcher
140
+ const watcher = chokidar.watch(watchPaths, {
141
+ ignored: [
142
+ '**/node_modules/**',
143
+ '**/.git/**',
144
+ '**/.contextkit/**',
145
+ '**/dist/**',
146
+ '**/build/**',
147
+ '**/*.test.*',
148
+ '**/*.spec.*',
149
+ ],
150
+ persistent: true,
151
+ ignoreInitial: true,
152
+ awaitWriteFinish: {
153
+ stabilityThreshold: 100,
154
+ pollInterval: 100,
155
+ },
156
+ });
157
+ watcher
158
+ .on('add', (path) => handleChange(path, 'added'))
159
+ .on('change', (path) => handleChange(path, 'changed'))
160
+ .on('unlink', (path) => handleChange(path, 'removed'));
161
+ // Handle graceful shutdown
162
+ process.on('SIGINT', () => {
163
+ writeMessage('');
164
+ writeMessage('Stopping watch...');
165
+ watcher.close();
166
+ process.exit(0);
167
+ });
168
+ // Keep process running
169
+ await new Promise(() => { });
170
+ });
171
+ //# sourceMappingURL=watch.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"watch.js","sourceRoot":"","sources":["../../src/commands/watch.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/db/index.ts"],"names":[],"mappings":"AAAA,OAAO,QAAQ,MAAM,gBAAgB,CAAC;AAsCtC;;GAEG;AACH,wBAAgB,YAAY,CAAC,MAAM,EAAE,MAAM,GAAG,QAAQ,CAAC,QAAQ,CAU9D;AAED;;GAEG;AACH,wBAAgB,YAAY,IAAI,QAAQ,CAAC,QAAQ,CAKhD;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAC,EAAE,EAAE,QAAQ,CAAC,QAAQ,GAAG,IAAI,CAEzD"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/db/index.ts"],"names":[],"mappings":"AAAA,OAAO,QAAQ,MAAM,gBAAgB,CAAC;AA+CtC;;GAEG;AACH,wBAAgB,YAAY,CAAC,MAAM,EAAE,MAAM,GAAG,QAAQ,CAAC,QAAQ,CAU9D;AAED;;GAEG;AACH,wBAAgB,YAAY,IAAI,QAAQ,CAAC,QAAQ,CAKhD;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAC,EAAE,EAAE,QAAQ,CAAC,QAAQ,GAAG,IAAI,CAEzD"}
package/dist/db/index.js CHANGED
@@ -14,8 +14,15 @@ CREATE TABLE IF NOT EXISTS sources (
14
14
  indexed_at TIMESTAMP
15
15
  );
16
16
 
17
- -- Ensure chunk_count column exists (migration)
18
- -- SQLite doesn't support IF NOT EXISTS for columns, so we handle this in code
17
+ -- Files table (for incremental indexing)
18
+ CREATE TABLE IF NOT EXISTS files (
19
+ id TEXT PRIMARY KEY,
20
+ source_id TEXT NOT NULL REFERENCES sources(id) ON DELETE CASCADE,
21
+ file_path TEXT NOT NULL,
22
+ content_hash TEXT NOT NULL,
23
+ indexed_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
24
+ UNIQUE(source_id, file_path)
25
+ );
19
26
 
20
27
  -- Chunks table
21
28
  CREATE TABLE IF NOT EXISTS chunks (
@@ -33,6 +40,8 @@ CREATE TABLE IF NOT EXISTS chunks (
33
40
  -- Indexes for performance
34
41
  CREATE INDEX IF NOT EXISTS idx_chunks_source ON chunks(source_id);
35
42
  CREATE INDEX IF NOT EXISTS idx_chunks_file ON chunks(file_path);
43
+ CREATE INDEX IF NOT EXISTS idx_files_source ON files(source_id);
44
+ CREATE INDEX IF NOT EXISTS idx_files_path ON files(source_id, file_path);
36
45
  `;
37
46
  /**
38
47
  * Initialize the database with schema
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/db/index.ts"],"names":[],"mappings":"AAAA,OAAO,QAAQ,MAAM,gBAAgB,CAAC;AACtC,OAAO,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAE/C;;GAEG;AACH,MAAM,MAAM,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA8Bd,CAAC;AAEF;;GAEG;AACH,MAAM,UAAU,YAAY,CAAC,MAAc;IACzC,MAAM,EAAE,GAAG,IAAI,QAAQ,CAAC,MAAM,CAAC,CAAC;IAEhC,sBAAsB;IACtB,EAAE,CAAC,MAAM,CAAC,mBAAmB,CAAC,CAAC;IAE/B,gBAAgB;IAChB,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IAEhB,OAAO,EAAE,CAAC;AACZ,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,YAAY;IAC1B,MAAM,MAAM,GAAG,SAAS,EAAE,CAAC;IAC3B,MAAM,EAAE,GAAG,IAAI,QAAQ,CAAC,MAAM,CAAC,CAAC;IAChC,EAAE,CAAC,MAAM,CAAC,mBAAmB,CAAC,CAAC;IAC/B,OAAO,EAAE,CAAC;AACZ,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,aAAa,CAAC,EAAqB;IACjD,EAAE,CAAC,KAAK,EAAE,CAAC;AACb,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/db/index.ts"],"names":[],"mappings":"AAAA,OAAO,QAAQ,MAAM,gBAAgB,CAAC;AACtC,OAAO,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAE/C;;GAEG;AACH,MAAM,MAAM,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAuCd,CAAC;AAEF;;GAEG;AACH,MAAM,UAAU,YAAY,CAAC,MAAc;IACzC,MAAM,EAAE,GAAG,IAAI,QAAQ,CAAC,MAAM,CAAC,CAAC;IAEhC,sBAAsB;IACtB,EAAE,CAAC,MAAM,CAAC,mBAAmB,CAAC,CAAC;IAE/B,gBAAgB;IAChB,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IAEhB,OAAO,EAAE,CAAC;AACZ,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,YAAY;IAC1B,MAAM,MAAM,GAAG,SAAS,EAAE,CAAC;IAC3B,MAAM,EAAE,GAAG,IAAI,QAAQ,CAAC,MAAM,CAAC,CAAC;IAChC,EAAE,CAAC,MAAM,CAAC,mBAAmB,CAAC,CAAC;IAC/B,OAAO,EAAE,CAAC;AACZ,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,aAAa,CAAC,EAAqB;IACjD,EAAE,CAAC,KAAK,EAAE,CAAC;AACb,CAAC"}
package/dist/index.js CHANGED
@@ -7,6 +7,8 @@ import { initCommand } from './commands/init.js';
7
7
  import { sourceCommand } from './commands/source/index.js';
8
8
  import { indexCommand } from './commands/index-cmd.js';
9
9
  import { selectCommand } from './commands/select.js';
10
+ import { mcpCommand } from './commands/mcp.js';
11
+ import { watchCommand } from './commands/watch.js';
10
12
  import { ContextKitError, InvalidUsageError } from './errors/index.js';
11
13
  import { writeError, writeMessage } from './utils/streams.js';
12
14
  // Get version from package.json
@@ -60,6 +62,8 @@ program.addCommand(initCommand);
60
62
  program.addCommand(sourceCommand);
61
63
  program.addCommand(indexCommand);
62
64
  program.addCommand(selectCommand);
65
+ program.addCommand(mcpCommand);
66
+ program.addCommand(watchCommand);
63
67
  // Default action when no command given
64
68
  program.action(() => {
65
69
  console.log(`
@@ -74,8 +78,10 @@ Quick Start:
74
78
  Commands:
75
79
  init Initialize ContextKit in current directory
76
80
  source Manage source directories
77
- index Index all sources (re-run after code changes)
81
+ index Index all sources (incremental by default)
78
82
  select Select context for a query
83
+ watch Watch sources and auto-reindex on changes
84
+ mcp Start MCP server for AI assistants
79
85
 
80
86
  Global Options:
81
87
  --json Output as JSON
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
@@ -2,6 +2,7 @@
2
2
  * File Discovery Module
3
3
  *
4
4
  * Discovers files in sources based on include/exclude patterns.
5
+ * Supports incremental indexing via content hashing.
5
6
  */
6
7
  import type { Source } from '../config/types.js';
7
8
  /** File info returned by discovery */
@@ -16,7 +17,13 @@ export interface DiscoveredFile {
16
17
  content: string;
17
18
  /** File size in bytes */
18
19
  size: number;
20
+ /** Content hash (SHA-256) for change detection */
21
+ contentHash: string;
19
22
  }
23
+ /**
24
+ * Compute SHA-256 hash of content
25
+ */
26
+ export declare function computeContentHash(content: string): string;
20
27
  /** Discovery result for a source */
21
28
  export interface DiscoveryResult {
22
29
  sourceId: string;
@@ -1 +1 @@
1
- {"version":3,"file":"discovery.d.ts","sourceRoot":"","sources":["../../src/indexer/discovery.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAKH,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAKjD,sCAAsC;AACtC,MAAM,WAAW,cAAc;IAC7B,4BAA4B;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,8BAA8B;IAC9B,YAAY,EAAE,MAAM,CAAC;IACrB,kCAAkC;IAClC,QAAQ,EAAE,MAAM,CAAC;IACjB,mBAAmB;IACnB,OAAO,EAAE,MAAM,CAAC;IAChB,yBAAyB;IACzB,IAAI,EAAE,MAAM,CAAC;CACd;AAED,oCAAoC;AACpC,MAAM,WAAW,eAAe;IAC9B,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,cAAc,EAAE,CAAC;IACxB,OAAO,EAAE,MAAM,CAAC;CACjB;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,eAAe,CAqD9E;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE,OAAO,EAAE,MAAM,GAAG,eAAe,EAAE,CAEtF"}
1
+ {"version":3,"file":"discovery.d.ts","sourceRoot":"","sources":["../../src/indexer/discovery.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAMH,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAKjD,sCAAsC;AACtC,MAAM,WAAW,cAAc;IAC7B,4BAA4B;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,8BAA8B;IAC9B,YAAY,EAAE,MAAM,CAAC;IACrB,kCAAkC;IAClC,QAAQ,EAAE,MAAM,CAAC;IACjB,mBAAmB;IACnB,OAAO,EAAE,MAAM,CAAC;IAChB,yBAAyB;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,kDAAkD;IAClD,WAAW,EAAE,MAAM,CAAC;CACrB;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAE1D;AAED,oCAAoC;AACpC,MAAM,WAAW,eAAe;IAC9B,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,cAAc,EAAE,CAAC;IACxB,OAAO,EAAE,MAAM,CAAC;CACjB;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,eAAe,CAsD9E;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE,OAAO,EAAE,MAAM,GAAG,eAAe,EAAE,CAEtF"}
@@ -2,12 +2,20 @@
2
2
  * File Discovery Module
3
3
  *
4
4
  * Discovers files in sources based on include/exclude patterns.
5
+ * Supports incremental indexing via content hashing.
5
6
  */
6
7
  import { resolve } from 'path';
7
8
  import { readFileSync, statSync } from 'fs';
9
+ import { createHash } from 'crypto';
8
10
  import fg from 'fast-glob';
9
11
  /** Maximum file size to process (100KB) */
10
12
  const MAX_FILE_SIZE = 100 * 1024;
13
+ /**
14
+ * Compute SHA-256 hash of content
15
+ */
16
+ export function computeContentHash(content) {
17
+ return createHash('sha256').update(content).digest('hex');
18
+ }
11
19
  /**
12
20
  * Discover all files in a source
13
21
  */
@@ -44,6 +52,7 @@ export function discoverFiles(source, baseDir) {
44
52
  sourceId: source.id,
45
53
  content,
46
54
  size: stats.size,
55
+ contentHash: computeContentHash(content),
47
56
  });
48
57
  }
49
58
  catch {
@@ -1 +1 @@
1
- {"version":3,"file":"discovery.js","sourceRoot":"","sources":["../../src/indexer/discovery.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,MAAM,CAAC;AAC/B,OAAO,EAAE,YAAY,EAAE,QAAQ,EAAE,MAAM,IAAI,CAAC;AAC5C,OAAO,EAAE,MAAM,WAAW,CAAC;AAG3B,2CAA2C;AAC3C,MAAM,aAAa,GAAG,GAAG,GAAG,IAAI,CAAC;AAuBjC;;GAEG;AACH,MAAM,UAAU,aAAa,CAAC,MAAc,EAAE,OAAe;IAC3D,MAAM,UAAU,GAAG,OAAO,CAAC,OAAO,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC;IAEjD,sBAAsB;IACtB,MAAM,OAAO,GAAG,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,OAAO,EAAE;QAC/C,GAAG,EAAE,UAAU;QACf,MAAM,EAAE,MAAM,CAAC,QAAQ,CAAC,OAAO;QAC/B,SAAS,EAAE,IAAI;QACf,QAAQ,EAAE,KAAK;KAChB,CAAC,CAAC;IAEH,MAAM,KAAK,GAAqB,EAAE,CAAC;IACnC,IAAI,OAAO,GAAG,CAAC,CAAC;IAEhB,KAAK,MAAM,YAAY,IAAI,OAAO,EAAE,CAAC;QACnC,MAAM,YAAY,GAAG,OAAO,CAAC,UAAU,EAAE,YAAY,CAAC,CAAC;QAEvD,IAAI,CAAC;YACH,MAAM,KAAK,GAAG,QAAQ,CAAC,YAAY,CAAC,CAAC;YAErC,gCAAgC;YAChC,IAAI,KAAK,CAAC,IAAI,GAAG,aAAa,EAAE,CAAC;gBAC/B,OAAO,EAAE,CAAC;gBACV,SAAS;YACX,CAAC;YAED,oBAAoB;YACpB,MAAM,OAAO,GAAG,YAAY,CAAC,YAAY,EAAE,OAAO,CAAC,CAAC;YAEpD,6DAA6D;YAC7D,IAAI,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;gBAC3B,OAAO,EAAE,CAAC;gBACV,SAAS;YACX,CAAC;YAED,KAAK,CAAC,IAAI,CAAC;gBACT,IAAI,EAAE,YAAY;gBAClB,YAAY;gBACZ,QAAQ,EAAE,MAAM,CAAC,EAAE;gBACnB,OAAO;gBACP,IAAI,EAAE,KAAK,CAAC,IAAI;aACjB,CAAC,CAAC;QACL,CAAC;QAAC,MAAM,CAAC;YACP,2BAA2B;YAC3B,OAAO,EAAE,CAAC;QACZ,CAAC;IACH,CAAC;IAED,OAAO;QACL,QAAQ,EAAE,MAAM,CAAC,EAAE;QACnB,KAAK;QACL,OAAO;KACR,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,gBAAgB,CAAC,OAAiB,EAAE,OAAe;IACjE,OAAO,OAAO,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,aAAa,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;AACjE,CAAC"}
1
+ {"version":3,"file":"discovery.js","sourceRoot":"","sources":["../../src/indexer/discovery.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,MAAM,CAAC;AAC/B,OAAO,EAAE,YAAY,EAAE,QAAQ,EAAE,MAAM,IAAI,CAAC;AAC5C,OAAO,EAAE,UAAU,EAAE,MAAM,QAAQ,CAAC;AACpC,OAAO,EAAE,MAAM,WAAW,CAAC;AAG3B,2CAA2C;AAC3C,MAAM,aAAa,GAAG,GAAG,GAAG,IAAI,CAAC;AAkBjC;;GAEG;AACH,MAAM,UAAU,kBAAkB,CAAC,OAAe;IAChD,OAAO,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;AAC5D,CAAC;AASD;;GAEG;AACH,MAAM,UAAU,aAAa,CAAC,MAAc,EAAE,OAAe;IAC3D,MAAM,UAAU,GAAG,OAAO,CAAC,OAAO,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC;IAEjD,sBAAsB;IACtB,MAAM,OAAO,GAAG,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,OAAO,EAAE;QAC/C,GAAG,EAAE,UAAU;QACf,MAAM,EAAE,MAAM,CAAC,QAAQ,CAAC,OAAO;QAC/B,SAAS,EAAE,IAAI;QACf,QAAQ,EAAE,KAAK;KAChB,CAAC,CAAC;IAEH,MAAM,KAAK,GAAqB,EAAE,CAAC;IACnC,IAAI,OAAO,GAAG,CAAC,CAAC;IAEhB,KAAK,MAAM,YAAY,IAAI,OAAO,EAAE,CAAC;QACnC,MAAM,YAAY,GAAG,OAAO,CAAC,UAAU,EAAE,YAAY,CAAC,CAAC;QAEvD,IAAI,CAAC;YACH,MAAM,KAAK,GAAG,QAAQ,CAAC,YAAY,CAAC,CAAC;YAErC,gCAAgC;YAChC,IAAI,KAAK,CAAC,IAAI,GAAG,aAAa,EAAE,CAAC;gBAC/B,OAAO,EAAE,CAAC;gBACV,SAAS;YACX,CAAC;YAED,oBAAoB;YACpB,MAAM,OAAO,GAAG,YAAY,CAAC,YAAY,EAAE,OAAO,CAAC,CAAC;YAEpD,6DAA6D;YAC7D,IAAI,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;gBAC3B,OAAO,EAAE,CAAC;gBACV,SAAS;YACX,CAAC;YAED,KAAK,CAAC,IAAI,CAAC;gBACT,IAAI,EAAE,YAAY;gBAClB,YAAY;gBACZ,QAAQ,EAAE,MAAM,CAAC,EAAE;gBACnB,OAAO;gBACP,IAAI,EAAE,KAAK,CAAC,IAAI;gBAChB,WAAW,EAAE,kBAAkB,CAAC,OAAO,CAAC;aACzC,CAAC,CAAC;QACL,CAAC;QAAC,MAAM,CAAC;YACP,2BAA2B;YAC3B,OAAO,EAAE,CAAC;QACZ,CAAC;IACH,CAAC;IAED,OAAO;QACL,QAAQ,EAAE,MAAM,CAAC,EAAE;QACnB,KAAK;QACL,OAAO;KACR,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,gBAAgB,CAAC,OAAiB,EAAE,OAAe;IACjE,OAAO,OAAO,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,aAAa,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;AACjE,CAAC"}
@@ -2,6 +2,7 @@
2
2
  * Main Indexer Module
3
3
  *
4
4
  * Orchestrates file discovery, chunking, embedding, and storage.
5
+ * Supports incremental indexing via content hashing.
5
6
  */
6
7
  import Database from 'better-sqlite3';
7
8
  import { type ChunkOptions } from './chunker.js';
@@ -13,6 +14,12 @@ export interface IndexStats {
13
14
  chunks: number;
14
15
  skipped: number;
15
16
  timeMs: number;
17
+ /** Files that were actually re-indexed (changed/new) */
18
+ filesChanged: number;
19
+ /** Files that were unchanged (skipped) */
20
+ filesUnchanged: number;
21
+ /** Files that were removed from index */
22
+ filesRemoved: number;
16
23
  }
17
24
  /** Progress update */
18
25
  export interface IndexProgress {
@@ -23,15 +30,22 @@ export interface IndexProgress {
23
30
  }
24
31
  /** Progress callback */
25
32
  export type IndexProgressCallback = (progress: IndexProgress) => void;
33
+ /** Options for indexing */
34
+ export interface IndexOptions extends ChunkOptions {
35
+ /** Force full re-index (ignore hashes) */
36
+ force?: boolean;
37
+ }
26
38
  /**
27
- * Index all sources
39
+ * Index all sources with incremental support
28
40
  */
29
- export declare function indexSources(sources: Source[], baseDir: string, db: Database.Database, chunkOptions: ChunkOptions, onProgress?: IndexProgressCallback): Promise<IndexStats>;
41
+ export declare function indexSources(sources: Source[], baseDir: string, db: Database.Database, chunkOptions: ChunkOptions, onProgress?: IndexProgressCallback, options?: {
42
+ force?: boolean;
43
+ }): Promise<IndexStats>;
30
44
  /**
31
45
  * Read embedding from blob
32
46
  */
33
47
  export declare function readEmbedding(blob: Buffer): number[];
34
- export { discoverFiles, type DiscoveredFile, type DiscoveryResult } from './discovery.js';
48
+ export { discoverFiles, computeContentHash, type DiscoveredFile, type DiscoveryResult } from './discovery.js';
35
49
  export { chunkFiles, chunkFile, countTokens, type Chunk, type ChunkOptions } from './chunker.js';
36
50
  export { embed, embedBatch, embedChunks, cosineSimilarity, EMBEDDING_DIM, type EmbeddedChunk, } from './embeddings.js';
37
51
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/indexer/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,QAAQ,MAAM,gBAAgB,CAAC;AAEtC,OAAO,EAAc,KAAK,YAAY,EAAE,MAAM,cAAc,CAAC;AAE7D,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAEjD,0BAA0B;AAC1B,MAAM,WAAW,UAAU;IACzB,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,sBAAsB;AACtB,MAAM,WAAW,aAAa;IAC5B,KAAK,EAAE,WAAW,GAAG,UAAU,GAAG,WAAW,GAAG,SAAS,CAAC;IAC1D,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;CACf;AAED,wBAAwB;AACxB,MAAM,MAAM,qBAAqB,GAAG,CAAC,QAAQ,EAAE,aAAa,KAAK,IAAI,CAAC;AAEtE;;GAEG;AACH,wBAAsB,YAAY,CAChC,OAAO,EAAE,MAAM,EAAE,EACjB,OAAO,EAAE,MAAM,EACf,EAAE,EAAE,QAAQ,CAAC,QAAQ,EACrB,YAAY,EAAE,YAAY,EAC1B,UAAU,CAAC,EAAE,qBAAqB,GACjC,OAAO,CAAC,UAAU,CAAC,CA+ErB;AAwDD;;GAEG;AACH,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,EAAE,CAGpD;AAGD,OAAO,EAAE,aAAa,EAAE,KAAK,cAAc,EAAE,KAAK,eAAe,EAAE,MAAM,gBAAgB,CAAC;AAC1F,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,WAAW,EAAE,KAAK,KAAK,EAAE,KAAK,YAAY,EAAE,MAAM,cAAc,CAAC;AACjG,OAAO,EACL,KAAK,EACL,UAAU,EACV,WAAW,EACX,gBAAgB,EAChB,aAAa,EACb,KAAK,aAAa,GACnB,MAAM,iBAAiB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/indexer/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,QAAQ,MAAM,gBAAgB,CAAC;AAGtC,OAAO,EAAc,KAAK,YAAY,EAAE,MAAM,cAAc,CAAC;AAE7D,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAEjD,0BAA0B;AAC1B,MAAM,WAAW,UAAU;IACzB,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,wDAAwD;IACxD,YAAY,EAAE,MAAM,CAAC;IACrB,0CAA0C;IAC1C,cAAc,EAAE,MAAM,CAAC;IACvB,yCAAyC;IACzC,YAAY,EAAE,MAAM,CAAC;CACtB;AAkED,sBAAsB;AACtB,MAAM,WAAW,aAAa;IAC5B,KAAK,EAAE,WAAW,GAAG,UAAU,GAAG,WAAW,GAAG,SAAS,CAAC;IAC1D,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;CACf;AAED,wBAAwB;AACxB,MAAM,MAAM,qBAAqB,GAAG,CAAC,QAAQ,EAAE,aAAa,KAAK,IAAI,CAAC;AAEtE,2BAA2B;AAC3B,MAAM,WAAW,YAAa,SAAQ,YAAY;IAChD,0CAA0C;IAC1C,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB;AAED;;GAEG;AACH,wBAAsB,YAAY,CAChC,OAAO,EAAE,MAAM,EAAE,EACjB,OAAO,EAAE,MAAM,EACf,EAAE,EAAE,QAAQ,CAAC,QAAQ,EACrB,YAAY,EAAE,YAAY,EAC1B,UAAU,CAAC,EAAE,qBAAqB,EAClC,OAAO,CAAC,EAAE;IAAE,KAAK,CAAC,EAAE,OAAO,CAAA;CAAE,GAC5B,OAAO,CAAC,UAAU,CAAC,CA6GrB;AAgHD;;GAEG;AACH,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,EAAE,CAGpD;AAGD,OAAO,EAAE,aAAa,EAAE,kBAAkB,EAAE,KAAK,cAAc,EAAE,KAAK,eAAe,EAAE,MAAM,gBAAgB,CAAC;AAC9G,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,WAAW,EAAE,KAAK,KAAK,EAAE,KAAK,YAAY,EAAE,MAAM,cAAc,CAAC;AACjG,OAAO,EACL,KAAK,EACL,UAAU,EACV,WAAW,EACX,gBAAgB,EAChB,aAAa,EACb,KAAK,aAAa,GACnB,MAAM,iBAAiB,CAAC"}
@@ -2,18 +2,73 @@
2
2
  * Main Indexer Module
3
3
  *
4
4
  * Orchestrates file discovery, chunking, embedding, and storage.
5
+ * Supports incremental indexing via content hashing.
5
6
  */
7
+ import { createHash } from 'crypto';
6
8
  import { discoverFiles } from './discovery.js';
7
9
  import { chunkFiles } from './chunker.js';
8
10
  import { embedChunks } from './embeddings.js';
9
11
  /**
10
- * Index all sources
12
+ * Get all stored file hashes for a source
11
13
  */
12
- export async function indexSources(sources, baseDir, db, chunkOptions, onProgress) {
14
+ function getStoredFiles(db, sourceId) {
15
+ const rows = db.prepare('SELECT file_path, content_hash FROM files WHERE source_id = ?').all(sourceId);
16
+ const map = new Map();
17
+ for (const row of rows) {
18
+ map.set(row.file_path, row.content_hash);
19
+ }
20
+ return map;
21
+ }
22
+ /**
23
+ * Determine which files need to be indexed
24
+ */
25
+ function categorizeFiles(discovered, stored) {
26
+ const newFiles = [];
27
+ const changedFiles = [];
28
+ const unchangedFiles = [];
29
+ const currentPaths = new Set();
30
+ for (const file of discovered) {
31
+ currentPaths.add(file.relativePath);
32
+ const storedHash = stored.get(file.relativePath);
33
+ if (!storedHash) {
34
+ // New file
35
+ newFiles.push(file);
36
+ }
37
+ else if (storedHash !== file.contentHash) {
38
+ // Changed file
39
+ changedFiles.push(file);
40
+ }
41
+ else {
42
+ // Unchanged
43
+ unchangedFiles.push(file);
44
+ }
45
+ }
46
+ // Find removed files
47
+ const removedFiles = [];
48
+ for (const [path] of stored) {
49
+ if (!currentPaths.has(path)) {
50
+ removedFiles.push(path);
51
+ }
52
+ }
53
+ return {
54
+ new: newFiles,
55
+ changed: changedFiles,
56
+ unchanged: unchangedFiles,
57
+ removed: removedFiles,
58
+ };
59
+ }
60
+ /**
61
+ * Index all sources with incremental support
62
+ */
63
+ export async function indexSources(sources, baseDir, db, chunkOptions, onProgress, options) {
13
64
  const startTime = Date.now();
14
65
  let totalFiles = 0;
15
66
  let totalChunks = 0;
16
67
  let totalSkipped = 0;
68
+ let totalFilesChanged = 0;
69
+ let totalFilesUnchanged = 0;
70
+ let totalFilesRemoved = 0;
71
+ const forceReindex = options?.force ?? false;
17
72
  for (const source of sources) {
18
73
  // Phase 1: Discovery
19
74
  onProgress?.({
@@ -31,37 +86,48 @@ export async function indexSources(sources, baseDir, db, chunkOptions, onProgres
31
86
  current: discovered.files.length,
32
87
  total: discovered.files.length,
33
88
  });
34
- // Phase 2: Chunking
89
+ // Get stored file hashes for incremental indexing
90
+ const storedFiles = forceReindex ? new Map() : getStoredFiles(db, source.id);
91
+ const { new: newFiles, changed: changedFiles, unchanged: unchangedFiles, removed: removedFiles } = categorizeFiles(discovered.files, storedFiles);
92
+ // Files to process = new + changed
93
+ const filesToProcess = [...newFiles, ...changedFiles];
94
+ totalFilesChanged += filesToProcess.length;
95
+ totalFilesUnchanged += unchangedFiles.length;
96
+ totalFilesRemoved += removedFiles.length;
97
+ // Phase 2: Chunking (only for new/changed files)
35
98
  onProgress?.({
36
99
  phase: 'chunking',
37
100
  sourceId: source.id,
38
101
  current: 0,
39
- total: discovered.files.length,
102
+ total: filesToProcess.length,
40
103
  });
41
- const chunks = chunkFiles(discovered.files, chunkOptions);
104
+ const chunks = chunkFiles(filesToProcess, chunkOptions);
42
105
  onProgress?.({
43
106
  phase: 'chunking',
44
107
  sourceId: source.id,
45
- current: discovered.files.length,
46
- total: discovered.files.length,
108
+ current: filesToProcess.length,
109
+ total: filesToProcess.length,
47
110
  });
48
- // Phase 3: Embedding
49
- const embeddedChunks = await embedChunks(chunks, (current, total) => {
50
- onProgress?.({
51
- phase: 'embedding',
52
- sourceId: source.id,
53
- current,
54
- total,
111
+ // Phase 3: Embedding (only for new/changed files)
112
+ let embeddedChunks = [];
113
+ if (chunks.length > 0) {
114
+ embeddedChunks = await embedChunks(chunks, (current, total) => {
115
+ onProgress?.({
116
+ phase: 'embedding',
117
+ sourceId: source.id,
118
+ current,
119
+ total,
120
+ });
55
121
  });
56
- });
57
- // Phase 4: Store in database
122
+ }
123
+ // Phase 4: Store in database (incremental)
58
124
  onProgress?.({
59
125
  phase: 'storing',
60
126
  sourceId: source.id,
61
127
  current: 0,
62
128
  total: embeddedChunks.length,
63
129
  });
64
- storeChunks(db, source.id, source.path, embeddedChunks, discovered.files.length);
130
+ storeChunksIncremental(db, source.id, source.path, embeddedChunks, filesToProcess, removedFiles, discovered.files.length);
65
131
  totalChunks += embeddedChunks.length;
66
132
  onProgress?.({
67
133
  phase: 'storing',
@@ -75,18 +141,63 @@ export async function indexSources(sources, baseDir, db, chunkOptions, onProgres
75
141
  files: totalFiles,
76
142
  chunks: totalChunks,
77
143
  skipped: totalSkipped,
144
+ filesChanged: totalFilesChanged,
145
+ filesUnchanged: totalFilesUnchanged,
146
+ filesRemoved: totalFilesRemoved,
78
147
  timeMs: Date.now() - startTime,
79
148
  };
80
149
  }
81
150
  /**
82
- * Store chunks in the database
151
+ * Generate unique file ID
83
152
  */
84
- function storeChunks(db, sourceId, sourcePath, chunks, fileCount) {
153
+ function generateFileId(sourceId, filePath) {
154
+ const base = `${sourceId}:${filePath}`;
155
+ return createHash('sha256').update(base).digest('hex').slice(0, 16);
156
+ }
157
+ /**
158
+ * Store chunks incrementally (only for changed files)
159
+ */
160
+ function storeChunksIncremental(db, sourceId, sourcePath, chunks, processedFiles, removedFiles, totalFileCount) {
85
161
  // Begin transaction for performance
86
162
  const transaction = db.transaction(() => {
87
- // Clear existing chunks for this source
88
- db.prepare('DELETE FROM chunks WHERE source_id = ?').run(sourceId);
163
+ // FIRST: Ensure source exists (for foreign key constraints)
164
+ db.prepare(`
165
+ INSERT INTO sources (id, path, file_count, chunk_count, indexed_at)
166
+ VALUES (?, ?, 0, 0, datetime('now'))
167
+ ON CONFLICT(id) DO NOTHING
168
+ `).run(sourceId, sourcePath);
169
+ // Delete chunks for removed files
170
+ if (removedFiles.length > 0) {
171
+ const deleteChunks = db.prepare('DELETE FROM chunks WHERE source_id = ? AND file_path = ?');
172
+ const deleteFile = db.prepare('DELETE FROM files WHERE source_id = ? AND file_path = ?');
173
+ for (const filePath of removedFiles) {
174
+ deleteChunks.run(sourceId, filePath);
175
+ deleteFile.run(sourceId, filePath);
176
+ }
177
+ }
178
+ // Delete chunks for processed (changed) files - they'll be replaced
179
+ if (processedFiles.length > 0) {
180
+ const deleteChunks = db.prepare('DELETE FROM chunks WHERE source_id = ? AND file_path = ?');
181
+ for (const file of processedFiles) {
182
+ deleteChunks.run(sourceId, file.relativePath);
183
+ }
184
+ }
185
+ // Insert/update file records with new hashes
186
+ const upsertFile = db.prepare(`
187
+ INSERT INTO files (id, source_id, file_path, content_hash, indexed_at)
188
+ VALUES (?, ?, ?, ?, datetime('now'))
189
+ ON CONFLICT(source_id, file_path) DO UPDATE SET
190
+ content_hash = excluded.content_hash,
191
+ indexed_at = excluded.indexed_at
192
+ `);
193
+ for (const file of processedFiles) {
194
+ const fileId = generateFileId(sourceId, file.relativePath);
195
+ upsertFile.run(fileId, sourceId, file.relativePath, file.contentHash);
196
+ }
197
+ // Get current total chunk count for this source
198
+ const currentChunkCount = db.prepare('SELECT COUNT(*) as count FROM chunks WHERE source_id = ?').get(sourceId);
89
199
  // Update source record
200
+ const newChunkCount = currentChunkCount.count + chunks.length;
90
201
  db.prepare(`
91
202
  INSERT INTO sources (id, path, file_count, chunk_count, indexed_at)
92
203
  VALUES (?, ?, ?, ?, datetime('now'))
@@ -95,8 +206,8 @@ function storeChunks(db, sourceId, sourcePath, chunks, fileCount) {
95
206
  file_count = excluded.file_count,
96
207
  chunk_count = excluded.chunk_count,
97
208
  indexed_at = excluded.indexed_at
98
- `).run(sourceId, sourcePath, fileCount, chunks.length);
99
- // Insert chunks
209
+ `).run(sourceId, sourcePath, totalFileCount, newChunkCount);
210
+ // Insert new chunks
100
211
  const insertChunk = db.prepare(`
101
212
  INSERT INTO chunks (id, source_id, file_path, content, start_line, end_line, tokens, embedding)
102
213
  VALUES (?, ?, ?, ?, ?, ?, ?, ?)
@@ -117,7 +228,7 @@ export function readEmbedding(blob) {
117
228
  return Array.from(float32Array);
118
229
  }
119
230
  // Re-export types and functions
120
- export { discoverFiles } from './discovery.js';
231
+ export { discoverFiles, computeContentHash } from './discovery.js';
121
232
  export { chunkFiles, chunkFile, countTokens } from './chunker.js';
122
233
  export { embed, embedBatch, embedChunks, cosineSimilarity, EMBEDDING_DIM, } from './embeddings.js';
123
234
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/indexer/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/indexer/index.ts"],"names":[],"mappings":"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"}