@cdoing/core 0.1.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.
- package/dist/agents/coordinator.d.ts +114 -0
- package/dist/agents/coordinator.d.ts.map +1 -0
- package/dist/agents/coordinator.js +158 -0
- package/dist/agents/coordinator.js.map +1 -0
- package/dist/context-providers/clipboard.d.ts +13 -0
- package/dist/context-providers/clipboard.d.ts.map +1 -0
- package/dist/context-providers/clipboard.js +53 -0
- package/dist/context-providers/clipboard.js.map +1 -0
- package/dist/context-providers/codebase.d.ts +46 -0
- package/dist/context-providers/codebase.d.ts.map +1 -0
- package/dist/context-providers/codebase.js +273 -0
- package/dist/context-providers/codebase.js.map +1 -0
- package/dist/context-providers/diff.d.ts +18 -0
- package/dist/context-providers/diff.d.ts.map +1 -0
- package/dist/context-providers/diff.js +63 -0
- package/dist/context-providers/diff.js.map +1 -0
- package/dist/context-providers/docs.d.ts +21 -0
- package/dist/context-providers/docs.d.ts.map +1 -0
- package/dist/context-providers/docs.js +180 -0
- package/dist/context-providers/docs.js.map +1 -0
- package/dist/context-providers/file-include.d.ts +13 -0
- package/dist/context-providers/file-include.d.ts.map +1 -0
- package/dist/context-providers/file-include.js +82 -0
- package/dist/context-providers/file-include.js.map +1 -0
- package/dist/context-providers/folder.d.ts +19 -0
- package/dist/context-providers/folder.d.ts.map +1 -0
- package/dist/context-providers/folder.js +130 -0
- package/dist/context-providers/folder.js.map +1 -0
- package/dist/context-providers/git.d.ts +19 -0
- package/dist/context-providers/git.d.ts.map +1 -0
- package/dist/context-providers/git.js +74 -0
- package/dist/context-providers/git.js.map +1 -0
- package/dist/context-providers/index.d.ts +26 -0
- package/dist/context-providers/index.d.ts.map +1 -0
- package/dist/context-providers/index.js +37 -0
- package/dist/context-providers/index.js.map +1 -0
- package/dist/context-providers/open-files.d.ts +25 -0
- package/dist/context-providers/open-files.d.ts.map +1 -0
- package/dist/context-providers/open-files.js +134 -0
- package/dist/context-providers/open-files.js.map +1 -0
- package/dist/context-providers/problems.d.ts +24 -0
- package/dist/context-providers/problems.d.ts.map +1 -0
- package/dist/context-providers/problems.js +97 -0
- package/dist/context-providers/problems.js.map +1 -0
- package/dist/context-providers/registry.d.ts +61 -0
- package/dist/context-providers/registry.d.ts.map +1 -0
- package/dist/context-providers/registry.js +92 -0
- package/dist/context-providers/registry.js.map +1 -0
- package/dist/context-providers/terminal.d.ts +25 -0
- package/dist/context-providers/terminal.d.ts.map +1 -0
- package/dist/context-providers/terminal.js +55 -0
- package/dist/context-providers/terminal.js.map +1 -0
- package/dist/context-providers/tree.d.ts +29 -0
- package/dist/context-providers/tree.d.ts.map +1 -0
- package/dist/context-providers/tree.js +172 -0
- package/dist/context-providers/tree.js.map +1 -0
- package/dist/context-providers/types.d.ts +72 -0
- package/dist/context-providers/types.d.ts.map +1 -0
- package/dist/context-providers/types.js +10 -0
- package/dist/context-providers/types.js.map +1 -0
- package/dist/context-providers/url.d.ts +27 -0
- package/dist/context-providers/url.d.ts.map +1 -0
- package/dist/context-providers/url.js +131 -0
- package/dist/context-providers/url.js.map +1 -0
- package/dist/effort/index.d.ts +78 -0
- package/dist/effort/index.d.ts.map +1 -0
- package/dist/effort/index.js +146 -0
- package/dist/effort/index.js.map +1 -0
- package/dist/hooks/index.d.ts +47 -0
- package/dist/hooks/index.d.ts.map +1 -0
- package/dist/hooks/index.js +151 -0
- package/dist/hooks/index.js.map +1 -0
- package/dist/index.d.ts +75 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +152 -0
- package/dist/index.js.map +1 -0
- package/dist/indexing/chunker.d.ts +25 -0
- package/dist/indexing/chunker.d.ts.map +1 -0
- package/dist/indexing/chunker.js +217 -0
- package/dist/indexing/chunker.js.map +1 -0
- package/dist/indexing/database.d.ts +49 -0
- package/dist/indexing/database.d.ts.map +1 -0
- package/dist/indexing/database.js +287 -0
- package/dist/indexing/database.js.map +1 -0
- package/dist/indexing/index.d.ts +9 -0
- package/dist/indexing/index.d.ts.map +1 -0
- package/dist/indexing/index.js +13 -0
- package/dist/indexing/index.js.map +1 -0
- package/dist/indexing/indexer.d.ts +63 -0
- package/dist/indexing/indexer.d.ts.map +1 -0
- package/dist/indexing/indexer.js +352 -0
- package/dist/indexing/indexer.js.map +1 -0
- package/dist/indexing/recent-edits-cache.d.ts +77 -0
- package/dist/indexing/recent-edits-cache.d.ts.map +1 -0
- package/dist/indexing/recent-edits-cache.js +123 -0
- package/dist/indexing/recent-edits-cache.js.map +1 -0
- package/dist/indexing/types.d.ts +39 -0
- package/dist/indexing/types.d.ts.map +1 -0
- package/dist/indexing/types.js +6 -0
- package/dist/indexing/types.js.map +1 -0
- package/dist/mcp/index.d.ts +33 -0
- package/dist/mcp/index.d.ts.map +1 -0
- package/dist/mcp/index.js +37 -0
- package/dist/mcp/index.js.map +1 -0
- package/dist/mcp/manager.d.ts +123 -0
- package/dist/mcp/manager.d.ts.map +1 -0
- package/dist/mcp/manager.js +331 -0
- package/dist/mcp/manager.js.map +1 -0
- package/dist/oauth.d.ts +33 -0
- package/dist/oauth.d.ts.map +1 -0
- package/dist/oauth.js +312 -0
- package/dist/oauth.js.map +1 -0
- package/dist/permissions/index.d.ts +216 -0
- package/dist/permissions/index.d.ts.map +1 -0
- package/dist/permissions/index.js +938 -0
- package/dist/permissions/index.js.map +1 -0
- package/dist/plan/index.d.ts +20 -0
- package/dist/plan/index.d.ts.map +1 -0
- package/dist/plan/index.js +24 -0
- package/dist/plan/index.js.map +1 -0
- package/dist/plan/manager.d.ts +101 -0
- package/dist/plan/manager.d.ts.map +1 -0
- package/dist/plan/manager.js +170 -0
- package/dist/plan/manager.js.map +1 -0
- package/dist/rules/index.d.ts +28 -0
- package/dist/rules/index.d.ts.map +1 -0
- package/dist/rules/index.js +31 -0
- package/dist/rules/index.js.map +1 -0
- package/dist/rules/manager.d.ts +77 -0
- package/dist/rules/manager.d.ts.map +1 -0
- package/dist/rules/manager.js +279 -0
- package/dist/rules/manager.js.map +1 -0
- package/dist/rules/types.d.ts +34 -0
- package/dist/rules/types.d.ts.map +1 -0
- package/dist/rules/types.js +9 -0
- package/dist/rules/types.js.map +1 -0
- package/dist/sandbox/filesystem.d.ts +20 -0
- package/dist/sandbox/filesystem.d.ts.map +1 -0
- package/dist/sandbox/filesystem.js +141 -0
- package/dist/sandbox/filesystem.js.map +1 -0
- package/dist/sandbox/index.d.ts +4 -0
- package/dist/sandbox/index.d.ts.map +1 -0
- package/dist/sandbox/index.js +8 -0
- package/dist/sandbox/index.js.map +1 -0
- package/dist/sandbox/manager.d.ts +47 -0
- package/dist/sandbox/manager.d.ts.map +1 -0
- package/dist/sandbox/manager.js +220 -0
- package/dist/sandbox/manager.js.map +1 -0
- package/dist/sandbox/network.d.ts +14 -0
- package/dist/sandbox/network.d.ts.map +1 -0
- package/dist/sandbox/network.js +87 -0
- package/dist/sandbox/network.js.map +1 -0
- package/dist/sandbox/types.d.ts +42 -0
- package/dist/sandbox/types.d.ts.map +1 -0
- package/dist/sandbox/types.js +25 -0
- package/dist/sandbox/types.js.map +1 -0
- package/dist/tools/ast-edit.d.ts +57 -0
- package/dist/tools/ast-edit.d.ts.map +1 -0
- package/dist/tools/ast-edit.js +443 -0
- package/dist/tools/ast-edit.js.map +1 -0
- package/dist/tools/code-verify.d.ts +8 -0
- package/dist/tools/code-verify.d.ts.map +1 -0
- package/dist/tools/code-verify.js +159 -0
- package/dist/tools/code-verify.js.map +1 -0
- package/dist/tools/codebase-search.d.ts +17 -0
- package/dist/tools/codebase-search.d.ts.map +1 -0
- package/dist/tools/codebase-search.js +104 -0
- package/dist/tools/codebase-search.js.map +1 -0
- package/dist/tools/file-delete.d.ts +26 -0
- package/dist/tools/file-delete.d.ts.map +1 -0
- package/dist/tools/file-delete.js +179 -0
- package/dist/tools/file-delete.js.map +1 -0
- package/dist/tools/file-edit.d.ts +10 -0
- package/dist/tools/file-edit.d.ts.map +1 -0
- package/dist/tools/file-edit.js +138 -0
- package/dist/tools/file-edit.js.map +1 -0
- package/dist/tools/file-read.d.ts +12 -0
- package/dist/tools/file-read.d.ts.map +1 -0
- package/dist/tools/file-read.js +211 -0
- package/dist/tools/file-read.js.map +1 -0
- package/dist/tools/file-run.d.ts +10 -0
- package/dist/tools/file-run.d.ts.map +1 -0
- package/dist/tools/file-run.js +179 -0
- package/dist/tools/file-run.js.map +1 -0
- package/dist/tools/file-write.d.ts +10 -0
- package/dist/tools/file-write.d.ts.map +1 -0
- package/dist/tools/file-write.js +134 -0
- package/dist/tools/file-write.js.map +1 -0
- package/dist/tools/glob-search.d.ts +8 -0
- package/dist/tools/glob-search.d.ts.map +1 -0
- package/dist/tools/glob-search.js +108 -0
- package/dist/tools/glob-search.js.map +1 -0
- package/dist/tools/grep-search.d.ts +8 -0
- package/dist/tools/grep-search.d.ts.map +1 -0
- package/dist/tools/grep-search.js +139 -0
- package/dist/tools/grep-search.js.map +1 -0
- package/dist/tools/list-dir.d.ts +16 -0
- package/dist/tools/list-dir.d.ts.map +1 -0
- package/dist/tools/list-dir.js +183 -0
- package/dist/tools/list-dir.js.map +1 -0
- package/dist/tools/multi-edit.d.ts +16 -0
- package/dist/tools/multi-edit.d.ts.map +1 -0
- package/dist/tools/multi-edit.js +163 -0
- package/dist/tools/multi-edit.js.map +1 -0
- package/dist/tools/notebook-edit.d.ts +31 -0
- package/dist/tools/notebook-edit.d.ts.map +1 -0
- package/dist/tools/notebook-edit.js +321 -0
- package/dist/tools/notebook-edit.js.map +1 -0
- package/dist/tools/registry.d.ts +16 -0
- package/dist/tools/registry.d.ts.map +1 -0
- package/dist/tools/registry.js +41 -0
- package/dist/tools/registry.js.map +1 -0
- package/dist/tools/shell-exec.d.ts +12 -0
- package/dist/tools/shell-exec.d.ts.map +1 -0
- package/dist/tools/shell-exec.js +261 -0
- package/dist/tools/shell-exec.js.map +1 -0
- package/dist/tools/sub-agent-manager.d.ts +57 -0
- package/dist/tools/sub-agent-manager.d.ts.map +1 -0
- package/dist/tools/sub-agent-manager.js +153 -0
- package/dist/tools/sub-agent-manager.js.map +1 -0
- package/dist/tools/sub-agent-status.d.ts +12 -0
- package/dist/tools/sub-agent-status.d.ts.map +1 -0
- package/dist/tools/sub-agent-status.js +59 -0
- package/dist/tools/sub-agent-status.js.map +1 -0
- package/dist/tools/sub-agent-terminate.d.ts +12 -0
- package/dist/tools/sub-agent-terminate.d.ts.map +1 -0
- package/dist/tools/sub-agent-terminate.js +55 -0
- package/dist/tools/sub-agent-terminate.js.map +1 -0
- package/dist/tools/sub-agent.d.ts +34 -0
- package/dist/tools/sub-agent.d.ts.map +1 -0
- package/dist/tools/sub-agent.js +140 -0
- package/dist/tools/sub-agent.js.map +1 -0
- package/dist/tools/system-info.d.ts +24 -0
- package/dist/tools/system-info.d.ts.map +1 -0
- package/dist/tools/system-info.js +220 -0
- package/dist/tools/system-info.js.map +1 -0
- package/dist/tools/todo.d.ts +16 -0
- package/dist/tools/todo.d.ts.map +1 -0
- package/dist/tools/todo.js +144 -0
- package/dist/tools/todo.js.map +1 -0
- package/dist/tools/types.d.ts +20 -0
- package/dist/tools/types.d.ts.map +1 -0
- package/dist/tools/types.js +3 -0
- package/dist/tools/types.js.map +1 -0
- package/dist/tools/view-diff.d.ts +11 -0
- package/dist/tools/view-diff.d.ts.map +1 -0
- package/dist/tools/view-diff.js +88 -0
- package/dist/tools/view-diff.js.map +1 -0
- package/dist/tools/view-repo-map.d.ts +18 -0
- package/dist/tools/view-repo-map.d.ts.map +1 -0
- package/dist/tools/view-repo-map.js +245 -0
- package/dist/tools/view-repo-map.js.map +1 -0
- package/dist/tools/web-fetch.d.ts +13 -0
- package/dist/tools/web-fetch.d.ts.map +1 -0
- package/dist/tools/web-fetch.js +106 -0
- package/dist/tools/web-fetch.js.map +1 -0
- package/dist/tools/web-search.d.ts +10 -0
- package/dist/tools/web-search.d.ts.map +1 -0
- package/dist/tools/web-search.js +106 -0
- package/dist/tools/web-search.js.map +1 -0
- package/dist/utils/gitignore.d.ts +10 -0
- package/dist/utils/gitignore.d.ts.map +1 -0
- package/dist/utils/gitignore.js +104 -0
- package/dist/utils/gitignore.js.map +1 -0
- package/dist/utils/lazy-apply.d.ts +45 -0
- package/dist/utils/lazy-apply.d.ts.map +1 -0
- package/dist/utils/lazy-apply.js +164 -0
- package/dist/utils/lazy-apply.js.map +1 -0
- package/dist/utils/memory.d.ts +36 -0
- package/dist/utils/memory.d.ts.map +1 -0
- package/dist/utils/memory.js +136 -0
- package/dist/utils/memory.js.map +1 -0
- package/dist/utils/path-matching.d.ts +24 -0
- package/dist/utils/path-matching.d.ts.map +1 -0
- package/dist/utils/path-matching.js +116 -0
- package/dist/utils/path-matching.js.map +1 -0
- package/dist/utils/path-safety.d.ts +13 -0
- package/dist/utils/path-safety.d.ts.map +1 -0
- package/dist/utils/path-safety.js +54 -0
- package/dist/utils/path-safety.js.map +1 -0
- package/dist/utils/project-config.d.ts +18 -0
- package/dist/utils/project-config.d.ts.map +1 -0
- package/dist/utils/project-config.js +76 -0
- package/dist/utils/project-config.js.map +1 -0
- package/dist/utils/search-match.d.ts +63 -0
- package/dist/utils/search-match.d.ts.map +1 -0
- package/dist/utils/search-match.js +426 -0
- package/dist/utils/search-match.js.map +1 -0
- package/dist/utils/shell-paths.d.ts +17 -0
- package/dist/utils/shell-paths.d.ts.map +1 -0
- package/dist/utils/shell-paths.js +107 -0
- package/dist/utils/shell-paths.js.map +1 -0
- package/dist/utils/streaming-diff.d.ts +45 -0
- package/dist/utils/streaming-diff.d.ts.map +1 -0
- package/dist/utils/streaming-diff.js +230 -0
- package/dist/utils/streaming-diff.js.map +1 -0
- package/dist/utils/todo.d.ts +47 -0
- package/dist/utils/todo.d.ts.map +1 -0
- package/dist/utils/todo.js +102 -0
- package/dist/utils/todo.js.map +1 -0
- package/package.json +23 -0
- package/src/agents/coordinator.ts +240 -0
- package/src/context-providers/clipboard.ts +48 -0
- package/src/context-providers/codebase.ts +274 -0
- package/src/context-providers/diff.ts +66 -0
- package/src/context-providers/docs.ts +160 -0
- package/src/context-providers/file-include.ts +54 -0
- package/src/context-providers/folder.ts +106 -0
- package/src/context-providers/git.ts +72 -0
- package/src/context-providers/index.ts +26 -0
- package/src/context-providers/open-files.ts +113 -0
- package/src/context-providers/problems.ts +100 -0
- package/src/context-providers/registry.ts +99 -0
- package/src/context-providers/terminal.ts +58 -0
- package/src/context-providers/tree.ts +161 -0
- package/src/context-providers/types.ts +84 -0
- package/src/context-providers/url.ts +138 -0
- package/src/effort/index.ts +177 -0
- package/src/hooks/index.ts +148 -0
- package/src/index.ts +114 -0
- package/src/indexing/README.md +267 -0
- package/src/indexing/chunker.ts +206 -0
- package/src/indexing/database.ts +299 -0
- package/src/indexing/index.ts +15 -0
- package/src/indexing/indexer.ts +383 -0
- package/src/indexing/recent-edits-cache.ts +150 -0
- package/src/indexing/types.ts +44 -0
- package/src/mcp/index.ts +33 -0
- package/src/mcp/manager.ts +385 -0
- package/src/oauth.ts +330 -0
- package/src/permissions/index.ts +1011 -0
- package/src/plan/index.ts +20 -0
- package/src/plan/manager.ts +233 -0
- package/src/rules/index.ts +28 -0
- package/src/rules/manager.ts +276 -0
- package/src/rules/types.ts +40 -0
- package/src/sandbox/filesystem.ts +135 -0
- package/src/sandbox/index.ts +9 -0
- package/src/sandbox/manager.ts +213 -0
- package/src/sandbox/network.ts +101 -0
- package/src/sandbox/types.ts +63 -0
- package/src/tools/ast-edit.ts +493 -0
- package/src/tools/code-verify.ts +143 -0
- package/src/tools/codebase-search.ts +117 -0
- package/src/tools/file-delete.ts +155 -0
- package/src/tools/file-edit.ts +115 -0
- package/src/tools/file-read.ts +195 -0
- package/src/tools/file-run.ts +158 -0
- package/src/tools/file-write.ts +104 -0
- package/src/tools/glob-search.ts +80 -0
- package/src/tools/grep-search.ts +120 -0
- package/src/tools/list-dir.ts +172 -0
- package/src/tools/multi-edit.ts +138 -0
- package/src/tools/notebook-edit.ts +342 -0
- package/src/tools/registry.ts +43 -0
- package/src/tools/shell-exec.ts +251 -0
- package/src/tools/sub-agent-manager.ts +183 -0
- package/src/tools/sub-agent-status.ts +67 -0
- package/src/tools/sub-agent-terminate.ts +62 -0
- package/src/tools/sub-agent.ts +162 -0
- package/src/tools/system-info.ts +248 -0
- package/src/tools/todo.ts +149 -0
- package/src/tools/types.ts +21 -0
- package/src/tools/view-diff.ts +99 -0
- package/src/tools/view-repo-map.ts +249 -0
- package/src/tools/web-fetch.ts +118 -0
- package/src/tools/web-search.ts +129 -0
- package/src/utils/gitignore.ts +73 -0
- package/src/utils/lazy-apply.ts +189 -0
- package/src/utils/memory.ts +124 -0
- package/src/utils/path-matching.ts +84 -0
- package/src/utils/path-safety.ts +19 -0
- package/src/utils/project-config.ts +41 -0
- package/src/utils/search-match.ts +495 -0
- package/src/utils/shell-paths.ts +79 -0
- package/src/utils/streaming-diff.ts +260 -0
- package/src/utils/todo.ts +115 -0
- package/tsconfig.json +18 -0
|
@@ -0,0 +1,352 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Codebase Indexer — orchestrates indexing of an entire codebase.
|
|
4
|
+
*
|
|
5
|
+
* Pipeline:
|
|
6
|
+
* 1. Scan files (respects .gitignore, skips binaries/large files)
|
|
7
|
+
* 2. Compute cache keys (SHA-256 of content)
|
|
8
|
+
* 3. Diff against catalog (find new/modified/deleted files)
|
|
9
|
+
* 4. Chunk new/modified files
|
|
10
|
+
* 5. Insert chunks into SQLite
|
|
11
|
+
* 6. Build FTS5 index
|
|
12
|
+
* 7. Optionally compute embeddings (if provider configured)
|
|
13
|
+
*
|
|
14
|
+
* Supports incremental updates — only re-indexes changed files.
|
|
15
|
+
*/
|
|
16
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
17
|
+
if (k2 === undefined) k2 = k;
|
|
18
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
19
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
20
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
21
|
+
}
|
|
22
|
+
Object.defineProperty(o, k2, desc);
|
|
23
|
+
}) : (function(o, m, k, k2) {
|
|
24
|
+
if (k2 === undefined) k2 = k;
|
|
25
|
+
o[k2] = m[k];
|
|
26
|
+
}));
|
|
27
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
28
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
29
|
+
}) : function(o, v) {
|
|
30
|
+
o["default"] = v;
|
|
31
|
+
});
|
|
32
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
33
|
+
var ownKeys = function(o) {
|
|
34
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
35
|
+
var ar = [];
|
|
36
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
37
|
+
return ar;
|
|
38
|
+
};
|
|
39
|
+
return ownKeys(o);
|
|
40
|
+
};
|
|
41
|
+
return function (mod) {
|
|
42
|
+
if (mod && mod.__esModule) return mod;
|
|
43
|
+
var result = {};
|
|
44
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
45
|
+
__setModuleDefault(result, mod);
|
|
46
|
+
return result;
|
|
47
|
+
};
|
|
48
|
+
})();
|
|
49
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
50
|
+
exports.CodebaseIndexer = void 0;
|
|
51
|
+
const fs = __importStar(require("fs"));
|
|
52
|
+
const path = __importStar(require("path"));
|
|
53
|
+
const glob_1 = require("glob");
|
|
54
|
+
const database_1 = require("./database");
|
|
55
|
+
const chunker_1 = require("./chunker");
|
|
56
|
+
const gitignore_1 = require("../utils/gitignore");
|
|
57
|
+
/** File extensions to index */
|
|
58
|
+
const INDEXABLE_EXTENSIONS = new Set([
|
|
59
|
+
// Code
|
|
60
|
+
".ts", ".tsx", ".js", ".jsx", ".mjs", ".cjs",
|
|
61
|
+
".py", ".rb", ".go", ".rs", ".java", ".kt", ".scala",
|
|
62
|
+
".c", ".cpp", ".h", ".hpp", ".cs", ".swift",
|
|
63
|
+
".lua", ".php", ".pl", ".sh", ".bash", ".zsh",
|
|
64
|
+
// Config/Data
|
|
65
|
+
".json", ".yaml", ".yml", ".toml", ".xml",
|
|
66
|
+
".html", ".css", ".scss", ".less", ".vue", ".svelte",
|
|
67
|
+
// Docs
|
|
68
|
+
".md", ".mdx", ".txt", ".rst",
|
|
69
|
+
// Other
|
|
70
|
+
".sql", ".graphql", ".gql", ".proto",
|
|
71
|
+
".env.example", ".gitignore", ".dockerignore",
|
|
72
|
+
"Dockerfile", "Makefile", "Gemfile",
|
|
73
|
+
]);
|
|
74
|
+
const SKIP_DIRS = new Set([
|
|
75
|
+
"node_modules", ".git", "dist", "build", "out", ".next", ".nuxt",
|
|
76
|
+
"__pycache__", ".cache", ".turbo", "coverage", "venv", ".venv",
|
|
77
|
+
"target", "vendor", ".idea", ".vscode",
|
|
78
|
+
]);
|
|
79
|
+
const MAX_FILE_SIZE = 1024 * 1024; // 1MB
|
|
80
|
+
const BATCH_SIZE = 200;
|
|
81
|
+
class CodebaseIndexer {
|
|
82
|
+
db;
|
|
83
|
+
workingDir;
|
|
84
|
+
embeddingProvider;
|
|
85
|
+
constructor(workingDir, embeddingProvider, dbPath) {
|
|
86
|
+
this.workingDir = path.resolve(workingDir);
|
|
87
|
+
this.db = new database_1.IndexDatabase(dbPath);
|
|
88
|
+
this.embeddingProvider = embeddingProvider;
|
|
89
|
+
}
|
|
90
|
+
/**
|
|
91
|
+
* Index the entire codebase (incremental — only processes changed files).
|
|
92
|
+
*/
|
|
93
|
+
async index(onProgress) {
|
|
94
|
+
const report = (phase, current, total, message) => {
|
|
95
|
+
onProgress?.({ phase, current, total, message });
|
|
96
|
+
};
|
|
97
|
+
// 1. Scan files
|
|
98
|
+
report("scan", 0, 1, "Scanning files...");
|
|
99
|
+
const files = await this.scanFiles();
|
|
100
|
+
report("scan", 1, 1, `Found ${files.length} files`);
|
|
101
|
+
// 2. Diff against catalog
|
|
102
|
+
report("diff", 0, 1, "Computing changes...");
|
|
103
|
+
const catalogPaths = this.db.getCatalogPaths(this.workingDir);
|
|
104
|
+
const currentPaths = new Map();
|
|
105
|
+
for (const filePath of files) {
|
|
106
|
+
try {
|
|
107
|
+
const content = fs.readFileSync(filePath, "utf-8");
|
|
108
|
+
const key = database_1.IndexDatabase.cacheKey(content);
|
|
109
|
+
currentPaths.set(filePath, key);
|
|
110
|
+
}
|
|
111
|
+
catch {
|
|
112
|
+
// Skip unreadable files
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
// Classify: new, modified, deleted, unchanged
|
|
116
|
+
const toAdd = [];
|
|
117
|
+
const toUpdate = [];
|
|
118
|
+
const toDelete = [];
|
|
119
|
+
for (const [filePath, cacheKey] of currentPaths) {
|
|
120
|
+
const existing = catalogPaths.get(filePath);
|
|
121
|
+
if (!existing) {
|
|
122
|
+
toAdd.push(filePath);
|
|
123
|
+
}
|
|
124
|
+
else if (existing !== cacheKey) {
|
|
125
|
+
toUpdate.push(filePath);
|
|
126
|
+
}
|
|
127
|
+
// else: unchanged — skip
|
|
128
|
+
}
|
|
129
|
+
for (const filePath of catalogPaths.keys()) {
|
|
130
|
+
if (!currentPaths.has(filePath)) {
|
|
131
|
+
toDelete.push(filePath);
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
report("diff", 1, 1, `Changes: ${toAdd.length} new, ${toUpdate.length} modified, ${toDelete.length} deleted`);
|
|
135
|
+
// 3. Delete removed files
|
|
136
|
+
for (const filePath of toDelete) {
|
|
137
|
+
this.db.deleteChunksByPath(filePath);
|
|
138
|
+
this.db.removeCatalogEntry(filePath, this.workingDir);
|
|
139
|
+
}
|
|
140
|
+
// 4. Delete modified files (will re-index)
|
|
141
|
+
for (const filePath of toUpdate) {
|
|
142
|
+
this.db.deleteChunksByPath(filePath);
|
|
143
|
+
}
|
|
144
|
+
// 5. Process new + modified files in batches
|
|
145
|
+
const toProcess = [...toAdd, ...toUpdate];
|
|
146
|
+
let totalChunks = 0;
|
|
147
|
+
for (let batch = 0; batch < toProcess.length; batch += BATCH_SIZE) {
|
|
148
|
+
const batchFiles = toProcess.slice(batch, batch + BATCH_SIZE);
|
|
149
|
+
report("index", batch, toProcess.length, `Indexing batch ${Math.floor(batch / BATCH_SIZE) + 1}...`);
|
|
150
|
+
for (const filePath of batchFiles) {
|
|
151
|
+
const cacheKey = currentPaths.get(filePath);
|
|
152
|
+
const content = fs.readFileSync(filePath, "utf-8");
|
|
153
|
+
const relPath = path.relative(this.workingDir, filePath);
|
|
154
|
+
if (!(0, chunker_1.shouldChunk)(filePath, content.length))
|
|
155
|
+
continue;
|
|
156
|
+
// Chunk the file
|
|
157
|
+
const rawChunks = (0, chunker_1.chunkDocument)(filePath, content);
|
|
158
|
+
if (rawChunks.length === 0)
|
|
159
|
+
continue;
|
|
160
|
+
const chunks = rawChunks.map((c) => ({
|
|
161
|
+
content: c.content,
|
|
162
|
+
path: relPath,
|
|
163
|
+
startLine: c.startLine,
|
|
164
|
+
endLine: c.endLine,
|
|
165
|
+
cacheKey,
|
|
166
|
+
}));
|
|
167
|
+
// Insert chunks
|
|
168
|
+
const chunkIds = this.db.insertChunks(chunks);
|
|
169
|
+
totalChunks += chunkIds.length;
|
|
170
|
+
// Build FTS index
|
|
171
|
+
for (let i = 0; i < chunkIds.length; i++) {
|
|
172
|
+
if (chunkIds[i] > 0) {
|
|
173
|
+
this.db.insertFts(chunkIds[i], relPath, chunks[i].content, cacheKey);
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
// Update catalog
|
|
177
|
+
this.db.updateCatalog(filePath, cacheKey, this.workingDir);
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
// 6. Compute embeddings (if provider available)
|
|
181
|
+
if (this.embeddingProvider && toProcess.length > 0) {
|
|
182
|
+
report("embeddings", 0, 1, "Computing embeddings...");
|
|
183
|
+
await this.computeEmbeddings(toProcess, currentPaths);
|
|
184
|
+
report("embeddings", 1, 1, "Embeddings complete");
|
|
185
|
+
}
|
|
186
|
+
report("done", 1, 1, "Indexing complete");
|
|
187
|
+
return {
|
|
188
|
+
added: toAdd.length,
|
|
189
|
+
updated: toUpdate.length,
|
|
190
|
+
deleted: toDelete.length,
|
|
191
|
+
totalChunks,
|
|
192
|
+
};
|
|
193
|
+
}
|
|
194
|
+
/**
|
|
195
|
+
* Search the index using full-text search (BM25).
|
|
196
|
+
*/
|
|
197
|
+
searchFts(query, limit = 25, directory) {
|
|
198
|
+
return this.db.searchFts(query, limit, directory);
|
|
199
|
+
}
|
|
200
|
+
/**
|
|
201
|
+
* Search using vector similarity (cosine similarity).
|
|
202
|
+
* Requires an embedding provider.
|
|
203
|
+
*/
|
|
204
|
+
async searchSemantic(query, limit = 25, directory) {
|
|
205
|
+
if (!this.embeddingProvider)
|
|
206
|
+
return [];
|
|
207
|
+
const [queryVector] = await this.embeddingProvider.embed([query]);
|
|
208
|
+
if (!queryVector)
|
|
209
|
+
return [];
|
|
210
|
+
const embeddings = this.db.getEmbeddings(this.embeddingProvider.modelId, directory);
|
|
211
|
+
if (embeddings.length === 0)
|
|
212
|
+
return [];
|
|
213
|
+
// Compute cosine similarity
|
|
214
|
+
const scored = embeddings.map((e) => ({
|
|
215
|
+
...e,
|
|
216
|
+
score: cosineSimilarity(queryVector, e.vector),
|
|
217
|
+
}));
|
|
218
|
+
// Sort by similarity (highest first) and take top-k
|
|
219
|
+
scored.sort((a, b) => b.score - a.score);
|
|
220
|
+
return scored.slice(0, limit).map((s) => ({
|
|
221
|
+
path: s.path,
|
|
222
|
+
content: s.content,
|
|
223
|
+
startLine: s.startLine,
|
|
224
|
+
endLine: s.endLine,
|
|
225
|
+
score: s.score,
|
|
226
|
+
source: "embedding",
|
|
227
|
+
}));
|
|
228
|
+
}
|
|
229
|
+
/**
|
|
230
|
+
* Combined search: FTS (25%) + Embeddings (75%), deduplicated.
|
|
231
|
+
*/
|
|
232
|
+
async search(query, limit = 25, directory) {
|
|
233
|
+
const ftsLimit = Math.ceil(limit * 0.35);
|
|
234
|
+
const embLimit = Math.ceil(limit * 0.65);
|
|
235
|
+
const [ftsResults, embResults] = await Promise.all([
|
|
236
|
+
Promise.resolve(this.searchFts(query, ftsLimit, directory)),
|
|
237
|
+
this.searchSemantic(query, embLimit, directory),
|
|
238
|
+
]);
|
|
239
|
+
// Deduplicate by path + startLine
|
|
240
|
+
const seen = new Set();
|
|
241
|
+
const combined = [];
|
|
242
|
+
for (const r of [...embResults, ...ftsResults]) {
|
|
243
|
+
const key = `${r.path}:${r.startLine}`;
|
|
244
|
+
if (seen.has(key))
|
|
245
|
+
continue;
|
|
246
|
+
seen.add(key);
|
|
247
|
+
combined.push(r);
|
|
248
|
+
}
|
|
249
|
+
return combined.slice(0, limit);
|
|
250
|
+
}
|
|
251
|
+
/**
|
|
252
|
+
* Get index statistics.
|
|
253
|
+
*/
|
|
254
|
+
getStats() {
|
|
255
|
+
return this.db.getStats();
|
|
256
|
+
}
|
|
257
|
+
/**
|
|
258
|
+
* Clear the entire index.
|
|
259
|
+
*/
|
|
260
|
+
clearIndex() {
|
|
261
|
+
this.db.clearAll();
|
|
262
|
+
}
|
|
263
|
+
/**
|
|
264
|
+
* Close the database connection.
|
|
265
|
+
*/
|
|
266
|
+
close() {
|
|
267
|
+
this.db.close();
|
|
268
|
+
}
|
|
269
|
+
// ── Private methods ───────────────────────────────────────────────────────
|
|
270
|
+
async scanFiles() {
|
|
271
|
+
const ignorePatterns = (0, gitignore_1.loadIgnorePatterns)(this.workingDir);
|
|
272
|
+
const allFiles = await (0, glob_1.glob)("**/*", {
|
|
273
|
+
cwd: this.workingDir,
|
|
274
|
+
absolute: true,
|
|
275
|
+
nodir: true,
|
|
276
|
+
ignore: [
|
|
277
|
+
...SKIP_DIRS.values(),
|
|
278
|
+
...ignorePatterns.map((p) => `**/${p}/**`),
|
|
279
|
+
].map(p => `**/${p}`),
|
|
280
|
+
});
|
|
281
|
+
return allFiles.filter((f) => {
|
|
282
|
+
const ext = path.extname(f).toLowerCase();
|
|
283
|
+
const basename = path.basename(f);
|
|
284
|
+
// Check extension or known config filenames
|
|
285
|
+
if (!INDEXABLE_EXTENSIONS.has(ext) && !INDEXABLE_EXTENSIONS.has(basename))
|
|
286
|
+
return false;
|
|
287
|
+
// Check file size
|
|
288
|
+
try {
|
|
289
|
+
const stat = fs.statSync(f);
|
|
290
|
+
if (stat.size > MAX_FILE_SIZE || stat.size === 0)
|
|
291
|
+
return false;
|
|
292
|
+
}
|
|
293
|
+
catch {
|
|
294
|
+
return false;
|
|
295
|
+
}
|
|
296
|
+
// Skip dirs in path
|
|
297
|
+
const rel = path.relative(this.workingDir, f);
|
|
298
|
+
const parts = rel.split(path.sep);
|
|
299
|
+
if (parts.some((p) => SKIP_DIRS.has(p)))
|
|
300
|
+
return false;
|
|
301
|
+
return true;
|
|
302
|
+
});
|
|
303
|
+
}
|
|
304
|
+
async computeEmbeddings(filePaths, cacheKeys) {
|
|
305
|
+
if (!this.embeddingProvider)
|
|
306
|
+
return;
|
|
307
|
+
const model = this.embeddingProvider.modelId;
|
|
308
|
+
const batchSize = this.embeddingProvider.maxBatchSize || 64;
|
|
309
|
+
// Collect all chunks that need embeddings
|
|
310
|
+
const chunksToEmbed = [];
|
|
311
|
+
for (const filePath of filePaths) {
|
|
312
|
+
const relPath = path.relative(this.workingDir, filePath);
|
|
313
|
+
const cacheKey = cacheKeys.get(filePath);
|
|
314
|
+
// Get chunks for this file
|
|
315
|
+
const rows = this.db["db"].prepare("SELECT id, content FROM chunks WHERE path = ? AND cacheKey = ?").all(relPath, cacheKey);
|
|
316
|
+
for (const row of rows) {
|
|
317
|
+
chunksToEmbed.push({ chunkId: row.id, path: relPath, content: row.content, cacheKey });
|
|
318
|
+
}
|
|
319
|
+
}
|
|
320
|
+
// Batch embed
|
|
321
|
+
for (let i = 0; i < chunksToEmbed.length; i += batchSize) {
|
|
322
|
+
const batch = chunksToEmbed.slice(i, i + batchSize);
|
|
323
|
+
const texts = batch.map((c) => c.content);
|
|
324
|
+
try {
|
|
325
|
+
const vectors = await this.embeddingProvider.embed(texts);
|
|
326
|
+
for (let j = 0; j < batch.length; j++) {
|
|
327
|
+
if (vectors[j]) {
|
|
328
|
+
this.db.insertEmbedding(batch[j].chunkId, batch[j].path, batch[j].cacheKey, vectors[j], model);
|
|
329
|
+
}
|
|
330
|
+
}
|
|
331
|
+
}
|
|
332
|
+
catch {
|
|
333
|
+
// Embedding failed for this batch — continue with next
|
|
334
|
+
}
|
|
335
|
+
}
|
|
336
|
+
}
|
|
337
|
+
}
|
|
338
|
+
exports.CodebaseIndexer = CodebaseIndexer;
|
|
339
|
+
/** Cosine similarity between two vectors */
|
|
340
|
+
function cosineSimilarity(a, b) {
|
|
341
|
+
if (a.length !== b.length)
|
|
342
|
+
return 0;
|
|
343
|
+
let dot = 0, magA = 0, magB = 0;
|
|
344
|
+
for (let i = 0; i < a.length; i++) {
|
|
345
|
+
dot += a[i] * b[i];
|
|
346
|
+
magA += a[i] * a[i];
|
|
347
|
+
magB += b[i] * b[i];
|
|
348
|
+
}
|
|
349
|
+
const denom = Math.sqrt(magA) * Math.sqrt(magB);
|
|
350
|
+
return denom === 0 ? 0 : dot / denom;
|
|
351
|
+
}
|
|
352
|
+
//# sourceMappingURL=indexer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"indexer.js","sourceRoot":"","sources":["../../src/indexing/indexer.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Recently-Edited LRU Cache — Keeps recently edited files hot for fast retrieval.
|
|
3
|
+
*
|
|
4
|
+
* When the agent edits a file, it's added to this cache. Subsequent codebase
|
|
5
|
+
* searches prioritize cached files, and context providers can include recent
|
|
6
|
+
* edits without re-reading from disk.
|
|
7
|
+
*
|
|
8
|
+
* This matches what Cursor and Windsurf do with their "recently edited" caches
|
|
9
|
+
* to improve relevance of search results and context suggestions.
|
|
10
|
+
*/
|
|
11
|
+
export interface CachedEdit {
|
|
12
|
+
/** Absolute file path */
|
|
13
|
+
filePath: string;
|
|
14
|
+
/** Content at time of last edit */
|
|
15
|
+
content: string;
|
|
16
|
+
/** Timestamp of last edit */
|
|
17
|
+
editedAt: number;
|
|
18
|
+
/** Number of times this file has been edited in the session */
|
|
19
|
+
editCount: number;
|
|
20
|
+
/** Brief description of last edit (e.g., "replaced 2 occurrences") */
|
|
21
|
+
lastEditSummary: string;
|
|
22
|
+
}
|
|
23
|
+
export declare class RecentEditsCache {
|
|
24
|
+
private cache;
|
|
25
|
+
private readonly maxSize;
|
|
26
|
+
constructor(maxSize?: number);
|
|
27
|
+
/**
|
|
28
|
+
* Record a file edit. Moves the file to the front of the LRU cache.
|
|
29
|
+
*/
|
|
30
|
+
put(filePath: string, content: string, editSummary?: string): void;
|
|
31
|
+
/**
|
|
32
|
+
* Get a cached file by path. Returns null if not in cache.
|
|
33
|
+
*/
|
|
34
|
+
get(filePath: string): CachedEdit | null;
|
|
35
|
+
/**
|
|
36
|
+
* Check if a file is in the cache.
|
|
37
|
+
*/
|
|
38
|
+
has(filePath: string): boolean;
|
|
39
|
+
/**
|
|
40
|
+
* Get all cached edits, ordered by most recently edited first.
|
|
41
|
+
*/
|
|
42
|
+
getRecent(limit?: number): CachedEdit[];
|
|
43
|
+
/**
|
|
44
|
+
* Get file paths of recently edited files, most recent first.
|
|
45
|
+
*/
|
|
46
|
+
getRecentPaths(limit?: number): string[];
|
|
47
|
+
/**
|
|
48
|
+
* Get files that match a search query (case-insensitive path match).
|
|
49
|
+
* Recently edited files that match are boosted in search results.
|
|
50
|
+
*/
|
|
51
|
+
searchByPath(query: string): CachedEdit[];
|
|
52
|
+
/**
|
|
53
|
+
* Search cached file contents for a text pattern.
|
|
54
|
+
*/
|
|
55
|
+
searchContent(pattern: string): Array<{
|
|
56
|
+
entry: CachedEdit;
|
|
57
|
+
matches: number;
|
|
58
|
+
}>;
|
|
59
|
+
/**
|
|
60
|
+
* Remove a file from the cache.
|
|
61
|
+
*/
|
|
62
|
+
remove(filePath: string): boolean;
|
|
63
|
+
/**
|
|
64
|
+
* Clear the entire cache.
|
|
65
|
+
*/
|
|
66
|
+
clear(): void;
|
|
67
|
+
/**
|
|
68
|
+
* Get cache statistics.
|
|
69
|
+
*/
|
|
70
|
+
stats(): {
|
|
71
|
+
size: number;
|
|
72
|
+
maxSize: number;
|
|
73
|
+
totalEdits: number;
|
|
74
|
+
oldestEditAt: number | null;
|
|
75
|
+
};
|
|
76
|
+
}
|
|
77
|
+
//# sourceMappingURL=recent-edits-cache.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"recent-edits-cache.d.ts","sourceRoot":"","sources":["../../src/indexing/recent-edits-cache.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,MAAM,WAAW,UAAU;IACzB,yBAAyB;IACzB,QAAQ,EAAE,MAAM,CAAC;IACjB,mCAAmC;IACnC,OAAO,EAAE,MAAM,CAAC;IAChB,6BAA6B;IAC7B,QAAQ,EAAE,MAAM,CAAC;IACjB,+DAA+D;IAC/D,SAAS,EAAE,MAAM,CAAC;IAClB,sEAAsE;IACtE,eAAe,EAAE,MAAM,CAAC;CACzB;AAED,qBAAa,gBAAgB;IAC3B,OAAO,CAAC,KAAK,CAAiC;IAC9C,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAS;gBAErB,OAAO,GAAE,MAAW;IAIhC;;OAEG;IACH,GAAG,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,WAAW,GAAE,MAAW,GAAG,IAAI;IAyBtE;;OAEG;IACH,GAAG,CAAC,QAAQ,EAAE,MAAM,GAAG,UAAU,GAAG,IAAI;IAIxC;;OAEG;IACH,GAAG,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO;IAI9B;;OAEG;IACH,SAAS,CAAC,KAAK,GAAE,MAAW,GAAG,UAAU,EAAE;IAM3C;;OAEG;IACH,cAAc,CAAC,KAAK,GAAE,MAAW,GAAG,MAAM,EAAE;IAI5C;;;OAGG;IACH,YAAY,CAAC,KAAK,EAAE,MAAM,GAAG,UAAU,EAAE;IAOzC;;OAEG;IACH,aAAa,CAAC,OAAO,EAAE,MAAM,GAAG,KAAK,CAAC;QAAE,KAAK,EAAE,UAAU,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC;IAe7E;;OAEG;IACH,MAAM,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO;IAIjC;;OAEG;IACH,KAAK,IAAI,IAAI;IAIb;;OAEG;IACH,KAAK,IAAI;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAC;QAAC,UAAU,EAAE,MAAM,CAAC;QAAC,YAAY,EAAE,MAAM,GAAG,IAAI,CAAA;KAAE;CAa5F"}
|
|
@@ -0,0 +1,123 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Recently-Edited LRU Cache — Keeps recently edited files hot for fast retrieval.
|
|
4
|
+
*
|
|
5
|
+
* When the agent edits a file, it's added to this cache. Subsequent codebase
|
|
6
|
+
* searches prioritize cached files, and context providers can include recent
|
|
7
|
+
* edits without re-reading from disk.
|
|
8
|
+
*
|
|
9
|
+
* This matches what Cursor and Windsurf do with their "recently edited" caches
|
|
10
|
+
* to improve relevance of search results and context suggestions.
|
|
11
|
+
*/
|
|
12
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
13
|
+
exports.RecentEditsCache = void 0;
|
|
14
|
+
class RecentEditsCache {
|
|
15
|
+
cache = new Map();
|
|
16
|
+
maxSize;
|
|
17
|
+
constructor(maxSize = 50) {
|
|
18
|
+
this.maxSize = maxSize;
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* Record a file edit. Moves the file to the front of the LRU cache.
|
|
22
|
+
*/
|
|
23
|
+
put(filePath, content, editSummary = "") {
|
|
24
|
+
const existing = this.cache.get(filePath);
|
|
25
|
+
// Delete first to re-insert at end (Map preserves insertion order)
|
|
26
|
+
if (existing) {
|
|
27
|
+
this.cache.delete(filePath);
|
|
28
|
+
}
|
|
29
|
+
this.cache.set(filePath, {
|
|
30
|
+
filePath,
|
|
31
|
+
content,
|
|
32
|
+
editedAt: Date.now(),
|
|
33
|
+
editCount: (existing?.editCount || 0) + 1,
|
|
34
|
+
lastEditSummary: editSummary,
|
|
35
|
+
});
|
|
36
|
+
// Evict oldest if over capacity
|
|
37
|
+
if (this.cache.size > this.maxSize) {
|
|
38
|
+
const oldest = this.cache.keys().next().value;
|
|
39
|
+
if (oldest !== undefined) {
|
|
40
|
+
this.cache.delete(oldest);
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* Get a cached file by path. Returns null if not in cache.
|
|
46
|
+
*/
|
|
47
|
+
get(filePath) {
|
|
48
|
+
return this.cache.get(filePath) || null;
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* Check if a file is in the cache.
|
|
52
|
+
*/
|
|
53
|
+
has(filePath) {
|
|
54
|
+
return this.cache.has(filePath);
|
|
55
|
+
}
|
|
56
|
+
/**
|
|
57
|
+
* Get all cached edits, ordered by most recently edited first.
|
|
58
|
+
*/
|
|
59
|
+
getRecent(limit = 10) {
|
|
60
|
+
const entries = Array.from(this.cache.values());
|
|
61
|
+
// Map preserves insertion order; last inserted = most recent
|
|
62
|
+
return entries.reverse().slice(0, limit);
|
|
63
|
+
}
|
|
64
|
+
/**
|
|
65
|
+
* Get file paths of recently edited files, most recent first.
|
|
66
|
+
*/
|
|
67
|
+
getRecentPaths(limit = 10) {
|
|
68
|
+
return this.getRecent(limit).map((e) => e.filePath);
|
|
69
|
+
}
|
|
70
|
+
/**
|
|
71
|
+
* Get files that match a search query (case-insensitive path match).
|
|
72
|
+
* Recently edited files that match are boosted in search results.
|
|
73
|
+
*/
|
|
74
|
+
searchByPath(query) {
|
|
75
|
+
const lower = query.toLowerCase();
|
|
76
|
+
return Array.from(this.cache.values())
|
|
77
|
+
.filter((e) => e.filePath.toLowerCase().includes(lower))
|
|
78
|
+
.reverse(); // most recent first
|
|
79
|
+
}
|
|
80
|
+
/**
|
|
81
|
+
* Search cached file contents for a text pattern.
|
|
82
|
+
*/
|
|
83
|
+
searchContent(pattern) {
|
|
84
|
+
const results = [];
|
|
85
|
+
const regex = new RegExp(pattern, "gi");
|
|
86
|
+
for (const entry of this.cache.values()) {
|
|
87
|
+
const matches = (entry.content.match(regex) || []).length;
|
|
88
|
+
if (matches > 0) {
|
|
89
|
+
results.push({ entry, matches });
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
// Sort by match count (descending), then recency
|
|
93
|
+
return results.sort((a, b) => b.matches - a.matches || b.entry.editedAt - a.entry.editedAt);
|
|
94
|
+
}
|
|
95
|
+
/**
|
|
96
|
+
* Remove a file from the cache.
|
|
97
|
+
*/
|
|
98
|
+
remove(filePath) {
|
|
99
|
+
return this.cache.delete(filePath);
|
|
100
|
+
}
|
|
101
|
+
/**
|
|
102
|
+
* Clear the entire cache.
|
|
103
|
+
*/
|
|
104
|
+
clear() {
|
|
105
|
+
this.cache.clear();
|
|
106
|
+
}
|
|
107
|
+
/**
|
|
108
|
+
* Get cache statistics.
|
|
109
|
+
*/
|
|
110
|
+
stats() {
|
|
111
|
+
let totalEdits = 0;
|
|
112
|
+
let oldestEditAt = null;
|
|
113
|
+
for (const entry of this.cache.values()) {
|
|
114
|
+
totalEdits += entry.editCount;
|
|
115
|
+
if (oldestEditAt === null || entry.editedAt < oldestEditAt) {
|
|
116
|
+
oldestEditAt = entry.editedAt;
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
return { size: this.cache.size, maxSize: this.maxSize, totalEdits, oldestEditAt };
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
exports.RecentEditsCache = RecentEditsCache;
|
|
123
|
+
//# sourceMappingURL=recent-edits-cache.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"recent-edits-cache.js","sourceRoot":"","sources":["../../src/indexing/recent-edits-cache.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Indexing Types — interfaces for the codebase indexing system.
|
|
3
|
+
*/
|
|
4
|
+
export interface IndexTag {
|
|
5
|
+
directory: string;
|
|
6
|
+
branch: string;
|
|
7
|
+
artifactId: string;
|
|
8
|
+
}
|
|
9
|
+
export interface ChunkWithMeta {
|
|
10
|
+
content: string;
|
|
11
|
+
path: string;
|
|
12
|
+
startLine: number;
|
|
13
|
+
endLine: number;
|
|
14
|
+
cacheKey: string;
|
|
15
|
+
}
|
|
16
|
+
export interface SearchResult {
|
|
17
|
+
path: string;
|
|
18
|
+
content: string;
|
|
19
|
+
startLine: number;
|
|
20
|
+
endLine: number;
|
|
21
|
+
score: number;
|
|
22
|
+
source: "fts" | "embedding" | "recent";
|
|
23
|
+
}
|
|
24
|
+
export interface IndexingProgress {
|
|
25
|
+
phase: string;
|
|
26
|
+
current: number;
|
|
27
|
+
total: number;
|
|
28
|
+
message: string;
|
|
29
|
+
}
|
|
30
|
+
export type IndexingProgressCallback = (progress: IndexingProgress) => void;
|
|
31
|
+
export interface IndexStats {
|
|
32
|
+
totalFiles: number;
|
|
33
|
+
totalChunks: number;
|
|
34
|
+
ftsEntries: number;
|
|
35
|
+
embeddingEntries: number;
|
|
36
|
+
lastIndexed: number;
|
|
37
|
+
indexSizeBytes: number;
|
|
38
|
+
}
|
|
39
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/indexing/types.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,MAAM,WAAW,QAAQ;IACvB,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,aAAa;IAC5B,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,KAAK,GAAG,WAAW,GAAG,QAAQ,CAAC;CACxC;AAED,MAAM,WAAW,gBAAgB;IAC/B,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,MAAM,wBAAwB,GAAG,CAAC,QAAQ,EAAE,gBAAgB,KAAK,IAAI,CAAC;AAE5E,MAAM,WAAW,UAAU;IACzB,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,EAAE,MAAM,CAAC;IACnB,gBAAgB,EAAE,MAAM,CAAC;IACzB,WAAW,EAAE,MAAM,CAAC;IACpB,cAAc,EAAE,MAAM,CAAC;CACxB"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/indexing/types.ts"],"names":[],"mappings":";AAAA;;GAEG"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* MCP (Model Context Protocol) Server Support
|
|
3
|
+
*
|
|
4
|
+
* MCP is an open protocol that lets AI models connect to external
|
|
5
|
+
* data sources and tools. Think of it as "USB for AI" — a standard
|
|
6
|
+
* way to plug in capabilities.
|
|
7
|
+
*
|
|
8
|
+
* How it works:
|
|
9
|
+
* 1. User configures MCP servers in .cdoing/mcp.json or settings
|
|
10
|
+
* 2. On startup, we connect to each configured server
|
|
11
|
+
* 3. Discover available tools from each server
|
|
12
|
+
* 4. Register those tools so the agent can call them
|
|
13
|
+
* 5. Route tool calls through the MCP protocol
|
|
14
|
+
*
|
|
15
|
+
* Configuration format (.cdoing/mcp.json):
|
|
16
|
+
* {
|
|
17
|
+
* "servers": [
|
|
18
|
+
* {
|
|
19
|
+
* "name": "jira",
|
|
20
|
+
* "command": "npx",
|
|
21
|
+
* "args": ["-y", "@modelcontextprotocol/server-jira"],
|
|
22
|
+
* "env": { "JIRA_URL": "https://..." }
|
|
23
|
+
* }
|
|
24
|
+
* ]
|
|
25
|
+
* }
|
|
26
|
+
*
|
|
27
|
+
* Learning note: MCP uses JSON-RPC over stdio or SSE (Server-Sent Events).
|
|
28
|
+
* Each server is a separate process that we spawn and communicate with
|
|
29
|
+
* through its stdin/stdout. This isolation means a buggy MCP server
|
|
30
|
+
* can't crash the main agent.
|
|
31
|
+
*/
|
|
32
|
+
export { McpManager, type McpServerConfig, type McpTool } from "./manager";
|
|
33
|
+
//# sourceMappingURL=index.d.ts.map
|